#define portRESTORE_CONTEXT() \ asm volatile ( "lds r26, pxCurrentTCB \n\t" \ (1) "lds r27, pxCurrentTCB + 1 \n\t" \ (2) "ld r28, x+ \n\t" \ "out __SP_L__, r28 \n\t" \ (3) "ld r29, x+ \n\t" \ "out __SP_H__, r29 \n\t" \ (4) "pop r31 \n\t" \ "pop r30 \n\t" \
: : :
"pop r1 \n\t" \ "pop r0 \n\t" \ (5) "out __SREG__, r0 \n\t" \ (6) "pop r0 \n\t" \ (7) );Referring to the code above:
- The FreeRTOS pxCurrentTCB variable holds the address from where the tasks stack pointer can be retrieved. This is loaded into the X register (1 and 2).
- The stack pointer for the task being resumed is loaded into the AVR stack pointer, first the low byte (3), then the high nibble (4).
- The processor registers are then popped from the stack in reverse numerical order, down to R1.
- The status register stored on the stack between registers R1 and R0, so is restored (6) before R0 (7).
Next: RTOS Implementation - Putting It All Together