Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
3555
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Запуск FreeRTOS

641

Рисунок 14: Как решить проблему инверсии приоритетов, временно увеличивая приоритет ThreadL

23.6.1.2.Рекурсивные мьютексы

Иногда случается, особенно когда наше приложение фрагментировано в нескольких API-интерфейсах, что поток случайно получает мьютекс более одного раза. Поскольку мьютекс может быть получен только один раз, любая последующая попытка того же потока получить тот же мьютекс вызовет взаимоблокировку (потому что последовательный вызов osMutexWait() переведет поток в состояние «заблокирован», но это единственный поток, который может выпустить мьютекс).

Чтобы предотвратить это нежелательное поведение, FreeRTOS вводит понятие рекурсивных мьютексов (recursive mutexes), то есть мьютексов, которые могут быть получены более одного раза. Очевидно, что рекурсивный мьютекс должен быть выпущен столько раз, сколько он был получен. Поскольку API-интерфейс CMSIS-RTOS не предоставляет APIфункций для обработки рекурсивных мьютексов, мы не будем вдаваться в подробности данной темы. Вы можете обратиться к документации FreeRTOS33 для получения дополнительной информации об этом.

23.6.2. Критические секции

Иногда, особенно когда нам нужно выполнить достаточно быструю операцию с разделяемым ресурсом, лучше вообще избегать использования примитивов синхронизации. Как было показано ранее, в нашем приложении достаточно легко ввести странное поведение, если мы не обработаем с особым вниманием конструкции синхронизации, предлагаемые ОСРВ.

Критические секции (critical sections) – это способ защитить доступ к разделяемым ресурсам. Критическая секция – это область кода, которая выполняется после запрета всех прерываний. Поскольку вытеснение задач происходит внутри ISR (ISR таймера, выбранного в качестве генератора временного отсчета), запретив все ISR, мы уверены, что никакой другой код не будет препятствовать выполнению кода внутри критической секции.

...

__disable_irq();

//Все IRQ запрещены, и мы уверены, что следующий код не будет вытеснен

...

//Здесь критический код

33 http://www.freertos.org/RTOS-Recursive-Mutexes.html