
Introdução
O presente artigo tem como finalidade apresentar o sistema operacional de tempo real FreeRTOS e algumas de suas funcionalidades, para isso trara exemplos práticos utilizando FreeRTOS no ESP32.
Um SO nada mais é que um software que gerencia os recursos de Hardware e do Firmware de um sistema computacional, para microcontroladores são utilizados os sistemas operacionais RTOS (sistema operacional em tempo real), onde se diferem dos SO no tempo de resposta a eventos externos.
O Sistema operacional de código aberto FreeRTOS foi desenvolvido para ser integrado a microcontroladores, pois facilita o desenvolvimento de aplicações com multitarefas, onde o próprio faz toda a gerencia do ciclo de vida da tarefas (time slicing, prioridade, todo o escalonamento dos processos com algorítimos preemptivos).
Porque utilizar o FreeRTOS?
Alguns dos benefícios de utilizar o FreeRTOS em seus projetos:
- Simplicidade na programação.
- Kernel é bem desenvolvido.
- Tamanho pequeno, pode ser embarcado em microcontroladores com pouca memoria.
- Comunidade e documentação muito boa.
- Universal, roda em praticamente qualquer MCU.
- Código aberto.
- Lançamentos do suporte de longo prazo (LTS).
Exemplos de implementação no esp32
Para os exemplos de demonstração foi utilizado o microcontrolador esp32, com a versão de IDF v4.4.2.
Task FreeRTOS
Para criarmos tarefas no FreeRTOS utilizamos como exemplo o seguinte código:
- 3-4 : Inclusão das libs do FreeRTOS.
- 09 : Define o apelido dado a task criada.
- 10 : Define o tamanho de memoria alocado para a tarefa.
- 11 : Cada tarefa recebe uma prioridade de 0 a ( configMAX_PRIORITIES - 1 ), onde configMAX_PRIORITIES é definido dentro do FreeRTOSConfig.h.
- 20 : Declaração da tarefa, tem que ser do tipo void e com um ponteiro de void de argumento.
- 26 : Declaração do handle (identificador da tarefa).
- 31 : Declaração da variável para receber o retorno da função de criação de tarefas.
- 34 : Função de criação da tarefa
- 69 : Implementação da tarefa.(contem um loop infinito e não pode ter retorno).
- 74 : Tempo de pausa da tarefa, onde é passado uma macro de conversão (mili para tick), nas duas tarefas esse tempo é de 500 milisegundos.
xTaskCreate
Notamos que ela propaga o método "xTaskCreatePinnedToCore", onde nele é possível especificar o core onde a task será executada, por padrão o xTaskCreate utiliza o argumento "tskNO_AFFINITY", que permite que a tarefa seja executada em qualquer core livre.
No exemplo de implementação as linhas 37 e 51 recebem o valor NULL como argumento de pvParameters, porém pode-se passar qualquer ponteiro na criação, esse será recebido em *arg, na implementação da tarefa.
Saída do exemplo
Ao compilar e gravar o exemplo obtemos a seguinte saída:
Note que:
- A primeira tarefa a ser executada é a task_1, pois foi criada primeiro.
- Na segunda interação a ordem de execução é alterada, pois a prioridade da task_2 é maior.
- Ambas tem no print o mesmo valor de tick, isso porque o esp32 possui dois núcleos e como foi utilizado o argumento tskNO_AFFINITY como padrão cada uma foi executada em um core paralelamente.
Caso seja um iniciante em RTOS é indicado que leia a documentação completa contida na guia Referências. Pratique e mude os argumentos, troque as prioridades, mude o tempo de delay e faça uma análise das mudanças na execução.