Dear SDCC developers, I found a bug when I tried to compile a code for pic16F1938. (14 bit enhanced core)
The problem is: The optimizer breaks the code. Makes part of the code unreachable. Error message is: test.c:51: warning 110: conditional flow changed by optimizer: so said EVELYN the modified DOG test.c:52: warning 126: unreachable code The compiler has problem with this line in the interrupt routine: "if ((irx1tmp & 0x01) != 0) {" Compiler thinks, the condition is always false, but it is not true. irx1tmp contains the received byte from serial port. By the way: How to disable optimizations? What kind of optimizations are enabled by default? Compilation: sdcc -S -mpic14 -p16f1938 -I. test.c Version: SDCC : mcs51/gbz80/z80/z180/r2k/ds390/pic16/pic14/TININative/ds400/hc08 3.1.1 #7 148 (Jan 3 2012) (MINGW32) Here is my demonstration code: ---------------------------------------- // This code has an error with SDCC. Compiles well with HTC. #include "pic16f1938.h" // Configuration: 8MHz crystal, PLL (x4 = 32MHz), WDT disabled, Flash self write disabled. unsigned short __at(_CONFIG1) config1Reg = (_FCMEN_OFF & _IESO_OFF & _BOREN_ON & _CPD_ON & _CP_ON & _MCLRE_OFF & _PWRTE_ON & _WDTE_OFF & _FOSC_HS); unsigned short __at(_CONFIG2) config2Reg = (_LVP_ON & _BORV_HI & _STVREN_ON & _PLLEN_ON & _WRT_ALL); static unsigned char irx1tmp, doLedChange, ledState; void _sdcc_gsinit_startup(void) { // Entry point required by sdcc. //__asm pagesel _main __endasm; __asm goto _main __endasm; } void Intr(void) __interrupt 0 { if (RCIF) { // UART interrupt: Byte arrived irx1tmp = RCREG; if ((irx1tmp & 0x01) != 0) { ledState = 0; } else { ledState = 1; } doLedChange = 1; } } void main (void) { doLedChange = 0; ledState = 0; TRISA = 0b00000000; TRISC = 0b11000000; LATA = 0x00; LATC = 0x00; // UART configuration BAUDCON = 0; SPBRGL = 207; // 9600 Baud, 32MHz SPBRGH = 0; TXSTA = 0b00100100; // TXEN = 1, BRGH = 1 RCSTA = 0b10010000; // CREN = 1 (receiver enable), SPEN = 1 (SPEN = Serial port enable) RCIE = 1; // Enable serial port receive interrupt PEIE = 1; // Enable peripheral interrupts. Needed for uart GIE = 1; // Global interrupt enable while (1) { if (doLedChange) { doLedChange = 0; if (ledState) { LATA = 0x00; } else { LATA = 0x20; } } } } ------------------------------------------------------------------------------ Keep Your Developer Skills Current with LearnDevNow! The most comprehensive online learning library for Microsoft developers is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3, Metro Style Apps, more. Free future releases when you subscribe now! http://p.sf.net/sfu/learndevnow-d2d _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user