Как ядро ​​FreeRTOS приостанавливает задачу в Arduino UNO? - PullRequest
0 голосов
/ 25 апреля 2019

Существует библиотека FreeRTOS для Arduino , предназначенная даже для запуска в UNO.

Я пытаюсь понять, как работает многозадачная операционная система на таком ограниченном оборудовании. Я понимаю принципы планирования / переключения задач, но как ядро ​​фактически приостанавливает задачу, чтобы выполнить другую? Как он прерывает (а затем возобновляет) исполняемый в данный момент код?

Я предполагаю, что запланированный ISR (таймер) напрямую изменяет стек, чтобы изменить указатель инструкций, но если он делает это, ему нужно сделать копию стека и зарегистрироваться перед переключением задач, а затем восстановить стек текущей задачи. / регистрируется перед возобновлением выполнения. Мне не ясно, как это могло бы быть сделано.

Может ли ядро ​​FreeRTOS переключать задачи, например, при вызове функции Serial.println() (или при любом вызове, не включающем cli()), и если да, то как он это делает?

Спасибо за любые разъяснения.

1 Ответ

1 голос
/ 03 мая 2019

Я предполагаю, что запланированный ISR (таймер) напрямую изменяет стек, чтобы изменить указатель инструкций, но если он делает это, ему необходимо сделать копию стека и зарегистрироваться перед переключением задач, а затем восстановить стек текущей задачи. / регистрируется перед возобновлением выполнения. Мне не ясно, как это будет сделано.

Ваше предположение верно. Если вы посмотрите на port.c, то увидите, что FreeRTOS makros portSAVE_CONTEXT и portRESTORE_CONTEXT являются push соответствующими pops всеми регистрами текущей запущенной задачи для выполнения переключения задачи , Кроме того, прерывание сторожевого таймера используется для запуска планировщика.

Пока этот сторожевой таймер включен и запускается, переключение задач может происходить в любое время. Таким образом, переключение также может произойти во время любого вызова функции, например Serial.println. Это означает, что если вы вызываете эту функцию из нескольких задач, вы рано или поздно повредите свой вывод последовательного потока.

...