RTOS интерфейс
CMSIS-RTOS2 это основной API интерфейс для RTOS ядра. Программисты вызывают CMSIS-RTOS2 API функции в пользовательском коде чтобы обеспечить максимальную переносимость от одной RTOS к другой. Middleware (промежуточное ПО) использующие преимущество этого подхода избегают ненужных усилий портирования кода.
Структура CMSIS-RTOS API
Типичная реализация интерфейса CMSIS-RTOS2 API связана с существующим ядром реального времени. API CMSIS-RTOS2 предоставляет следующие атрибуты и функциональные возможности:
- Названия функций, идентификаторы и параметры являются интуитивные и понятные. Функции мощные и гибкие, что уменьшает количество функций, доступных пользователю.
- Функции управления потоком позволяют вам определять, создавать и управлять потоками.
- Процедура обслуживания прерывания (ISR) может вызывать некоторые CMSIS-RTOS функции. Когда функция CMSIS-RTOS не может быть вызвана из контекста ISR, она отклоняет вызов и возвращает код ошибки.
-
Три разных типа событий поддерживают связь между несколькими потоками и/или ISR:
- Флаги потока: может использоваться для указания специфичных условий потоку.
- Флаги событий: может использоваться для указания событий в поток или ISR.
- Сообщения: могут быть отправлены в поток или ISR. Сообщения буферизуются в очереди.
- Функции управления мютексами и семафорами так же имеется.
-
Время процессора можно планировать со следующей функциональностью:
- Параметр тайм-аута включен во многие функции CMSIS-RTOS, чтобы избежать блокировки системы. Когда задан тайм-аут, система ожидает, пока ресурс не будет доступен или произойдет событие. Пока идет ожидание, другие потоки обрабатываются планировщиком.
- Функции osDelay и osDelayUntil помещают поток в состояние WAITING(ожидание) на указанное время.
- OsThreadYield обеспечивает совместное поточное переключение (кооперативное) и передает выполнение другому потоку с тем же приоритетом.
- Параметр тайм-аута включен во многие функции CMSIS-RTOS, чтобы избежать блокировки системы. Когда задан тайм-аут, система ожидает, пока ресурс не будет доступен или произойдет событие. Пока идет ожидание, другие потоки обрабатываются планировщиком.
- Функции Управления таймерами используются для запуска на исполнение функций.
API CMSIS-RTOS2 разработан с опциональным обьединением многопроцессорных систем и/или защищенного доступа через модуль защиты памяти Cortex-M (MPU). В некоторых реализациях RTOS потоки могут выполняться на разных процессорах, поэтому очереди сообщений могут находиться в общей памяти.
API CMSIS-RTOS2 подталкивает индустрию программного обеспечения к развитию существующих реализаций RTOS. Реализации RTOS могут быть разными и оптимизированы в различных аспектах для процессоров Cortex-M. Так же могут быть дополнительные функции, например:
- Поддержка модуля защиты памяти Cortex-M (MPU).
- Поддержка многопроцессорных систем.
- Поддержка контроллера DMA.
- Детерминированное переключение контекста.
- Круговое (Round-robin) переключение контекста.
- Предотвращения блокировки, например, с инверсией приоритета.
- Нулевая задержка прерывания с помощью команд Armv7-M LDREX и STREX.
Использование реализации CMSIS-RTOS2
Реализация CMSIS-RTOS2 обычно предоставляется в виде библиотеки. Чтобы добавить функциональность RTOS в существующее приложение на основе CMSIS, необходимо добавить библиотеку RTOS (и обычно один или несколько файлов конфигурации). Существует один новый файл заголовка cmsis_os2.h. Это единственный файл заголовка, необходимый для полностью переносимого приложения. В таком случае пользовательская память не может использоваться для блоков управления, данных объектов и стека. В качестве альтернативы вы можете подключить конкретный файл заголовка реализации (например, rtx_os.h), который также предоставляет определения для распределения ресурсов (такие как размер блоков управления, требуемая память для данных объекта и стека). Это необязательно и подразумевает, что код приложения не полностью переносится.
CMSIS-RTOS структура файлов
После добавления файлов в проект пользователь может начать работу с функциями CMSIS-RTOS. Пример кода приведен ниже:
Пример кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/*---------------------------------------------------------------------------- * CMSIS-RTOS 'main' function template *---------------------------------------------------------------------------*/ #include "RTE_Components.h" #include CMSIS_device_header #include "cmsis_os2.h" /*---------------------------------------------------------------------------- * Application main thread *---------------------------------------------------------------------------*/ void app_main (void *argument) { // ... for (;;) {} } int main (void) { // System Initialization SystemCoreClockUpdate(); #ifdef RTE_Compiler_EventRecorder // Initialize and start Event Recorder EventRecorderInitialize(EventRecordError, 1U); #endif // ... osKernelInitialize(); // Initialize CMSIS-RTOS osThreadNew(app_main, NULL, NULL); // Create application main thread osKernelStart(); // Start thread execution for (;;) {} } |
Заголовочный файл cmsis_os2.h
Файл cmsis_os2.h является стандартным файлом заголовка, который взаимодействует со всеми операционными системами реального времени, совместимыми с CMSIS-RTOS2 (RTOS). Каждой реализации предоставляется тот же cmsis_os2.h, который определяет интерфейс для CMSIS-RTOS2.
Использование cmsis_os2.h вместе с распределением динамических объектов позволяет создавать исходный код или библиотеки, которые не требуют изменений при использовании в другой реализации CMSIS-RTOS2.
Оставить ответ
Вы должны быть авторизованы чтобы размещать комментарии.