Hi all,
I have been focused on a problem for three days. My program does not work if compiled with -Os in Ubuntu Linux 8.10 (Avr Gcc 4.3.0), but works if compiled with -Os in Windows+WinAVR(20080512). After quite a long time of digging, I found that a piece of code does not work correctly where there is also a lot of USART1_TX_vect interrupts. I compared the assembly code generated in two condition (Linux and Windows) and found that the ISR(USART1_TX_vect) function of Linux version save fewer registers than that of Windows Version, and so does ISR(USART1_RX_vect) function. The ISR(USART1_TX_vect) function in Windows saves all call-used registers (r18-r27, r30-r31) while the Linux one neglects r21. Since there are function calls in the ISR function, I expected that all call-used registers should be saved. And the function ISR(USART1_RX_vect) in Linux saves even fewer registers. I think this might be the cause of the strange bug. Does anyone have a comprehensive understanding on it?
_______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list