События как способ управления выполнением задач
В учебных программах, приведенных выше, задачи были реали-
зованы так, что они постоянно нуждались в процессорном времени.
Даже когда задача ничего не выводила на экран, она занималась от-
счетом времени с помощью пустого цикла for.
Такая реализация задачи целесообразна только при назначении за-
даче самого низкого приоритета. В противном случае наличие такой
постоянно готовой к выполнению задачи с довольно высоким прио-
ритетом приведет к тому, что другие задачи, имеющие более низкий
приоритет, никогда не будут выполняться.
Гораздо эффективнее управлять выполнением задач с помощью
событий. Управляемая событием задача выполняется только после
того, как некоторое событие произошло. Если событие не произошло
и задача ожидает его наступления, то она НЕ находится в состоя-
нии ГОТОВНОСТИ к выполнению, а следовательно, не может быть
выполнена планировщиком. Планировщик распределяет процес-
сорное время только между задачами, ГОТОВЫМИ к выполнению.
Таким образом, если высокоприоритетная задача ожидает наступле-
ния некоторого события, то есть не находится в состоянии готов-
ности к выполнению, то планировщик отдаст управление готовой
к выполнению более низкоприоритетной задаче.
Таким образом, применение событий для управления ходом выпол-
нения задач позволяет создавать программы с множеством различных
приоритетов задач, и программист может не опасаться того, что высо-
коприоритетная задача «заберет» себе все процессорное время.
Блокированное состояние задачи
Если задача ожидает наступления события, то она находится в бло-
кированном состоянии (рис. 5 в КиТ № 3`2011, стр. 111). Во FreeRTOS
существуют два вида событий:
1. Временное событие — это событие, связанное с истечением вре-
менного промежутка или наступлением определенного момента
абсолютного времени. Например, задача может войти в блокиро-
ванное состояние, пока не пройдет 10 мс.
2. Событие синхронизации (внешнее по отношению к задаче) — это
событие, которое генерируется в другой задаче или в теле обра-
ботчика прерывания МК. Например, задача блокирована, когда
ожидает появления данных в очереди. Данные в очередь поступают
от другой задачи.
События синхронизации могут быть связаны с множеством объек-
тов ядра, такими как очереди, двоичные и счетные семафоры, рекур-
сивные семафоры и мьютексы, которые будут описаны в дальнейших
публикациях.
Во FreeRTOS есть возможность заблокировать задачу, заставив ее
ожидать события синхронизации, но определить при этом тайм-аут
ожидания. То есть выход задачи из блокированного состояния возмо-
жен как при наступлении события синхронизации, так и по проше-
ствии времени тайм-аута, если событие синхронизации так и не про-
изошло. Например, задача ожидает появления данных из очереди.
Тайм-аут при этом установлен равным 10 мс. В этом случае выход
задачи из блокированного состояния возможен при выполнении
двух условий:
Данные в очередь поступили.
•
Данные не поступили, но вышло время тайм-аута, равное 10 мс.
•
Достарыңызбен бөлісу: |