Freertos для arduino
Операционная система реального времени (ОСРВ) FreeRTOS получила порт, оптимизированный под среду разработки Arduino IDE. В это трудно поверить, но разработчики обещают полный доступ ко всем возможностям FreeRTOS в классическом рабочем окружении Arduino.
Уже довольно давно Arduino IDE получила драйверы и библиотеки, позволяющие писать программы для довольно мощных процессоров ARM (не только для AVR). Однако стандартное приложение Arduino было ограничено простыми примитивами функций setup (первоначальная настройка) и loop (бесконечный цикл выполняющегося алгоритма), что не давало способа эффективно реализовать многозадачность.
В этой статье (перевод [1]) дан краткий обзор простой и удобной реализации FreeRTOS, которая достаточно компактна, чтобы работать в среде Arduino IDE как её библиотека, и позволить пользователям прозрачно использовать как функции Arduino, так и FreeRTOS. Все непонятные термины, касающиеся систем RTOS, см. в статье [10] (раздел «Словарик» в конце этой статьи).
[Немного теории]
Большинство операционных систем спроектированы таким образом, что позволяют сразу нескольким программам или потокам работать одновременно (даже на одном процессоре). Эта функция операционной системы называется многозадачностью (multi-tasking). Пользователю кажется, что все запущенные задачи работают одновременно, но если заглянуть глубже, то каждое процессорное ядро в любой момент времени реально обрабатывает только одну задачу (программу или поток). Специальная часть операционной системы, которая называется планировщиком (scheduler), отвечает за распределение процессорного времени между задачами. Т. е. планировщик решает, какая программа и в какой момент должна переключиться на выполнение своей задачи. Такое переключение процессорного ядра между программами (потоками) может происходить достаточно быстро, чтобы создать иллюзию одновременной работы сразу нескольких программ.
Планировщик в Операционной Системе Реального Времени (ОСРВ; соответствующий английский термин Real Time Operating System, RTOS) разработан так, чтобы изначально предсказуемо распределить процессорное время между задачами, со строго определенным временем реакции всей системы на внешние события [2]. Обычно такое свойство описывают как детерминистский механизм поведения (deterministic execution pattern). В частности это свойство затребовано и в малых встраиваемых системах, таких как устройства Arduino, поскольку к таким устройствам предъявляются требования обработки алгоритмов в реальном времени.
Традиционные планировщики реального времени (real time scheduler), такие как шедулер FreeRTOS, реализуют свой детерминизм, назначая определенный приоритет каждому выполняемому потоку. Тогда шедулер использует этот приоритет, чтобы узнать, какому потоку в какой момент времени следует передать процессорное время (т. е. какой поток и когда должен продолжить выполнять свой алгоритм). В системе FreeRTOS выполняемый поток обозначается термином Task (задача).
[Быстрый старт]
Проще всего начать с использования Codebender [3], где Arduino FreeRTOS доступна как библиотека [4].
Другой способ, процесс по шагам:
1. Откройте менеджер библиотек Arduino IDE (Arduino IDE Library, доступный с версии Arduino 1.6.8), найдите в списке FreeRTOS Library (тип библиотеки Type: «Contributed» и тема Topic: «Timing»).
2. Убедитесь, что установлена самая свежая версия FreeRTOS Library Release. На момент написания статьи [1] это была версия v9.0.0-1.
3. Убедитесь с помощью меню Sketch -> Include Library, что библиотека FreeRTOS подключена к Вашему скетчу. Новый, пустой скетч будет выглядеть примерно так:
4. Скомпилируйте (Compile) и выгрузите (Upload) этот пустой скетч в свою плату Arduino (Arduino Uno, Arduino Yun, Arduino Leonardo, Arduino Mega 2560, Goldilocks 1284p и т. п.). Это покажет Вам, сколько памяти процессора Arduino уйдет на шедулер FreeRTOS. Ниже для примера приведена информация по использованию памяти на разных платах (код был скомпилирован под управлением Arduino v1.6.9 на Windows 10).
На этом шаге FreeRTOS уже работает на Вашем устройстве Arduino.
[Что дальше?]
Теперь выгрузите в плату и протестируйте скетч Blink с нижележащей RTOS путем вставки #include в начало скетча. Это все, что нужно для запуска FreeRTOS в Ваших скетчах.
Следующий шаг — рассмотреть возможности профессиональной RTOS в среде Arduino IDE.
Скетч Blink_AnalogRead.ino (см. врезку ниже) это хороший способ начать комбинировать в одном скетче базовые примеры Arduino, такие как Blink и AnalogRead, с распределением их функционала на разные задачи (Tasks). Обе эти задачи будут выполнять свои функции, под управлением шедулера FreeRTOS. Этот скетч можно найти в папке Examples каталога установки Arduino IDE.
В этом примере два базовых скетча из встроенных в Arduino IDE примеров (Examples) скомбинированы в один многозадачный скетч, в котором работают 2 задачи FreeRTOS.
Если Вас интересуют приложения с низким энергопотреблением или с питанием от батарей, то можно просто использовать FreeRTOS для поддержки режимов пониженного энергопотребления микроконтроллеров AVR ATmegaXXXX (AVR ATmega power reduction modes). Подробнее см. [5].
Другие статьи рассматривают использование семафоров (Semaphore) для защиты аппаратных ресурсов [6] (наподобие последовательного порта Serial), очередей (Queue) для обмена данными между задачами (Tasks), или таймеров (Timer), чтобы генерировать задержки и отслеживать таймауты. Страничка с руководством для быстрого освоения FreeRTOS [7] даст Вам дополнительную информацию по продвинутым функциям, и предоставит демонстрационные примеры [8]. Также есть много примеров кода AVR FreeRTOS на сайте GitHub, которые могут быть легко портированы в среду разработки Arduino.
Arduino FreeRTOS Tutorial — How to use FreeRTOS to Multi-tasking in Arduino¶
What is RTOS¶
One of the most important components of today’s embedded systems is the RTOS also known as Real-Time Operating System, which is responsible for everything from task scheduling to performing applications.
RTOS is designed to provide a predictable execution mode. When the processing must meet the time limit of the system, RTOS is used. Therefore, compared with GPOS (General Purpose Operating System), RTOS is usually light in weight and small in size, and generally only provides functions required to run specific types of applications on specific hardware. In some cases, developers can modify the existing RTOS, narrow it down to only provide the functionality required by a specific application, and/or customize its functionality or performance characteristics.
How does RTOS work¶
The kernel is the core component in the operating system. Operating systems like Linux use a kernel, allowing users to appear to access the computer at the same time. Each program being executed is a task (or thread) under the control of the operating system. If an operating system can perform multiple tasks in this way, it can be said to be multitasking.
Traditional processors can only execute one task at a time, but a multitasking operating system can make each task appear to be executed simultaneously by quickly switching between tasks. The following figure shows the relationship between the execution mode of three tasks and time.
The scheduler is the part of the kernel that is responsible for deciding which task to execute at any particular time. The kernel can pause and resume a task multiple times during the life cycle of the task.
A scheduling strategy is an algorithm used by the scheduler to decide which task to perform at any point in time. A (non-real-time) multi-user system strategy is likely to give each task a «fair» proportion of processor time.
In addition to being involuntarily suspended by the kernel, a task can also choose to suspend itself. If it wants to delay (sleep) for a period of time, or wait (block) for a resource to be available (such as a serial port) or an event (such as a key press), it will do so.
What is FreeRTOS¶
FreeRTOS is a class of RTOS that is designed to be small enough to run on a microcontroller – although its use is not limited to microcontroller applications. FreeRTOS includes a kernel and a growing set of software libraries suitable for use across industry sectors and applications. With the help of FreeRTOS, you can do multitasking on a microcontroller based hardware!
For Arduino compatibility, we have ported FreeRTOS into the Arduino framework so that you are able to use FreeRTOS with your favorite Arduino boards with ease!
In 2017, Amazon has taken the stewardship of FreeRTOS which makes it reliable and secure to the embedded world.
Quick Start with FreeRTOS For Arduino¶
Installing the FreeRTOS Arduino Libraries¶
Visit the Seeed_Arduino_FreeRTOS repositories and download the entire repo to your local drive.
Now, the Seeed_Arduino_FreeRTOS library can be installed to the Arduino IDE. Open the Arduino IDE, and click sketch -> Include Library -> Add .ZIP Library , and choose the Seeed_Arduino_FreeRTOS file that you’ve have just downloaded.
This library ports the latest FreeRTOS(10.2.1) and allow you to create FreeRTOS Projects in the in Arduino IDE.
Supported Boards¶
The Seeed_Arduino_FreeRTOS supports all the SAMD boards by Seeed:
FreeRTOS Arduino Examples¶
The FreeRTOS can be very powerful by providing the microcontroller real time scheduling functionality, inter-task communication, timing and synchronization primitives.
To get you started with FreeRTOS easily, here provides some examples for reference. The following examples are built and ran on Wio Terminal.
Hello World Example¶
This example simply creates two threads that prints different strings to the Serial Monitor at a different rate.
Blink Example¶
This example also creates two threads and output signals to light up LED. One is to simply blink the LED, and the other is to breath LED.
Make sure that the Breathing LED is on a PWM pin.
LCD Example¶
This example is a demonstrations of FreeRTOS with other Arduino libraries such as LCD Sprites in Wio Terminal. This example creates two sprites in two threads to count number in the opposite way. taskMonitor is a function used to monitor threads and prints stacks info about each thread.
FreeRTOS in Cpp For Arduino¶
For more, we also provide Seeed_Arduino_ooFreeRTOS, which is a collection of C++ wrappers encapsulating the FreeRTOS functionality, and it’s working under the framework of Arduino.
Installing the FreeRTOS Cpp Arduino Libraries¶
Visit the Seeed_Arduino_ooFreeRTOS repositories and download the entire repo to your local drive.
Now, the Seeed_Arduino_ooFreeRTOS library can be installed to the Arduino IDE. Open the Arduino IDE, and click sketch -> Include Library -> Add .ZIP Library , and choose the Seeed_Arduino_ooFreeRTOS file that you’ve have just downloaded.
Использование мультизадачности FreeRTOS на Arduino
О проекте
В Arduino IDE имеется множество доступных драйверов и библиотек, но среда Arduino ограничена только setup() и loop() и эффективно не поддерживает многозадачность.
Рассмотрим простую, легкую в использовании и надежную реализацию FreeRTOS, которую можно вставить в Arduino IDE в виде библиотеки, и которая позволяет беспрепятственно использовать лучшие части обоих сред.
Использование мультизадачности FreeRTOS в Arduino
Происхождение
Большинство операционных систем позволяют одновременно выполнять несколько программ или потоков. Это называется многозадачностью. На самом деле, каждое ядро процессора в любой заданный момент времени может запускать только одну программу. Часть операционной системы, называемая планировщиком, отвечает за принятие решения о том, какая программа должна выполняться, и обеспечивает иллюзию одновременного выполнения путем быстрого переключения между программами.
Планировщик в операционный системе реального времени (RTOS) предназначен для обеспечения предсказуемого (обычно описываемого как детерминированного) шаблона выполнения. Это особенно интересно для встраиваемых систем, таких как устройства Arduino, поскольку к встраиваемым системам часто предъявляются требования реального времени.
Традиционные планировщики реального времени, такие как планировщик, используемый во FreeRTOS, достигают детерминизма, позволяя пользователю назначать приоритет для каждого потока выполнения. Затем планировщик использует этот приоритет, чтобы узнать, как поток должен выполниться следующим. Во FreeRTOS поток выполнения называется задачей Task .
Давайте начнем
Во-первых, в менеджере библиотек Arduino IDE, начиная с версии 1.6.8, найдите библиотеку FreeRTOS под типом «Contributed» («Внесены») и темой «Timing» («Расчет времени»).
Поиск в менеджере библиотек Arduino
Убедитесь, что установлен последний релиз библиотеке FreeRTOS. В данном случае это v10.1.0-1.
FreeRTOS v8.2.3 Release 6 истановлена
Затем подключите библиотеку FreeRTOS либо через меню Скетч → Подключить библиотеку, либо добавьте следующую строку в начале скетча:
Скомпилируйте и загрузите этот пустой скетч (с FreeRTOS) на устройство Arduino Uno/Yun/Leonardo/Mega. Это покажет вам, сколько флэш памяти потребляется планировщиком FreeRTOS. При тестировании с Arduino IDE v1.6.9 на Windows 10 было получено следующее:
Устройство | Пустой скетч только с loop() | Пустой скетч с FreeRTOS | Дополнительный занимаемый объем памяти программ |
---|---|---|---|
Uno | 444 | 7018 | 20% |
Goldilocks | 502 | 7086 | 5% |
Leonardo | 3618 | 10166 | 23% |
Yun | 3612 | 10160 | 23% |
Mega | 656 | 7086 | 2% |
На этом этапе FreeRTOS уже запущена на вашем устройстве.
Следующие шаги
Теперь загрузите и протестируйте скетч Blink , используя операционную систему реального времени, просто вставив #include в начало скетча. Это всё, что нужно, чтобы FreeRTOS работала в ваших скетчах.
Следующим шагом будет изучение возможностей, предоставляемых профессиональной RTOS в Arduino IDE.
Blink_AnalogRead.ino – это хороший способ начать, поскольку он объединяет два базовых примера Arduino, Blink и AnalogRead , в один скетч с двумя отдельными задачами Task . Обе задачи выполняют свою работу, управляемые планировщиком FreeRTOS. Данный скетч может быть найден через меню Файл → Примеры → FreeRTOS.
Если вас интересуют устройства с малым энергопотреблением или работающие от аккумуляторов, то FreeRTOS легко использовать для поддержки режимов снижения энергопотребления AVR ATmega.
Следующие статьи буду посвящены использованию семафоров ( Semaphore ) для защиты аппаратных ресурсов (например, последовательного порта), очередей ( Queue ) для передачи данных между задачами ( Task ) или таймеров ( Timer ) для управления точными задержками и таймаутами.
На сайте работает сервис комментирования DISQUS, который позволяет вам оставлять комментарии на множестве сайтов, имея лишь один аккаунт на Disqus.com.
В случае комментирования в качестве гостя (без регистрации на disqus.com) для публикации комментария требуется время на премодерацию.
Компилирую под Nano, среда Arduino IDE 1.8.15 со свежей библиотекой FreeRTOS (от 15.07.2021) сыпит ошибками.
*»expected primary-expression before ‘const'» на строку «, (const portCHAR *) «AnalogRead»»