Компоненты и технологии • №2 '2011 компоненты



Pdf көрінісі
бет67/129
Дата28.09.2023
өлшемі4.1 Mb.
#478975
1   ...   63   64   65   66   67   68   69   70   ...   129
Kurniz

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. Это 
будет свидетельствовать о том, что двоичный 
семафор в отличие от счетного не может за-
фиксировать более одного события.


Достарыңызбен бөлісу:
1   ...   63   64   65   66   67   68   69   70   ...   129




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет