ChibiOS. Как создавать потоки

Создание нового потока является наиболее распространенной задачей при использовании ОС реального времени. Давайте рассмотрим как это делается в ChibiOS/RT.

После инициализации ChibiOS/RT, используя chSysInit() у нас появляются два потока по умолчанию: Idle thread — этот поток имеет самый низкий приоритет в системе, так как он работает только тогда, когда другие потоки не используются либо спят. Эти потоки обычно переключает систему в режим пониженного энергопотребления и больше ничего не делают; Main thread — это главный поток, он выполняет основную функцию main() при запуске. Основной поток создается на уровне NORMALPRIO и он может изменить свой приоритет, если требуется.

Есть два класса потоков в ChibiOS / RT:
Static Threads (Статические потоки) это класс потоков которые находятся в статической памяти во время компиляции.
Dynamic Threads (Динамические потоки) это потоки созданные путем выделения памяти во время компиляции.

Создание статического потока

Для того чтобы создать статический поток, рабочая зона должна быть объявлена с помощью макросов WORKING_AREA как показано ниже:

Этот макрос резервирует 128 байт стека для потока и пространства всех необходимых и связанных с ним структур.
Статический поток может быть запущен вызовом chThdCreateStatic(), как показано в следующем примере:

Переменная tp получает указатель на объект потока, этот указатель часто принимается в качестве параметра другими API. Теперь полный пример:

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

Создание динамического потока при помощи распределения стека. Создание потока из HEAP

Память выделяется из указанного стека и поток выполняется. Обратите внимание, что память не освобождается, когда поток завершается. Например:

Создание динамического потока, используя распределение памяти (не стека)

Перевод How to create a thread

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *