Ардуїно

HeliOS для Arduino

HeliOS для Arduino
Мікроконтролери Arduino використовують єдину програму для управління всіма перемикачами, світлодіодами та іншими частинами системи. Першою програмою, яку вивчив користувач Arduino, як правило, є програма `` Blink '', яка використовує функцію затримки, щоб рівномірно вмикати та вимикати світлодіод. Ця проста програма може бути розширена, щоб робити багато речей, але вона не може включати багатозадачність.

Для більш просунутих проектів потрібно змінювати значення та читати дані в режимі реального часу, що неможливо за допомогою стандартної функції затримки в Arduino. Тому потрібне інше рішення. На щастя, HeliOS може допомогти.

Обмеження Arduino

Як зазначалося у вступі, стандартна мова Arduino може застосовуватися різними способами. Однак є проблема: Arduino не може виконувати багатозадачність. Наприклад, ви не можете встановити, щоб три різних світлодіоди блимали через незалежні проміжки часу. Це завдання неможливо виконати, оскільки, якщо ви використовуєте затримку, світлодіод з найбільшою затримкою заблокує блимання інших світлодіодів під час очікування перемикання станів.

Стандартне опитування також клопітке, оскільки перевірка стану кнопки вимагає вжиття заходів. У стандартному Arduino вам потрібно налаштувати функцію опитування стану комутатора або будь-якого іншого стану.

Хоча є рішення для вирішення цих питань (наприклад,.g., апаратні переривання, функція millis, реалізація FreeRTOS), але ці рішення також мають обмеження. Щоб подолати проблеми цих рішень, Менні Петерсон винайшов HeliOS. HeliOS невеликий і ефективний, і він може працювати навіть на 8-бітних контролерах.

Розгляньте наведений нижче код, який у кращому випадку є ненадійним, оскільки оператор затримки не дозволить перевірити кнопку.

int buttonPin = 2; // номер штифта кнопки
int ledPin = 4; // номер світлодіодного штифта
// змінні зміняться:
int buttonState = 0; // змінна для зчитування стану кнопки
void setup ()
// ініціалізуємо світлодіодний штифт як вихід:
pinMode (ledPin, OUTPUT);
pinMode (LED_BUILTIN, OUTPUT);
// ініціалізуємо кнопковий штифт як вхід:
pinMode (buttonPin, INPUT);

void loop ()
// зчитування стану значення кнопки:
buttonState = digitalRead (buttonPin);
// перевіряємо, чи натиснута кнопка. Якщо це так, buttonState має значення HIGH:
якщо (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 () коду. Коли ви плануєте свій код, вам потрібно встановити всі шпильки, константи та функції у верхній настройці.

#включати
// Використовується для збереження стану світлодіода
volatile int ledState = 0;
volatile 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:
якщо (buttonState == HIGH)
// увімкнути світлодіод:
digitalWrite (ledPin, HIGH);
ще
// вимкнути світлодіод:
digitalWrite (ledPin, LOW);


void setup ()
// id відстежує завдання
xTaskId id = 0;
// Це ініціалізує структури даних Helios
xHeliOSSetup ();
pinMode (LED_BUILTIN, OUTPUT);
pinMode (ledPin, OUTPUT);
// ініціалізуємо кнопковий штифт як вхід:
pinMode (buttonPin, INPUT);
// Додаємо, а потім робимо taskBlink wait
id = xTaskAdd ("TASKBLINK", & taskBlink);
xTaskWait (id);
// Інтервал таймера для 'id'
xTaskSetTimer (ідентифікатор, 1000000);
id = xTaskAdd ("КНОПКА", & buttonRead);
xTaskStart (id);

void loop ()
// Це, і тільки це, завжди в курсі, коли використовується Helios
xHeliosLoop ();

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

Висновок

Цей проект чудово підходить для людей, які не знайомі з Arduino, оскільки він дозволяє використовувати звичайний код Arduino для обробки завдань у режимі реального часу. Однак метод, описаний у цій статті, призначений лише для любителів та дослідників. Для більш серйозних проектів необхідні інші методи.

OpenTTD vs Simutrans
Creating your own transport simulation can be fun, relaxing and extremely enticing. That's why you need to make sure that you try out as many games as...
OpenTTD Tutorial
OpenTTD is one of the most popular business simulation games out there. In this game, you need to create a wonderful transportation business. However,...
SuperTuxKart for Linux
SuperTuxKart is a great title designed to bring you the Mario Kart experience free of charge on your Linux system. It is pretty challenging and fun to...