Ардуино

HeliOS для Arduino

HeliOS для Arduino
Микроконтроллеры Arduino используют единую программу для управления всеми переключателями, светодиодами и другими частями системы. Первой программой, которую выучил пользователь Arduino, обычно является программа Blink, которая использует функцию задержки для равномерного включения и выключения светодиода. Эта простая программа может быть расширена для выполнения многих задач, но не может включать многозадачность.

Для более сложных проектов вам необходимо изменять значения и считывать данные в реальном времени, что невозможно со стандартной функцией задержки в Arduino. Следовательно, необходимо другое решение. К счастью, HeliOS может помочь.

Ограничения Arduino

Как упоминалось во введении, стандартный язык Arduino можно применять разными способами. Однако есть проблема: Arduino не может работать в многозадачном режиме. Например, вы не можете настроить три разных светодиода, чтобы они мигали с независимыми интервалами. Эта задача не может быть выполнена, потому что, если вы используете задержку, светодиод с самой длинной задержкой будет блокировать мигание других светодиодов во время ожидания переключения состояний.

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

Хотя есть решения для решения этих проблем (e.грамм., аппаратные прерывания, функция millis, реализация FreeRTOS), но эти решения также имеют ограничения. Чтобы преодолеть проблемы, связанные с этими решениями, Манни Петерсон изобрел HeliOS. HeliOS небольшая и эффективная, она может работать даже на 8-битных контроллерах.

Рассмотрим приведенный ниже код, который в лучшем случае ненадежен, потому что оператор задержки предотвратит проверку кнопки.

int buttonPin = 2; // номер контакта кнопки
int ledPin = 4; // номер вывода светодиода
// переменные изменятся:
int buttonState = 0; // переменная для чтения статуса кнопки
void setup ()
// инициализируем вывод светодиода как выход:
pinMode (ledPin, ВЫХОД);
pinMode (LED_BUILTIN, ВЫХОД);
// инициализируем контакт кнопки как вход:
pinMode (buttonPin, ВВОД);

void loop ()
// считываем состояние значения кнопки:
buttonState = digitalRead (buttonPin);
// проверяем, нажата ли кнопка. Если это так, buttonState имеет значение HIGH:
if (buttonState == HIGH)
digitalWrite (ledPin, HIGH); // включаем светодиод
еще
digitalWrite (ledPin, LOW); // выключаем светодиод

digitalWrite (LED_BUILTIN, HIGH); // включаем светодиод (HIGH - уровень напряжения)
задержка (1000); // ждем секунду
digitalWrite (LED_BUILTIN, LOW); // выключаем светодиод, понижая напряжение
задержка (1000); // ждем секунду

Когда вы запустите этот код, вы увидите, что ledPin будет нормально мигать. Однако, когда вы нажимаете кнопку, она не загорается, а в противном случае задерживает последовательность мигания. Чтобы эта программа работала, вы можете переключиться на другие методы задержки; однако HeliOS предоставляет альтернативу.

Linux, встроенный в Arduino (HeliOS)

Несмотря на «ОС» в названии, HeliOS не является операционной системой: это библиотека многозадачных функций. Тем не менее, он реализует 21 вызов функции, которые могут упростить сложные задачи управления. Для задач в реальном времени система должна обрабатывать внешнюю информацию по мере ее получения. Для этого система должна уметь работать в многозадачном режиме.

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

Как и FreeRTOS, HeliOS расширяет возможности многозадачности контроллеров. Однако разработчикам, которые планируют сложный критически важный проект, необходимо использовать FreeRTOS или что-то подобное, потому что HeliOS предназначена для использования энтузиастами и любителями, которые хотят изучить возможности многозадачности.

Установка HeliOS

При использовании библиотек Arduino новые библиотеки могут быть установлены с помощью IDE. Для версий 1.3.5 и выше, вы выбираете, используя Диспетчер библиотек.


Кроме того, вы можете загрузить zip-файл с веб-страницы и использовать этот файл для установки HeliOS.


Обратите внимание, что вам необходимо включить HeliOS в свой код, прежде чем вы сможете начать его использовать.

Пример

Приведенный ниже код можно использовать, чтобы светодиодный индикатор мигал один раз в секунду. Хотя мы добавили код HeliOS, конечный эффект такой же, как и во вводном руководстве.

Главное отличие здесь в том, что вы должны создать задачу. Эта задача переводится в состояние ожидания, и устанавливается таймер, чтобы сообщить задаче, когда запускать. Кроме того, цикл содержит только один оператор: xHeliOSLoop (). Этот цикл запускает весь код, определенный в setup () кода. Когда вы планируете свой код, вам нужно установить все контакты, константы и функции в верхней настройке.

#включать
// Используется для хранения состояния светодиода
изменчивый int ledState = 0;
изменчивый int buttonState = 0;
const int buttonPin = 2;
const int ledPin = 4;
// Определяем задачу мигания
void taskBlink (xTaskId id_)
if (ledState)
digitalWrite (LED_BUILTIN, LOW);
ledState = 0;
еще
digitalWrite (LED_BUILTIN, HIGH);
ledState = 1;



// Определяем задачу чтения кнопки
void buttonRead (xTaskId id_)
buttonState = digitalRead (buttonPin);
// проверяем, нажата ли кнопка. Если это так, buttonState имеет значение HIGH:
if (buttonState == HIGH)
// включаем светодиод:
digitalWrite (ledPin, HIGH);
еще
// выключаем светодиод:
digitalWrite (ledPin, LOW);


void setup ()
// id отслеживает задачи
xTaskId id = 0;
// Это инициализирует структуры данных Helios
xHeliOSSetup ();
pinMode (LED_BUILTIN, ВЫХОД);
pinMode (ledPin, ВЫХОД);
// инициализируем контакт кнопки как вход:
pinMode (buttonPin, ВВОД);
// Добавляем, а затем заставляем taskBlink ждать
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (идентификатор);
// Интервал таймера для 'id'
xTaskSetTimer (идентификатор, 1000000);
id = xTaskAdd («КНОПКА», & buttonRead);
xTaskStart (идентификатор);

void loop ()
// Это и только это всегда в цикле при использовании Helios
xHeliosLoop ();

С помощью этого кода вы можете запрограммировать мигание светодиода в любое время, не беспокоясь о задержке Arduino.

Заключение

Этот проект отлично подходит для людей, которые плохо знакомы с Arduino, поскольку он позволяет вам использовать обычный код Arduino для обработки задач в реальном времени. Однако метод, описанный в этой статье, предназначен только для любителей и исследователей. Для более серьезных проектов нужны другие методы.

Игры HD Remastered для Linux, ранее не выпускавшиеся для Linux
Многие разработчики и издатели игр придумывают HD-ремастеры старых игр, чтобы продлить жизнь франшизы, порадовать фанатов, требующих совместимости с с...
Как использовать AutoKey для автоматизации игр под Linux
AutoKey - это утилита автоматизации рабочего стола для Linux и X11, запрограммированная на Python 3, GTK и Qt. Используя его функции сценариев и MACRO...
Как показать счетчик FPS в играх для Linux
Игры для Linux получили серьезный толчок, когда Valve объявила о поддержке Linux для клиента Steam и своих игр в 2012 году. С тех пор многие игры AAA ...