Основы работы FreeRTOS на базе платы Arduino Nano в среде программирования Arduino IDE.

В данном уроке мы рассмотрим основы работы системы FreeRTOS на базе среды программирования Arduino IDE.

Для начало необходимо скачать библиотеку FreeRTOS:

Далее подключаем установленную библиотеку:

#include <Arduino_FreeRTOS.h>

Далее прописываем прототипы программ, которые будут участвовать в работе программы:

void TaskBlink1( void *pvParameters );

Для создание задачи мы используем следующую команду:

xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask );

  1. pvTaskCode – указатель на функцию, которая будет выполнять эту задачу.
  2. pcName – описательное имя для задачи, не где не используется системой FreeRTOS.
  3. usStackDepth –  количество памяти выделяемой под данную задачу.  Одно слово занимает 4 байта.  Таким образом число слов указанных в данной строке  необходимо умножить на 4 байта, для определения выделяемой памяти. Количество выделяемой памяти очень актуально, если использовать микроконтроллеры с очень маленькой оперативной памятью.
  4. pvParameters – входной параметр задачи, при отсутствии параметров пишем  NULL.
  5. uxPriority – приоритет задачи, от 0 (наименьший) и выше.
  6. pxCreatedTask –  используют для того чтобы пропустить обработчик созданной задачи или  для изменения приоритета задачи или ее удаления. Если нам это не нужно, пишем  NULL.

Сама программа имеет следующий шаблон:

void task1(void *pvParameters)
{
for(;;){
//Ваш код
           }
}
Для того, что бы планировщик мог распределять работу между программами, необходимо в программу вставить задержку, которая приостанавливает выполнения данной программы на определенное количество тиков:
vTaskDelay( const TickType_t xTicksToDelay );
 
Так как время тиков в разных случаях может быть разная, то для задания точного времени блокировки выполнения задачи воспользуемся следующей записью:
vTaskDelay(/ portTICK_PERIOD_MS );
где N — время в миллисекундах, на которое необходимо сделать паузу.
 
В нашей программе будет 3 светодиода, которые будут мигать со своей частотой.
 
Программный код:
 
#include <Arduino_FreeRTOS.h> 

void TaskBlink1( void *pvParameters );
void TaskBlink2( void *pvParameters );
void TaskBlink3( void *pvParameters );

void setup() {
xTaskCreate(TaskBlink1, "Blink1", 128, NULL, 2,NULL);
xTaskCreate(TaskBlink2, "Blink2", 128, NULL, 2, NULL);
xTaskCreate(TaskBlink3, "Blink3", 128, NULL, 2, NULL);
}

void loop()
{
// не чего не пишем
}

void TaskBlink1(void *pvParameters) // Это задача.
{
(void) pvParameters;
pinMode(4, OUTPUT);
for (;;) // задача должна никогда не прекращаться или прерываться
{
digitalWrite(4, HIGH); // включить светодиод 
vTaskDelay( 700 / portTICK_PERIOD_MS ); // ждать 0,7 секунды
digitalWrite(4, LOW); // выключить светодиод
vTaskDelay( 700 / portTICK_PERIOD_MS ); // ждать 0,7 секунды
}
}

void TaskBlink2(void *pvParameters)
{
(void) pvParameters;
pinMode(6, OUTPUT);
for (;;)
{
digitalWrite(6, HIGH); 
vTaskDelay( 1000 / portTICK_PERIOD_MS );
digitalWrite(6, LOW); 
vTaskDelay( 1000 / portTICK_PERIOD_MS ); 
}
}

void TaskBlink3(void *pvParameters) 
{
(void) pvParameters;
pinMode(5, OUTPUT);
for (;;)
{
digitalWrite(5, HIGH);
vTaskDelay( 300 / portTICK_PERIOD_MS ); 
digitalWrite(5, LOW);
vTaskDelay( 300 / portTICK_PERIOD_MS ); 
}
}