[En-Nut-Discussion] NutThreadSwitch and debug build

Pete Allinson pete at peteallinson.plus.com
Wed Feb 9 18:41:16 CET 2005


I decided to make a debug build of Nut/OS by altering the CPFLAGS to 
include -g and no optimisation.
But this led to a problem in NutThreadSwitch as the compiler introduced 
some prologue and epilogue code:

<unwanted prologue>
     push r28
     push r29
     in r28, 0x3d
     in r29, 0x3e
</unwanted prologue>
     push r2
     push r3
     push r4
     ... etc ...
     ... etc ...
     pop r4
     pop r3
     pop r2
<unwanted epilogue>
     pop r29
     pop r28
</unwanted epilogue>

As you can imagine, the epilogue and prologue mess up thread switching.

I fixed the problem by adding "__attribute__ ((naked)" to the declaration 
for NutThreadSwitch thus:

void NutThreadSwitch(void) __attribute__ ((noinline)) __attribute__ ((naked));

and putting a "ret" instruction in the second asm statement, thus:

                   "pop r4" "\n\t"
                   "pop r3" "\n\t"
                   "pop r2" "\n\t"
                   "ret" "\n\t"::"r" (runningThread->td_sp), "I" 

I'm running Nut/OS 3.9.2 and WinAVR with avr-gcc version 3.3.1 on an 
Ethernut 2.1b.
I've not tested other configurations for any similar problem.

BTW.  I notice that some code, eg NutInit(), writes to 0x005D to set the 
ATmega128 stack pointer, whereas other code, eg NutThreadSwitch(), writes 
to 0x003D to do this.
Is this anything to do with the different instruction used in each case - 
out .v. sts ?

Pete Allinson

More information about the En-Nut-Discussion mailing list