Sorry all, I missed dlc's later post. Best regards,
Stu Bell DataPlay (DPHI, Inc.) > -----Original Message----- > From: avr-gcc-list-bounces+sbell=dataplay....@nongnu.org > [mailto:avr-gcc-list-bounces+sbell=dataplay....@nongnu.org] > On Behalf Of Stu Bell > Sent: Tuesday, December 30, 2008 9:13 AM > To: Dave Hylands; dlc > Cc: avr-gcc List > Subject: RE: [avr-gcc-list] On getting an ISR leaner with GCC > > If you look in the avr-libc manual under Frequently Asked > Questions you can find FAQ #3: "How to permanently bind a > variable to a register". > That allows you to assign particular registers to variables, > although care must be used when using the avr-libc library functions. > > I agree with Dave that calling functions in an ISR is a > particularly bad idea if youwant to save cycles. But I would > also start looking at what you are trying to do and see if > there was some other way to do it. 10 uS is not much time - > 160 cycles at 16 MHz. Is there some way to either slow the > interrupts down or to assign some timer function to the duty? > If all you are doing is counting, tying the signal to one of > the counter clock lines allows you to count wihtout > interrupting the processor. If this is a small function in a > large application, allocating registers will be difficult > since you will need to export the assigned variable (and it's > register assignment) to all code modules. You might also > want to look at the Event function in the Xmega series. > > You can also declare the ISR "naked" which will cause the > prologue/epilogue to be omitted, but then the onus of saving > only those registers needed falls to you. If the ISR is > simple, as you said, a little assembly might be just the trick. > > Best regards, > > Stu Bell > DataPlay (DPHI, Inc.) > > > > > > The subject says it all. I've an ISR that is using too > many cycles > > > for something that kicks every 10us. I'm very > experienced with the > > > PIC and know how to specify registers that are not > touched outside > > > of the ISR to avoid lots of "push-n-pop" actions. > > > Is there something like that in the AVR toolchain or am I > going to > > > have to resort to assembly to get this thing leaned down? > I'd like > > > to create some memory that is dedicated to the ISR such that the > > > compiler knows that it doesn't need to be saved. Also a way to get > scratchpad memory > > > assigned to it for some basic math that I don't want to > have to use > > > the overhead of push/pop. Can anyone offer insight into > how I can > > > lean an ISR down or what sorts of operations or memory > > types to avoid there with avr-gcc? > > > > In my experience, the number one thing to do to make ISRs > leaner is to > > avoid function calls from within the ISR. inline function calls are > > ok, it's the ones to an external function that isn't. You > just have to > > look at the assembly code generated to see the difference. > > > > If the ISR doesn't do any function calls, then it will only > push/pop > > the bare minimum of registers. If the ISR has to do a > function call, > > then it needs to push/pop all of the registers that "any old" C > > function might touch. > > > _______________________________________________ > AVR-GCC-list mailing list > AVR-GCC-list@nongnu.org > http://lists.nongnu.org/mailman/listinfo/avr-gcc-list > _______________________________________________ AVR-GCC-list mailing list AVR-GCC-list@nongnu.org http://lists.nongnu.org/mailman/listinfo/avr-gcc-list