crDELAY(xHandle, 0) сопрограмма переходит
в состояние готовности к выполнению, а в со-
стояние выполнения переходит другая сопро-
грамма, приоритет которой выше или равен
приоритету вызывающей сопрограммы.
Посредством вызова crDELAY(xHandle, 0)
происходит принудительное переключение
на другую сопрограмму, что было продемон-
стрировано в учебной программе № 1.
Следует отметить, что применительно
к сопрограммам не существует аналога API-
функции vTaskDelayUntil(), которая пред-
назначена для вызова из задач и позволя-
ет организовать циклическое выполнение
какого-либо действия со строго заданным пери-
одом. Также отсутствует аналог API-функции
xTaskGetTickCount(), которая позволяет полу-
чить текущее значение счетчика квантов.
использование очередей
в сопрограммах
Как известно, очереди во FreeRTOS пред-
ставляют собой базовый механизм межзадач-
ного взаимодействия, на механизме очередей
основываются такие объекты ядра, как сема-
форы и мьютексы.
FreeRTOS допускает использование очере-
дей и в сопрограммах, но в этом случае су-
ществует одно серьезное ограничение: одну
и ту же очередь нельзя использовать для пере-
дачи сообщений от очереди к сопрограмме
и наоборот. Допускается лишь передача сооб-
щений между сопрограммами и обработчика-
ми прерываний. Когда очередь создана, ее сле-
дует использовать только в задачах или только
в сопрограммах. Эта особенность существен-
но ограничивает возможности совместного
использования задач и сопрограмм.
Следует учитывать, что для сопрограмм набор
API-функций для работы с очередями гораздо
беднее набора API-функций для задач. Для со-
программ нет аналогов следующих API-функций:
1) uxQueueMessagesWaiting() — получение
количества элементов в очереди.
2) xQueueSendToFront() — запись элемента
в начало очереди.
3) xQueuePeek() — чтение элемента из очере-
ди без удаления его из очереди.
4) xQueueSendToFrontFromISR() — запись
элемента в начало очереди из обработчика
прерывания.
Достарыңызбен бөлісу: |