You are here

Восстановление контекста задачи ОС

Перевод может содержать ошибки. Читайте первоисточник: 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)
);

Пояснения к исходному коду:

  • (1 и 2) Во FreeRTOS по адресу из указателя pxCurrentTCB находится структура, в которой первое поле является указателем на стек задачи. Загружаем указатель на структуру в регистровую пару X.
  • (3) Извлекаем и восстанавливаем младший байт указателя стека.
  • (4) Извлекаем и восстанавливаем старший байт указателя стека.
  • Извлекаем из стека регистры процессора R31-R1 в порядке убывания номера.
  • (5 и 6) Извлекаем из стека и восстанавливаем значение регистра состояния, используя для промежуточного хранения регистр R0.
  • (7) Восстанавливаем значение регистра R0.

Далее: Реализация FreeRTOS - Собираем всё вместе: детальный пример

Hobby's category: