RTOS
Escrito por Gabriel Aleksandravicius
#
ApresentaçãoO propósito dessa página é:
- Apresentar multitasking com Arduino vanilla
- Apresentar conceito de RTOS
- Definir sistema operacional
- Definir multitasking
- Fornecer casos de uso
- Comparar esses dois conceitos, trazendo vantagens e desvantagens deles
- Concluir se é válido implementar RTOS nos nossos projetos
- Avaliar RTOS que podemos implementar e como fazê-lo
- RTOS + state machine
#
Multitasking no Arduino vanillaQuando começamos nosso aprendizado com Arduino, geralmente realizamos tarefas simples e vamos tornando-a mais complexa com o tempo. Começamos com o 'hello world' do mundo dos embarcados, que é piscar um LED em uma frequência determinada. Depois, adicionamos mais LEDs. Em seguida podemos testar outras coisas, como atuar um servo ou fazer leituras com um sensor. Por fim, o próximo desafio é, naturalmente, testar fazer tudo isso ao mesmo tempo. E como fazemos isso?
Pra responder a essa pergunta, vejamos um exemplo mais simples: como piscar dois leds em frequências diferentes.
delay()
#
Piscando com O código básico dentro de loop()
para piscar um LED se parece com isso:
delay()
#
Piscando sem Essa estrutura é factível para códigos simples, porém um grande problema reside no uso da função delay()
: ela interrompe a execução de praticamente qualquer outro bloco de código. Portanto, não podemos piscar dois LEDs com frequências diferentes.
A solução fornecida na própria documentação do Arduino é a seguinte:
Deixamos de usar a função delay()
e, no lugar, implementamos a contagem de tempo com millis()
. Temos uma variável global, intervalRed
, responsável por determinar o intervalo do LED vermelho. Também temos uma variável responsável por armazenar o último momento em que o LED mudou de estado (previousTimeRed
) e uma variável para armazenar o estado (ledStateRed
). O mesmo vale para o outro LED. Dentro de loop()
a função millis()
é chamada e seu valor de retorno (quantidade de tempo passado desde o início do programa) é armazenado em currentTime
. O bloco de código a seguir faz a verificação do tempo, checando se o tempo passado desde a última mudança de estado já é maior ou igual ao intervalo pré-estabelecido pro LED. Se sim, o estado do LED é alterado.
dica
Embora tenha resolvido o problema do delay, o código ficou muito repetitivo dessa forma. Veja uma solução mais elegante aqui.
#
Multitasking com RTOSA solução empregada no tópico anterior é válida e muito pode ser feito seguindo o mesmo princípio - poderíamos trocar os LEDs por sensores que fazem a leitura em frequências diferentes, por exemplo. Então por que usar um RTOS? Pra responder a isso, primeiro vejamos o que é um RTOS.