Multitarefa com FreeRTOS no Arduino

A IDE do Arduino possui compatibilidade com muitos dispositivos além de possuir uma ampla gama de bibliotecas disponíveis ao alcance do usuários, mas o ambiente de programação da IDE é limitado a apenas setup() e loop() e não suporta multitarefas de forma eficaz. Esta é uma implementação simples, fácil de usar e robusta do FreeRTOS que pode ser integrada na IDE como uma biblioteca e permitir o uso das melhores partes de ambos os ambientes sem problemas.

Se você perdeu nosso primeiro papo sobre multitarefas no Arduino, você pode acessar aqui: A FUNÇÃO MILLIS() E PORQUE NÃO USAR A FUNÇÃO DELAY()

Como funciona?

A maioria dos sistemas operacionais permitem múltiplos programas ou threads serem executadas ao mesmo tempo. Isso é chamado de multitarefa, ou multi-tasking. Na realidade, cada núcleo de processamento pode executar somente uma tarefa por vez independente de seu poder ou velocidade porém, uma parte do sistema operacional chamada de scheduler, em português Agendador/Programador, é responsável por decidir qual tarefa executar e quando executar, dessa forma trazendo a ilusão de estarem executando ao mesmo tempo por realizar uma rápida transição entre cada programa.

agendador em um Sistema operacional de tempo-real, Real Time Operating System (RTOS), é projetado para fornecer um padrão de execução previsível (normalmente descrito como determinístico). Isso é particularmente interessante para os sistemas embarcados, como os Arduinos, por exemplo, que geralmente têm requisitos de tempo real.

Os agendadores de sistemas de tempo-real tradicionais, como o agendador usado no FreeRTOS, alcançam o determinismo ao permitir que o usuário atribua uma prioridade a cada segmento de execução. O agendador então usa a prioridade para saber qual o segmento de execução a ser executado em seguida.

Vamos começar

Primeiramente na IDE vá ao menu “Gerenciar Bibliotecas (EN: Library Manager)”, disponível a partir da versão 1.6.8, procure pela FreeRTOS digitando na busca a palavra: “RTOS“, clique em “Instalar” e aguarde o final da instalação.

Buscando pela FreeRTOS

Garanta que está usando a versão mais recente da biblioteca FreeRTOS. No momento em que este artigo foi escrito a versão mais recente é v9.0.0-1.

Testando

Agora vamos usar um exemplo da biblioteca que conta com o gerenciamento através da biblioteca simplesmente colocando #include <Arduino_FreeRTOS.h> no início do código. Este exemplo, Blink_AnalogRead.ino, é uma boa forma de começar, já combinando dois exemplos básicos do Arduino, Blink e AnalogRead, em um único sketch e mantendo as duas tarefas separadas.

Código

#include <Arduino_FreeRTOS.h>

// define as duas tarefas, Blink e AnalogRead
void TaskBlink( void *pvParameters );
void TaskAnalogRead( void *pvParameters );

void setup() {
  
  // inicializa a comunicação serial a 115200 bits/s:
  Serial.begin(115200);
  
  while (!Serial) {
    ; // Somente para placas que usam ATMEGA 32u4.
  }

  // Criando as tarefas (Tasks)
  xTaskCreate(
    TaskBlink
    ,  (const portCHAR *)"Blink" // Nome
    ,  128 // Stack size
    ,  NULL
    ,  2  // Prioridade
    ,  NULL );

  xTaskCreate(
    TaskAnalogRead
    ,  (const portCHAR *) "AnalogRead" // Nome
    ,  128  // Stack size
    ,  NULL
    ,  1  // Prioridade
    ,  NULL );
}

void loop()
{
  // Vazio. Todo trabalho já foi feito nas Tasks.
}

/*---------------------- Tasks ---------------------*/

void TaskBlink(void *pvParameters)  // Isto é uma tarefa
{
  (void) pvParameters;
  pinMode(LED_BUILTIN, OUTPUT);

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

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

Logo mais falaremos sobre aplicações de baixo consumo ou alimentadas por baterias onde é possível utilizar o FreeRTOS mesmo nos modos de redução de consumo dos AVR.

Thanks to Phillip Stevens.

 

0

Graduando em Engenharia Elétrica pela Universidade Federal de São João del Rei (UFSJ) também é Técnico em Eletrotécnica pelo Centro Federal de Educação Tecnológica de Minas Gerais (CEFET-MG). Apaixonado por criação e desenvolvimento de projetos relacionados à software e hardware.

1 Comentário

  1. Muy bueno su aporte.
    Me gustaría saber cómo embeber freertos en arduino y win 32.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *