Hi Lin (and Dennis), >> And the function ISR(USART1_RX_vect) in Linux saves even fewer registers. > > The solution is to NOT call functions from within your ISR. That is just > evil. Get your data in the ISR, put it in a mailbox or buffer and have a > regularly scheduled function handle the details from outside the ISR. I > like to use ring buffers to store data from an ISR. When using the ring > buffer the ISR modifies the "write" pointer, not the read pointer and the > processing function outside the ISR modifies the read pointer and not the > write pointer. This means that those pointers don't need "push/popped" in > the ISR either.
And here's some code that implements such a ring buffer. As David Kelly points out, as long as the index type is uint8_t, then nothing special is required (which for this particular implementation means that buffers upto 128 entries would be supported) <http://websvn.hylands.org/filedetails.php?repname=Projects&path=%2Fcommon%2FCBUF.h&rev=0&sc=0> It's important that the queue be declared volatile (as myQ is in the sample). -- Dave Hylands Shuswap, BC, Canada http://www.DaveHylands.com/ _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list