From: Geoffrey Wossum (geoffrey_at_pager.net)
Date: 2003-11-22 21:13:07
On Saturday 22 November 2003 05:54 am, Ullrich von Bassewitz wrote: > I have currently no idea how to change that without removing functionality. > Not the best idea, but at least a workaround to prevent people from falling > into this problem would be to remove the RTI instruction from the inline > assembler, so one will have to use the external assembler for interrupt > handlers. Better ideas anyone? An immediate work-around to the problem for the person having the problem would be to separate the ISR into a separate source file, and compile it without optimization. The rest of the code could be compiled with optimizations on. For gcc on the AVR microcontrollers, there's an __interrupt__ attribute that is used for ISR's, which insures that proper prologue and epilogue code is generated. When writing ISR's for avr-gcc, two macros are provided, INTERRUPT and SIGNAL. They're virtually identical, except INTERRUPT re-enables global interrupts right after the prologue code. There's also names for every possible interrupt vector, such as SIG_UART0_RECV, which translates to something like __vector11. So to write an ISR in C using avr-gcc, you write: SIGNAL(SIG_UART0_RECV) { /* handle interrupt */ } which would expand to something like: void __vector11(void) __attribute__ ((interrupt)); void __vector11(void) { /* handle interrupt */ } Since all the ISR's have well known names due to macros, the linker can then also go ahead and build the interrupt vector table for you. Since GNU ld supports weak references, the linker will fill in a do nothing ISR in the IVT for any vectors your code does not define. Probably not trivial to add functionality like this into cc65, but it is ever so nice to use. Not sure how many people write ISR's for cc65 programs either, although I for one will almost always be writing ISR's when using cc65. Another possibility is to define prologue and epilogues macros that have to be used in ISR's. gcc for the Palm did something similar to this as a workaround measure when writing PalmOS callbacks. I guess the macro would have to something to trick the compiler optimizer, like having a couple of returns at the end or something. It'd probably waste a few more instructions than adding an attribute to the compiler, but it'd be fast to implement, assuming you could trick the optimizer. --- Geoffrey Wossum Software Engineer Long Range Systems - http://www.pager.net ---------------------------------------------------------------------- To unsubscribe from the list send mail to majordomo_at_musoftware.de with the string "unsubscribe cc65" in the body(!) of the mail.
This archive was generated by hypermail 2.1.3 : 2003-11-22 21:22:33 CET