Перевод может содержать ошибки. Читайте первоисточник: Saving the RTOS Task Context
Назад: [Как работает FreeRTOS] | Вверх: [Как работает FreeRTOS] | Вперёд: [Как работает FreeRTOS] |
Каждая задача реального времени имеет свою собственную область памяти для стека, поэтому контекст можно сохранить, просто поместив регистры процессора в стек задачи. Сохранение контекста AVR это единственное место, где ассемблерный код неизбежен.
Сохранение контекста реализовано макросом portSAVE_CONTEXT(), исходный код которого приведён ниже:
/*----------------------------------------------------------------------------*/
#define portSAVE_CONTEXT() \ (0)
asm volatile ( \
"push r0 \n\t" \ (1)
"in r0, __SREG__ \n\t" \ (2)
"cli \n\t" \ (3)
"push r0 \n\t" \ (4)
"push r1 \n\t" \ (5)
"clr r1 \n\t" \ (6)
"push r2 \n\t" \ (7)
"push r3 \n\t" \
"push r4 \n\t" \
"push r5 \n\t" \
:
:
:
"push r30 \n\t" \
"push r31 \n\t" \
"lds r26, pxCurrentTCB \n\t" \ (8)
"lds r27, pxCurrentTCB + 1 \n\t" \ (9)
"in r0, __SP_L__ \n\t" \ (10)
"st x+, r0 \n\t" \ (11)
"in r0, __SP_H__ \n\t" \ (12)
"st x+, r0 \n\t" \ (13)
);
Пояснения к исходном коду:
Далее: Реализация FreeRTOS - Восстановление контекста