134
КОМПОНЕНТЫ И ТЕХНОЛОГИИ •
№ 8 '2011
компоненты
микроконтроллеры
Участки кода, находящиеся внутри кри-
тической секции, должны быть как можно
короче и выполняться как можно быстрее.
Иначе использование
критических сек-
ций негативно скажется на времени реакции
системы на прерывания.
FreeRTOS допускает вложенный вызов ма-
кросов
taskENTER_CRITICAL() и
taskEXIT_
CRITICAL(), их реализация позволяет со-
хранять глубину вложенности. Выход про-
граммы из критической секции происходит,
только если глубина вложенности станет
равной нулю. Каждому вызову
taskENTER_
CRITICAL() должен соответствовать вызов
taskEXIT_CRITICAL().
Пример использования критической секции:
/* Чтобы доступ к порту PORTA не был прерван никакой другой
задачей, входим в критическую секцию. */
taskENTER_CRITICAL();
/* Переключение на другую задачу не может произойти, когда
выполняется код, окруженный вызовом taskENTER_CRITICAL()
и taskEXIT_CRITICAL().
Прерывания здесь могут происходить, только если микро-
контроллер допускает вложение прерываний. Прерывание
выполнится, если его приоритет выше константы configMAX_
SYSCALL_INTERRUPT_PRIORITY. Однако такие прерывания не
могут вызывать FreeRTOS API-функции. */
PORTA |= 0x01;
/* Неатомарная операция чтение/модификация/запись завершена.
Сразу после этого выходим из критической секции. */
taskEXIT_CRITICAL();
Рассматривая пример выше, следует от-
метить, что если внутри критической сек-
ции произойдет прерывание с приоритетом
выше
configMAX_SYSCALL_INTERRUPT_
PRIORITY, которое, в свою очередь, обратит-
ся к порту PORTA, то принцип взаимного ис-
ключения доступа к ресурсу будет нарушен.
Достарыңызбен бөлісу: