RTX5. Конфигурация

Файл «RTX_Config.h» определяет конфигурационные параметры для  CMSIS-RTOS RTX и должен быть частью каждого проекта использующий ядро CMSIS-RTOS RTX. Параметры конфигурации подробно описаны в следующих разделах:

  • Конфигурация системы охватывает общесистемные настройки для глобального пула памяти, частота тиков таймера, буфер событий ISR и циклическое переключение потоков (round-robin).
  • Конфигурация потока предоставляет несколько параметров для настройки функций управления потоками.
  • Конфигурация таймера предоставляет несколько параметров для настройки функций управления таймером.
  • Конфигурация флаги событий предоставляет несколько параметров для настройки функций флаги событий.
  • Конфигурация мьютекса предоставляет несколько параметров для настройки функций мьютекса.
  • Конфигурация семафора предоставляет несколько параметров для настройки функций семафора.
  • Конфигурация пул памяти предоставляет несколько параметров для настройки функций пул памяти.
  • Конфигурация очередь сообщений предоставляет несколько параметров для настройки функций очередь сообщений.

Файл «RTX_Config.c» содержит по умолчанию реализацию функций osRtxIdleThread и osRtxErrorNotify.Обе функции можно просто перезаписать с помощью пользовательского кода, переопределив их как часть кода пользователя.

Конфигурационный файл использует Аннотации мастера настройки. Перейдите к  Pack — Configuration Wizard Annotations для подробностей. В зависимости от инструмента разработки аннотации могут привести к более удобному графическому представлению настроек. Снимок экрана, приведенный ниже, представляет собой скриншот из макета μVision Мастер конфигурации:

config_wizard.png

RTX_Config.h in Мастер конфигурации

В качестве альтернативы можно указать параметры конфигурации, используя командную строку компилятора.

Например, можно настроить используемую частоту тика на 100us путем (перезаписи) конфигурации, используя команду  cc -DOS_TICK_FREQ=100

Конфигурация системы

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

Опции системной конфигурации

config_wizard_system.png

RTX_Config.h: Системная конфигурация
Название #define Описание
Размер глобальной динамической памяти [байты] OS_DYNAMIC_MEM_SIZE Определяет общий объем глобальной динамической памяти для Глобального пула памяти. По умолчанию размер равен 4096. Диапазон значений [0-1073741824] байт, кратно 8 байтам.
Частота тиков ядра (Герц) OS_TICK_FREQ Определяет базовое время для задержки и тайм-аутов в Гц. По умолчанию: 1000 Гц = 1 мс.
Round-Robin (циклическое) переключение OS_ROBIN_ENABLE Включает Round-Robin (циклическое) переключение потоков.
Round-Robin  таймаут OS_ROBIN_TIMEOUT Определяет продолжительность выполнения потока перед переключением потока. Значение по умолчанию 5. Диапазон значений[1-1000].
ISR FIFO очередь OS_ISR_FIFO_QUEUE Функции RTOS, вызываются из запросов хранилища ISR в этот буфер. По умолчанию значение 16 записей. Диапазон значений [4-256] записей кратные 4.

Глобальная динамическая память

Сошлитесь на Global Memory Pool.

Round-Robin  (циклическое) переключение потоков

RTX5 может быть настроен на использование циклического переключения многозадачных потоков. Round-robin позволяет выполнять квазипараллельное выполнение нескольких потоков с одинаковым приоритетом. Потоки не выполняются одновременно, но планируются там, где доступное время процессора делится на временные фрагменты, а RTX5 назначает временной срез для каждого потока. Поскольку временной срез обычно короткий (всего несколько миллисекунд), он выглядит так, как если бы потоки выполнялись одновременно.

Функции Round-robin переключения потока следующие:

  • тик предварительно загружается значением таймаута, когда происходит переключение потока
  • тик уменьшается (если уже не равен нулю) с каждым системным тиком, если тот же поток все еще выполняется
  • когда тик достигает 0, это указывает на то, что тайм-аут произошел. Если есть еще один поток в состоянии готовности READY  с одинаковым приоритетом, система переключается на этот поток, и тик предварительно загружается с таймаутом снова.

Другими словами, потоки запускаются на длительность их временного среза (если не отрезок времени потока). Затем RTX переключается на следующий поток, который находится в состоянии READY и имеет тот же приоритет. Если ни один другой поток с тем же приоритетом не готов к запуску, текущий текущий поток возобновляет его выполнение.

Примечение
При переключении на потоки с более высоким приоритетом сбрасывается значение тайм-аута round-robin.

Многозадачность Round-Robin контролируется с помощью #define OS_ROBIN_ENABLE. Период времени среза настраивается (в тиках таймера RTX) с #define OS_ROBIN_TIMEOUT.

ISR FIFO очередь

RTX функции (Вызовы из процедур прерывания), при внешнем вызове и обработчика прерывания, сохраняет тип запроса и опциональный параметр в буфере очереди ISR FIFO, который будет обработан позже, после выхода обработчика прерываний.

Планировщик активируется сразу же после завершения обработчиком IRQ для обработки запросов, хранящихся в буфере очереди FIFO. Требуемый размер этого буфера зависит от количества функций, вызываемых в обработчике прерываний. Недостаточный размер очереди будет зависеть от osRtxErrorNotify с кодом ошибки osRtxErrorISRQueueOverflow.

Конфигурация потока

RTX5 предоставляет несколько параметров для настройки функций управления потоками.

Опции управления потоком

config_wizard_threads.png

RTX_Config.h: Управление потоком
Опция #define Описание
Обьект специфичное выделение памяти OS_THREAD_OBJ_MEM Включает выделение памяти конкретным объектам. Смотрите Обьект-специфичный пул памяти
Число пользовательских потоков OS_THREAD_NUM Определяет максимальное количество потоков пользователей, которые могут быть активны одновременно. Применяется к пользовательским потокам с системной памятью для блоков управления. Значение по умолчанию — 1. Диапазон значений — [1-1000].
Число пользовательских потоков с размером стека равный По умолчению OS_THREAD_DEF_STACK_NUM Определяет максимальное количество пользовательских потоков с размером стека по умолчанию и применяется к пользовательским потокам с указанным размером стека 0. Диапазон значений [0-1000].
Общий размер стека [байты] для пользовательских потоков с пользовательским определением размера стека OS_THREAD_USER_STACK_SIZE Определяет объединенный размер стека для пользовательских потоков с размером стека пользователя. Значение по умолчанию — 0. Диапазон значений [0-1073741824] Байты, кратные 8.
Размер стека по умолчанию [байты] OS_STACK_SIZE Определяет размер стека для потоков с указанным нулевым размером стека. Значение по умолчанию — 200. Диапазон значений: [96-1073741824] Байт, кратным 8.
Размер стека для потока в режиме ожидания IDLE [байты] OS_IDLE_THREAD_STACK_SIZE Определяет размер стека для потока в режиме ожидания IDLE. Значение по умолчанию — 200. Диапазон значений — [72-1073741824] байт, кратным 8.
Idle Thread TrustZone Module ID OS_IDLE_THREAD_TZ_MOD_ID Определяет идентификатор модуля TrustZone, который используется потоком в режиме ожидания. Необходимо установить ненулевое значение, если ожидающему потоку необходимо вызывать защищенные функции. Значение по умолчанию — 0.
Проверка переполнения стека OS_STACK_CHECK Включить проверки переполнения стека при переключении потоков.
Использование водяного знака стеком OS_STACK_WATERMARK Инициализация стека потоков с помощью шаблона водяных знаков для анализа использования стека. Включение этой опции значительно увеличивает время выполнения создания потоков.
Режим процессора для выполнения потока OS_PRIVILEGE_MODE Управляет режимом процессора. Значение по умолчанию — режим Привилегированный. Диапазон значений [0 = непривилегированный; 1 = Привилегированный].

Настройка количества потоков и пространство стека

Ядро RTX5 использует отдельное пространство стека для каждого потока и предоставляет два метода для определения требований к стеку:

  • Статическое выделение: когда osThreadAttr_t::stack_mem и osThreadAttr_t::stack_size указывает область памяти, которая используется для стека потоков. Внимание: Приведенная память стека должна быть выровнена на 64 бита, т. е. с помощью uint64_t для объявления.
  • Динамическое выделение: когда osThreadAttr_t  как NULL  или osThreadAttr_t::stack_mem как NULL, система выделяет память для стека из:
    • Обьект специфичный пул памяти (размер стека по умолчанию) when «Object specific Memory allocation» включен и «Number of user Threads with default Stack size» не равен 0 и osThreadAttr_t::stack_size = 0 (или osThreadAttr_t как NULL).
    • Обьект специфичный пул памяти (размер стека определяемый пользователем) когда «Object specific Memory allocation» включен и «Total Stack size for user…» не равен 0 и osThreadAttr_t::stack_size не равен 0.
    • Глобальный пул памяти когда «Object specific Memory allocation» выключен или (osThreadAttr_t::stack_size не равен 0 и «Total Stack size for user…» = 0) или (osThreadAttr_t::stack_size = 0 и «Number of user Threads with default Stack size» = 0).

osThreadAttr_t является параметром функции osThreadNew.

Примечание
Перед запуском ядра RTX функции osKernelStart(), используется основной стек, определенный в startup_device.s.

Основной стек также используется для:

  • пользовательское приложение вызывает функции RTX в режиме потока с использованием вызовов SVC
  • обработчики прерываний / исключений.

Проверка переполнения стека

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

Если обнаружено переполнение стека, вызывается функция osRtxErrorNotify с кодом ошибки osRtxErrorStackUnderflow. По умолчанию эта функция реализована как бесконечный цикл и практически прекратит выполнение кода.

Использование водяного знака стеком

RTX5 инициализирует стек потоков с шаблоном водяного знака (0xCC) при создании потока. Это позволяет отладчику определять максимальное использование стека для каждого потока. Это, как правило, используется в процессе разработки, но удалено из конечного приложения. Использование водяного знака использования стека контролируется с помощью определения OS_STACK_WATERMARK.

Включение этой опции значительно увеличивает время выполнения osThreadNew (зависит от размера стека).

Режим процессора для выполнения потока

RTX5 позволяет выполнять потоки в непривилегированном или привилегированном режиме процессора. Режим процессора управляется с помощью определения OS_PRIVILEGE_MODE.

В непривилегированном режиме процессора прикладное программное обеспечение:

  • имеет ограниченный доступ к инструкциям MSR и MRS и не может использовать инструкцию CPS.
  • не может получить доступ к системному таймеру, NVIC или системному блоку управления.
  • может иметь ограниченный доступ к памяти или периферийным устройствам.

В режиме привилегированного процессора прикладное программное обеспечение может использовать все инструкции и иметь доступ ко всем ресурсам.

Конфигурация таймера

RTX5 предоставляет несколько параметров для настройки функций управления таймером.

Опции конфигурация таймера

config_wizard_timer.png

RTX_Config.h: Конфигурация таймера
Название #define Описание
Обьект специфичное выделение памяти OS_TIMER_OBJ_MEM Включает выделение памяти конкретным объектам
Число обьектов таймер OS_TIMER_NUM Определяет максимальное количество объектов, которые могут быть активны одновременно. Применяется к объектам с системной памятью для блоков управления. Диапазон значений: [1-1000].
Приоритет потока таймера OS_TIMER_THREAD_PRIO Определяет приоритет для потока таймера. Значение по умолчанию — 40. Диапазон значений — [8-48], кратный 8. Цифры имеют следующую корреляцию приоритета: 8 = Низкая; 16 = Ниже Normal; 24 = Нормальный; 32 = Выше Normal; 40 = Высокая; 48 = Реальное время
Размер стека потока таймер [байт] OS_TIMER_THREAD_STACK_SIZE Определяет размер стека для потока таймера. Может быть установлено значение 0, если таймеры не используются. Значение по умолчанию — 200. Диапазон значений — [0-1073741824], кратным 8.
Timer Thread TrustZone Module ID OS_TIMER_THREAD_TZ_MOD_ID Определяет идентификатор модуля TrustZone, который использует Timer Thread. Для этого необходимо установить ненулевое значение, если любые каллбек вызовы по таймеру должны вызывать защищенные функции. Значение по умолчанию — 0.
Количество функций каллбек OS_TIMER_CB_QUEUE Количество одновременных активных функций каллбек. Может быть установлено значение 0, если таймеры не используются. Значение по умолчанию — 4. Диапазон значений — [0-256].

Обьект-специфичное выделение памяти

Смотрите Обьект-специфичный пул памяти.

Пользовательский поток таймера

Приоритет подсистемы таймера в рамках всей системы RTOS наследуется от приоритета osRtxTimerThread. Это настраивается OS_TIMER_THREAD_PRIO. Стек для функций обратного вызова предоставляется osRtxTimerThread. OS_TIMER_THREAD_STACK_SIZE должны удовлетворять требования стопки функции обратного вызова с наибольшим использованием стеки.

Конфигурация флаги событий

RTX5 предоставляет несколько параметров для настройки функций флага событий.

Опции конфигурации событий

config_wizard_eventFlags.png

RTX_Config.h: Конфигурация флаги событий
Название #define Описание
Обьект специфичное выделение памяти OS_EVFLAGS_OBJ_MEM Включает выделение памяти конкретным объектам.Смотрите Обьект-специфичный пул памяти.
Число обьектов Фалаги событий OS_EVFLAGS_NUM Определяет максимальное количество объектов, которые могут быть активны одновременно. Применяется к объектам с системной памятью для блоков управления. Диапазон значений: [1-1000].

Обьект специфичное выделение памяти

Когда используется обьект специфичная память, размер пула для всех объектов Event определяется OS_EVFLAGS_NUM. Обратитесь к объектным пулам памяти.

Конфигурация мьютекса

RTX5 предоставляет несколько параметров для настройки функций управления мьютекс.

Опции конфигурации мьютекса

config_wizard_mutex.png

RTX_Config.h: Конфигурация мьютекса
Название #define Описание
Обьект специфичное выделение памяти OS_MUTEX_OBJ_MEM Включает выделение памяти конкретным объектам. Смотрите  Обьект-специфичный пул памяти.
Число мьютекс обьектов OS_MUTEX_NUM Определяет максимальное количество объектов, которые могут быть активны одновременно. Применяется к объектам с системной памятью для блоков управления. Диапазон значений: [1-1000].

Обьект специфичное выделение памяти

Когда используется объектная память, размер пула для всех объектов Mutex определяется OS_MUTEX_NUM. Смотрите Обьект-специфичный пул памяти.

Конфигурация семафора

RTX5 предоставляет несколько параметров для настройки функций семафоров.

Опции конфигурации семафоров

config_wizard_semaphore.png

RTX_Config.h: Конфигация семафора
Название #define Описание
Обьект специфичное выделение памяти OS_SEMAPHORE_OBJ_MEM Включает выделение памяти конкретным объектам. Смотрите Обьект-специфичный пул памяти.
Число обьектов семафор OS_SEMAPHORE_NUM Определяет максимальное количество объектов, которые могут быть активны одновременно. Применяется к объектам с системной памятью для блоков управления. Диапазон значений: [1-1000].

Обьект специфичное выделение памяти

Когда используется объектная память, размер пула для всех объектов Семафора определяется OS_SEMAPHORE_NUM. Смотрите Обьект-специфичный пул памяти.

Конфигурация пул памяти

RTX5 предоставляет несколько параметров для настройки функций Пул памяти.

Опции конфигурации пул памяти

config_wizard_memPool.png

RTX_Config.h: Конфигурация пул памяти
Название #define Опции
Обьект специфичное выделение памяти OS_MEMPOOL_OBJ_MEM Включает выделение памяти конкретным объектам. Смотрите Обьект-специфичный пул памяти.
Количество объектов пула памяти OS_MEMPOOL_NUM Определяет максимальное количество объектов, которые могут быть активны одновременно. Применяется к объектам с системной памятью для блоков управления. Диапазон значений: [1-1000].
Хранение данных размер памяти [байт] OS_MEMPOOL_DATA_SIZE Определяет размер памяти объединенного хранилища данных. Применяется к объектам с системной памятью для хранения данных. Значение по умолчанию — 0. Диапазон значений: [0-1073741824], кратным 8.

Обьект специфичное выделение памяти

Когда используется объектно-зависимая память, количество пулов для всех объектов MemoryPool определяется OS_MEMPOOL_NUM. Общий размер хранилища, зарезервированный для всех пулов, настраивается в OS_MEMPOOL_DATA_SIZE. Смотрите Обьект-специфичный пул памяти.

Конфигурация очередь сообщений

RTX5 предоставляет несколько параметров для настройки функций очереди сообщений.

Опции конфигурации очереди сообщений

config_wizard_msgQueue.png

RTX_Config.h: Конфигурация очереди сообщений
Название #define Описание
Обьект специфичное выделение памяти OS_MSGQUEUE_OBJ_MEM Включает выделение памяти конкретным объектам. Смотрите Обьект-специфичный пул памяти.
Количество объектов очереди сообщений OS_MSGQUEUE_NUM Определяет максимальное количество объектов, которые могут быть активны одновременно. Применяется к объектам с системной памятью для блоков управления. Диапазон значений: [1-1000].
Хранение данных размер памяти [байт] OS_MSGQUEUE_DATA_SIZE Определяет размер памяти объединенного хранилища данных. Применяется к объектам с системной памятью для хранения данных. Значение по умолчанию — 0. Диапазон значений: [0-1073741824], кратным 8.

Обьект специфичное выделение памяти

Когда используется объектная память, количество очередей для всех объектов очереди сообщений определяется OS_MSGQUEUE_NUM. Общий размер хранилища, зарезервированный для всех очередей, настраивается вOS_MSGQUEUE_DATA_SIZE. Смотрите Обьект-специфичный пул памяти.

Оставить ответ