fbpixel
Etiquetas: ,

A multitarefa é a capacidade de um microcontrolador de executar várias tarefas ou processos no mesmo período de tempo. Na prática, um Arduino não pode executar tarefas em paralelo, mas pode organizar e executar uma série de tarefas umas a seguir às outras num espaço de tempo muito curto. Isto dá a ilusão de multitarefa. Neste artigo, veremos alguns exemplos de multitarefa.

Se o seu projeto exigir a execução de tarefas em paralelo (multithreading), terá de procurar outros microcontroladores ou microcomputadores.

Utilização de interrupções

Descrição

As interrupções permitem que o microcontrolador execute uma função quando ocorre um evento num dos pinos de interrupção. Em vez de ler constantemente o valor de um sensor, o programa só será acionado quando o valor do sensor mudar. Isto resolve uma série de problemas de disposição de tarefas.

Código

const byte interruptPin = 2;

void setup() {
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), onEvent, CHANGE);
}

void loop() {
}

void onEvent() {
  Serial.println(F("Action"));
}

Utilizar a função millis()

Descrição

A função millis() devolve uma variável longa sem sinal que representa o número de milissegundos decorridos desde que o microcontrolador foi ligado. Em particular, pode ser utilizada para executar uma ação quando um intervalo de tempo tiver decorrido sem bloquear o resto do programa.

Código

unsigned long currentTime=0;
unsigned long previousTime=0;
bool ledState=LOW;

void setup() {
  Serial.begin(9600);
}

void loop() {
  currentTime=millis();
  if((currentTime-previousTime)>200){
    previousTime=currentTime;
    Serial.println(F("Action "));
  }
}

Utilizar os temporizadores incorporados no microprocessador

Os temporizadores são registos do microcontrolador que são incrementados quando é recebido um impulso de relógio.

Utilização de bibliotecas de temporizadores

Existem muitas bibliotecas de gestão de tempo no Arduino. Regra geral, fazem interface com os registos de temporização do Arduino. Para citar as mais conhecidas: TimerOne.h MsTimer2.h, TimerThree.h

Utilização de bibliotecas de gestão de tarefas

Estas bibliotecas permitem que as tarefas sejam executadas de forma ordenada, dando a impressão de multithreading.

Os exemplos incluem TaskManager, ProcessScheduler, ArduinoThread ou encore FreeRTOS. Pode encontrar estas bibliotecas na lista de referências do Arduino.

Multitarefa com a placa Arduino Due

Para placas baseadas na arquitetura SAM, como o Arduino DUE, existe uma biblioteca que permite gerir várias tarefas em diferentes funções loop(). Isto também funciona para as placas Zero, MKRZero e MKR1000.

Microcontrolador multi-core: ESP32

O microcontrolador NodeMCU ESP32 tem um microprocessador dual-core e utiliza o sistema operativo FreeRTOS, o que lhe permite executar tarefas em paralelo.

Multithreading com o Raspberry Pi

O Raspberry Pi é um microcomputador, pelo que pode executar várias tarefas ao mesmo tempo. Além disso, o seu microprocessador tem quatro núcleos, pelo que pode ser multitarefa. É possível, por exemplo, executar vários scripts Python ou programas C++ (ou outros) ao mesmo tempo. Também pode utilizar bibliotecas multithreading num script Python.