xSemaphoreGiveFromISR() — выдача семафо-
ра, соответственно, из задачи и из обработ-
чика прерывания.
Продемонстрировать работу со счетными
семафорами можно слегка модифициро-
вав учебную программу № 1, приведенную
выше. Изменению подвергнется функция,
реализующая прерывание:
/*-----------------------------------------------------------*/
/* Обработчик прерывания */
static void __interrupt __far vExampleInterruptHandler( void )
{
static portBASE_TYPE xHigherPriorityTaskWoken;
xHigherPriorityTaskWoken = pdFALSE;
/* Отдать семафор задаче-обработчику несколько раз.
Таким образом симулируется быстро следующая группа
событий, с которыми связано прерывание. Первая выдача
разблокирует задачу-обработчик. Последующие будут
“запомнены” счетным семафором и обработаны позже.
“Потери” событий не происходит. */
x S e m a p h o r e G i v e F r o m I S R ( x B i n a r y S e m a p h o r e ,
&xHigherPriorityTaskWoken );
x S e m a p h o r e G i v e F r o m I S R ( x B i n a r y S e m a p h o r e ,
&xHigherPriorityTaskWoken );
x S e m a p h o r e G i v e F r o m I S R ( x B i n a r y S e m a p h o r e ,
&xHigherPriorityTaskWoken );
if( xHigherPriorityTaskWoken == pdTRUE )
{
/* Макрос, выполняющий переключение контекста.
* На других платформах имя макроса может быть другое! */
portSWITCH_CONTEXT();
}
}
API-функцию создания двоичного сема-
фора в главной функции main():
/* Перед использованием семафор необходимо создать. */
vSemaphoreCreateBinary(xBinarySemaphore);
следует заменить функцией создания счетно-
го семафора:
/* Перед использованием счетный семафор необходимо создать.
Семафор сможет обработать максимум 10 событий. Начальное
значение = 0. */
xBinarySemaphore = xSemaphoreCreateCounting( 10, 0 );
В модифицированном варианте искус-
ственно создаются три быстро следующих
друг за другом события. Каждому событию
соответствует операция выдачи (инкремен-
та) счетного семафора. Задача-обработчик,
как и ранее, обрабатывает события, выполняя
операцию захвата (декремента) семафора.
Результат выполнения модифицированной
учебной программы № 1 приведен на рис. 9.
Судя по результатам работы (рис. 9), все
три события были обработаны задачей-
обработчиком. Если же изменить тип исполь-
зуемого в программе семафора на двоичный,
то результат выполнения программы не бу-
дет отличаться от приведенного на рис. 4. Это
будет свидетельствовать о том, что двоичный
семафор в отличие от счетного не может за-
фиксировать более одного события.
Достарыңызбен бөлісу: |