[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [avr-gcc-list] assembly-c mix and interrupts
From: |
darkschine |
Subject: |
Re: [avr-gcc-list] assembly-c mix and interrupts |
Date: |
Sat, 28 Nov 2009 21:56:05 -0800 (PST) |
David Brown-4 wrote:
>
> So any function generated by the compiler, or compatible functions
> written in assembly by hand, can freely use the call-used registers
> (SREG, r18-r27, r30-r31) without preserving or restoring them. But if
> it wants to use the call-saved registers (r2-r17, r28-r29), it must save
> them on entry and restore them on exit.
>
> An interrupt routine must also preserve any call-used registers it
> needs, including SREG and r0. It must also preserve the current r1 and
> set it to 0 before certain compiler-generated code is executed. If the
> interrupt routine is going to call other functions, it must preserve
> /all/ the call-used registers, since the other functions may trash them.
> On the other hand, it does not need to preserve any of the call-saved
> registers, as the called function will preserve these as needed.
>
Thanks David. This was precisely the issue!
My interrupt routine was calling other functions but not preserving the
call-used registers.
my code was actually already written in C and looked something like:
ISR(vector){
interruptHandler();
}
The compiler does not make sure that all necessary registers are saved and
restored properly and apparently I am the first to notice this. I guess the
ISR preserves the call-used registers it uses, but does not preserve the
call-used registers that may be in use prior to the interrupt before
transfering control to the ignorant interruptHandler() function.
I wish I could say this was the end of my troubles.
char *test ="test";
writeChar(test[0]);
writeChar(test[1]);
writeChar('x');
waitForInput();
The output on the LCD is "\0\0x"
but put in another function in the same file, the output is "tex" as
expected! I'm starting to wish I wrote the whole thing in assembly! ;)
Can anyone suggest a possible cause for this problem?
--
View this message in context:
http://old.nabble.com/assembly-c-mix-and-interrupts-tp26421328p26559564.html
Sent from the AVR - gcc mailing list archive at Nabble.com.
- [avr-gcc-list] assembly-c mix and interrupts, darkschine, 2009/11/19
- Re: [avr-gcc-list] assembly-c mix and interrupts, Julius Luukko, 2009/11/19
- Message not available
- Re: [avr-gcc-list] assembly-c mix and interrupts, Julius Luukko, 2009/11/20
- [avr-gcc-list] Re: assembly-c mix and interrupts, David Brown, 2009/11/20
- Re: [avr-gcc-list] assembly-c mix and interrupts,
darkschine <=
- Re: [avr-gcc-list] assembly-c mix and interrupts, Joerg Wunsch, 2009/11/30
- Re: [avr-gcc-list] assembly-c mix and interrupts, darkschine, 2009/11/30
- RE: [avr-gcc-list] assembly-c mix and interrupts, Weddington, Eric, 2009/11/30
- RE: [avr-gcc-list] assembly-c mix and interrupts, darkschine, 2009/11/30
- Re: [avr-gcc-list] assembly-c mix and interrupts, Paul Stoffregen, 2009/11/30
- RE: [avr-gcc-list] assembly-c mix and interrupts, darkschine, 2009/11/30
RE: [avr-gcc-list] assembly-c mix and interrupts, Weddington, Eric, 2009/11/19
Re: [avr-gcc-list] assembly-c mix and interrupts, Ruud Vlaming, 2009/11/19
[avr-gcc-list] Re: assembly-c mix and interrupts, David Brown, 2009/11/19
Re: [avr-gcc-list] assembly-c mix and interrupts, Erik Christiansen, 2009/11/20