[Top][All Lists]
[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
>