Перевод может содержать ошибки. Читайте первоисточник: Restoring the Context
Назад: [Как работает FreeRTOS] | Вверх: [Как работает FreeRTOS] | Вперёд: [Как работает FreeRTOS] |
Макрос portRESTORE_CONTEXT() является обратным к макросу portSAVE_CONTEXT(). Контекст возобновляемой задачи ранее был сохранён в стеке. Ядро реального времени извлекает указатель стека для задачи, а затем возвращает сам контекст в соответствующие регистры процессора.
/*----------------------------------------------------------------------------*/
#define portRESTORE_CONTEXT() \ (0)
asm volatile ( \
"lds r26, pxCurrentTCB \n\t" \
"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)
);
Пояснения к исходному коду:
Далее: Реализация FreeRTOS - Собираем всё вместе: детальный пример