использование очередей
в обработчиках прерываний
Как было показано выше, семафоры пред-
назначены для передачи факта наступления
события между задачами и прерываниями.
Очереди же можно использовать как для пе-
редачи событий, так и для передачи данных.
Ранее [2, КиТ № 6] мы говорили об API-
ф у н к ц и я х д л я р а б о т ы с о ч е р е д я м и :
xQueueSendToFront(), xQueueSendToBack()
и xQueueReceive(). Использование их вну-
три тела обработчика прерывания приведет
к краху программы. Для этого существу-
ют версии этих функций, предназначен-
ные для вызова из обработчиков пре-
рываний: xQueueSendToFrontFromISR(),
x Q u e u e S e n d T o B a c k F r o m I S R ( )
и xQueueReceiveFromISR(), причем вы-
зов их из тела задачи запрещен. API-
ф у н к ц и я x Q u e u e S e n d F r o m I S R ( ) я в -
ляется полным эквивалентом функ-
ции xQueueSendToBackFromISR().
Функции xQueueSendToFrontFromISR(),
xQueueSendToBackFromISR() служат для запи-
си данных в очередь и отличаются лишь тем,
что первая помещает элемент в начало очере-
ди, а вторая — в конец. В остальном их поведе-
ние идентично.
Рассмотрим их прототипы:
portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle
x Q u e u e , v o i d * p v I t e m T o Q u e u e p o r t B A S E _ T Y P E
*pxHigherPriorityTaskWoken );
portBASE_TYPE xQueueSendToBackFromISR( xQueueHandle
x Q u e u e , v o i d * p v I t e m T o Q u e u e p o r t B A S E _ T Y P E
*pxHigherPriorityTaskWoken );
Аргументы и возвращаемое значение:
1. xQueue — дескриптор очереди, в которую
будет записан элемент. Дескриптор очере-
ди может быть получен при ее создании
API-функцией xQueueCreate().
2. pvItemToQueue — указатель на элемент, ко-
торый будет записан в очередь. Размер эле-
мента зафиксирован при создании очереди,
так что для побайтового копирования эле-
мента достаточно иметь указатель на него.
3. pxHigherPriorityTaskWoken — значение
Достарыңызбен бөлісу: |