цифровая электроника
вычислительная техника
встраиваемые системы

 

Используем FreeRTOS и ее многозадачность на Arduino

Автор: Mike(admin) от 18-03-2020, 05:55

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


Используем FreeRTOS и ее многозадачность на Arduino

В среде Arduino IDE и среде доступно множество драйверов и библиотек, но среда Arduino ограничена простыми базовыми функциями setup() и loop() и не поддерживает эффективную многозадачность. Но есть простая, простая в использовании и надежная реализация FreeRTOS, которая может просто интегрироваться в Arduino IDE в качестве библиотеки и позволяет без проблем использовать лучшие части обеих сред.


Большинство операционных систем позволяют одновременно выполнять несколько программ или потоков. Это называется многозадачностью. В действительности каждое ядро процессора может работать только с одной программой в любой момент времени. Часть операционной системы, называемая планировщиком, отвечает за решение, какую программу запускать и когда, и обеспечивает иллюзию одновременного выполнения, быстро переключаясь между каждой программой.


Планировщик в операционной системе реального времени (ОСРВ) предназначен для обеспечения предсказуемого (обычно описанного как детерминистического) шаблона выполнения. Это особенно интересно для встраиваемых систем, таких как устройства Arduino, поскольку встраиваемые системы часто предъявляют требования к работе в реальном времени.


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


Итак, приступим к установке FreeRTOS на Arduino. Во-первых, в менеджере библиотек Arduino IDE, начиная с версии 1.6.8, найдите библиотеку FreeRTOS в типе Contributed и теме Timing.


Используем FreeRTOS и ее многозадачность на Arduino

Убедитесь, что установлена последняя версия библиотеки FreeRTOS.


Используем FreeRTOS и ее многозадачность на Arduino

Затем в меню Sketch-Include Library (Скетч – Подключить библиотеку) убедитесь, что библиотека FreeRTOS включена в ваш скетч. Новый пустой скетч будет выглядеть следующим образом.


Используем FreeRTOS и ее многозадачность на Arduino

Скомпилируйте и загрузите этот пустой скетч в Arduino Uno / Yun / Leonardo / Mega или Goldilocks 1284p. При этом будет показано, сколько вашей флэш-памяти используется планировщиком FreeRTOS. На этом этапе FreeRTOS уже работает на вашем устройстве.


Теперь загрузите и протестируйте скетч Blink с установленной операционной системой реального времени, просто вставив в начале скетча


#include <Arduino_FreeRTOS.h>

Вот и все, что нужно сделать, чтобы FreeRTOS работала в ваших скетчах.


Следующим шагом является изучение функций, предоставляемых профессиональной ОСРВ в Arduino IDE. Скетч Blink_AnalogRead.ino – хороший способ начать, поскольку он объединяет два основных примера Arduino, Blink и AnalogRead, в один скетч с двумя отдельными задачами. Обе задачи выполняют свои обязанности под управлением планировщика FreeRTOS. Этот скетч можно найти в папке примеров в Arduino IDE, если его нет, то код можно взять ниже.


В следующей статье будет рассказано об использовании семафоров для защиты аппаратных ресурсов (например, последовательного порта). Если вас интересуют приложения с низким энергопотреблением, то FreeRTOS легко использовать для поддержки режимов пониженного энергопотребления в микроконтроллерах AVR ATmega.


#include <Arduino_FreeRTOS.h>

void TaskBlink( void *pvParameters );
void TaskAnalogRead( void *pvParameters );

void setup() {

  xTaskCreate(
    TaskBlink
    ,  (const portCHAR *)"Blink"
    ,  128  // Stack size
    ,  NULL
    ,  2  // priority
    ,  NULL );

  xTaskCreate(
    TaskAnalogRead
    ,  (const portCHAR *) "AnalogRead"
    ,  128 // This stack size can be checked & adjusted by reading Highwater
    ,  NULL
    ,  1  // priority
    ,  NULL );

}

void loop()
{

}


void TaskBlink(void *pvParameters)
{
  (void) pvParameters;

  pinMode(13, OUTPUT);

  for (;;)
  {
    digitalWrite(13, HIGH); 
    vTaskDelay( 1000 / portTICK_PERIOD_MS );
    digitalWrite(13, LOW);
    vTaskDelay( 1000 / portTICK_PERIOD_MS );
  }
}

void TaskAnalogRead(void *pvParameters) 
{
  (void) pvParameters;

  Serial.begin(9600);

  for (;;)
  {
    int sensorValue = analogRead(A0);
    Serial.println(sensorValue);
    vTaskDelay(1);
  }
}



© digitrode.ru


Теги: Arduino, FreeRTOS




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий