avr-gcc-list
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [avr-gcc-list] On getting an ISR leaner with GCC


From: Stu Bell
Subject: RE: [avr-gcc-list] On getting an ISR leaner with GCC
Date: Tue, 30 Dec 2008 09:16:45 -0700

Sorry all, I missed dlc's later post.

Best regards, 

Stu Bell 
DataPlay (DPHI, Inc.) 

 

> -----Original Message-----
> From: address@hidden 
> [mailto:address@hidden 
> 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
> address@hidden
> http://lists.nongnu.org/mailman/listinfo/avr-gcc-list
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]