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

Запуск FreeRTOS

638

23.5.3. Сигналы потоков

Пример 4 можно переорганизовать, чтобы использовать возможность, более подходящую для такого рода приложений: сигналы (signals). Сигналы используются для запуска состояний выполнения между потоками или между ISR и потоками. Функции управления сигналами в CMSIS-RTOS позволяют вам контролировать или ждать флаги сигналов. Каждый поток имеет до 31 назначенных флагов сигналов. Однако фактическое максимальное количество флагов сигналов определяется в файле cmsis_os.h макросом osFeature_Signals. Во FreeRTOS сигналы называются уведомлениями задач (task notifications) и являются необязательной функцией, доступной, если макрос config_USE_TASK_NO-

TIFICATIONS в файле FreeRTOSConfig.h установлен и равен 1.

Сигналы имеют свои преимущества и недостатки: они быстрее семафоров и требуют меньше оперативной памяти, но их нельзя использовать для обмена данными между потоками, и их нельзя использовать для одновременного запуска нескольких потоков.

Если мы хотим запустить сигнал потока, мы должны установить его с помощью функции

int32_t osSignalSet(osThreadId thread_id, int32_t signals);

где параметр thread_id – идентификатор потока, а signal – идентификатор сигнала, который мы хотим запустить. Как только сигнал установлен, он остается в этом состоянии до тех пор, пока мы явно не сбросим его с помощью функции

int32_t osSignalClear(osThreadId thread_id, int32_t signals);

Поток можно перевести в состояние «заблокирован» с ожиданием сигнала при помощи функции

osEvent osSignalWait(int32_t signals, uint32_t millisec);

где параметр millisec представляет собой тайм-аут (время ожидания).

23.6. Управление ресурсами и взаимное исключение

Во встроенных приложениях довольно часто требуется доступ к аппаратным ресурсам. Например, предположим, что мы используем периферийное устройство UART для записи отладочных сообщений на консоль и предположим, что наше приложение состоит из нескольких потоков, которые могут печатать сообщения с помощью процедуры HAL_UART_Trasmit(). Если помните, в Главе 8 мы видели, что, когда мы используем UART

врежиме опроса, байты, содержащиеся в сообщении, которое мы собираемся передать, передаются по одному в регистр данных UART (Data Register, DR). Это довольно «медленная процедура» по сравнению с количеством действий, которые ОСРВ может выполнять

вединицу времени. Это означает, что, если два потока вызывают HAL_UART_Trasmit(), то они могут перезаписать содержимое буферного регистра.