From: Olivier O. <oli...@an...> - 2000-06-29 08:10:15
|
Hi all! I've got a problem with a piece of code. I use SDCC version 2.2.0 on a NT platform. The problem is folowing char I2C_trans(void) { I2C_status = I2C_RUN; STA = 1; /* make start */ while( I2C_status == I2C_RUN ) ; return I2C_status; } I2C_status is a global var, that is modified by an interrupt routine. So I may not stay locked in the loop. But There is a faulty optimisation that makes my 'while' go to a permanet loop without test! Complete code is included here for you to test. Second, what does this message mean ???? i2c_552.c(42):warning *** conditional flow changed by optimizer 'i2c_552.c(40)': so said EVELYN the modified DOG I know it is no easy to make a good documentation, but there is no error or warnig reference in the manual. Thanks for your reading, Sincerely O.ORTIGUES (France) Here is the code, and the .lst produced for the function. #include "reg552.h" char I2C_own_address; /* C552 own address on I2C */ char I2C_slave; /* current slave address */ char I2C_nbbyte; /* nbr of byte to transfert */ char I2C_nbbyte_bk; /* backup on bus error */ char I2C_status; /* status for end of transmission */ #define I2C_OK 1 #define I2C_NOACK 2 #define I2C_LOST 3 #define I2C_BERR 4 #define I2C_RUN 9 idata char I2C_buffer[10]; char *I2C_ptr; #include <stdio.h> void S1_int(void) interrupt 5 using 0 { switch(S1STA) { case 0x08: I2C_status = I2C_OK; break; } } /* Set start condition and wait for end of data transfert */ char I2C_trans(void) { I2C_status = I2C_RUN; STA = 1; /* make start */ while( I2C_status == I2C_RUN ); return I2C_status; } void main(void) { I2C_trans(); } /* END OF CODE */ LST : 476 ; ----------------------------------------- 477 ; function I2C_trans 478 ; ----------------------------------------- 005D 479 _I2C_trans: 480 ; i2c_552.c 36 005D 75*04 09 481 mov _I2C_status,#0x09 482 ; i2c_552.c 38 0060 D2 DD 483 setb _STA 484 ; i2c_552.c 40 0062 485 00101$: /* Here is the guilty */ 0062 02s00r62 486 ljmp 00101$ 487 ; i2c_552.c 42 0065 488 00104$: 0065 489 C$i2c_552.c$43$1$1 ==. 0065 490 XG$I2C_trans$0$0 ==. 0065 22 491 ret 0066 492 G$main$0$0 ==. 493 ; i2c_552.c 46 |