Manual
do
Maker
.
com
O timer é um dos recursos de interrupção utilizados para disparar eventos de forma assíncrona, de tal modo que seu programa mantém uma execução normal e no estouro do timer, o programa salta para o evento para atender a interrupção. Isso lhe dá a liberdade que você não teria se durante o fluxo de um programa você tivesse que parar dentro de uma função no loop para fazer verificação.
Além da liberdade, você consegue maior precisão no tempo, porque se seu programa tiver delay em qualquer função (como por exemplo, um delay em um SYNACK na rede) você já não teria mais precisão no tempo de um checker, ou seja, você não consegue utilizar tempo como parâmetro dentro de um loop com um incrementador.
A utilização de timer se prevalece de um recurso independente do fluxo principal do programa e no caso específico do ESP8266, você encontra 2 tipos diferentes de interrupção. Trataremos aqui de apenas um desses tipo, mas vamos fazer uma introdução de ambos.
Esse timer é baseado em software e suporta a geração de vários timers (provavelmente mais timers do que você poderá utilizar como hobista). Por ser baseado em software, já pode-se deduzir que ele tem menos acuidade do que o timer por hardware, mas não há dúvida de que é melhor do que qualquer solução paleativa e desse recurso que traterei de exemplificar. Os fatores que podem prejudicar sua acuidade são os recursos periféricos como o próprio WiFi e a percepção dessa imprecisão pode ser maior em menores intervalos. O exemplo aqui será para uma interrupção longa porque o propósito desse post é ser um adendo ao próximo post (que está quase finalizado já) e nesse próximo post um longo tempo será aplicado à interrupção.
Infelizmente não achei 1 exemplo que fosse sobre a utilização do timer por hardware. Se alguém achar uma documentação a respeito, prometo estudá-la e implementar, então crio um post exclusivo tratando disso. É também por essa razão que veremos apenas interrupções do timer por software.
Eu mesmo não sigo sempre essa regra; quando você vai tratar uma interrupção (o timer é um tipo de interrupção), a função que trata o evento deve apenas setar uma flag e o tratamento deve ser feito no loop do programa. Mas eu mesmo me coloquei em condições de programação de quem programa com threads e nesses casos específicos eu não tenho vergonha e nem pudor em dizer que sim - eu faço uso de chamada de funções dentro de interrupções. Mas aqui no exemplo vou fazer bonitinho, afinal, é pra servir de exemplo.
Se você ainda não o fez, leia esse post onde trato de mostrar a configuração.
O yield() do ESP8266 tem uma diferença do Arduino. No ESP8266 o yield() é utilizado no lugar do delay() para não interromper as tarefas principais como o WiFi. Aprecie o código e divirta-se.
extern "C"{
#include "user_interface.h"
}
os_timer_t mTimer;
bool _timeout = false;
//Nunca execute nada na interrupcao, apenas setar flags!
void tCallback(void *tCall){
_timeout = true;
}
void usrInit(void){
os_timer_setfn(&mTimer, tCallback, NULL);
os_timer_arm(&mTimer, 1000, true);
}
void setup() {
Serial.begin(115200);
Serial.println();
//iniciar a interrupcao
usrInit();
}
void loop() {
//verificacao no loop
if (_timeout){
Serial.println("cuco!");
_timeout = false;
}
yield(); //um putosegundo soh pra respirar
}
Inscreva-se no nosso canal Manual do Maker Brasil no YouTube.
Próximo post a caminho!
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.