Таймер перехватывает управление
- Войдите на сайт для отправки комментариев
Вс, 01/10/2017 - 09:52
Arduino MEGA + Ethernet W5100 + 40-50 датчиков. Без таймера все работало без нареканий. Понадобилось добавить таймер. Использовал MsTimer2:
#include <MsTimer2.h>
#include <PubSubClient.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include "utils.h"
//#include <Ethernet.h>
#include "avr\wdt.h"
#include "Mqtt.h"
#include "configuration.h"
#include "Action.h"
#include "Relay.h"
#include <Arduino.h>
#include "definitions.h"
#include "global.h"
#include "Button.h"
#include "Loger.h"
#include "utils.h"
void Timer2() { //it is started every 100ms
Config.loop01(); //100ms
Config.counter01++;
if (Config.counter01 % 5 == 0) { //500ms
Config.loop05();
Config.counter05++;
if (Config.counter01 % 10 == 0) { //1sec
Config.loop1();
Config.counter1++;
if (Config.counter01 % 600 == 0) { //1min
Config.loop60();
Config.counter60++;
if (Config.counter01 % 3000 == 0) { //5min
Config.loop300();
Config.counter300++;
}
}
}
}
}
void setup() {
wdt_disable();
Serial.begin(115200);
while (!Serial) {
delay(10); // wait for serial port to connect. Needed for native USB port only
}
//init random generator
randomSeed(analogRead(0));
//initialization of config
Config.Init();
Loger::Info("Board is ready");
Loger::Info("Board Id:" + String(Config.BoardId));
Loger::Info("IP Address is:" + PrintIP(Ethernet.localIP()));
//Set a timer
MsTimer2::set(100, Timer2);
MsTimer2::start();
pinMode(13, OUTPUT);
digitalWrite(13, HIGH);
Loger::Debug("Enjoy!");
}
// the loop function runs over and over again until power down or reset
void loop() {
Config.MainLoop();
}
И начались проблемы зависания контроллера. Отладка выявила, что первые пару минут все работает как задумано - loop сам по себе, таймер сам по себе. А через несколько минут остается работать только таймер, а loop уже не вызывается. Что это может быть? Не мог ли я каким-то датчиком сбить нормальную работу?
Раз в пять минут у Вас будет выполняться сразу пять функций:
все за раз.
Текста этих функций нет. Вы уверены, что они (все пять по очереди) выполняются быстрее, чем 100ms?
На данный момент все, кроме одной, эти функции пустые. Поэтому выполнятся заметно быстрее, чем 100 мс. Но за идею спасибо. Действительно, в "1 мин" функции у меня идет отсылка WatchDog, которая вполне может и быть длиннее, если сеть споткнется. Придется что-то выдумывать с очередью...