Таймер перехватывает управление

sigma_shig
Offline
Зарегистрирован: 30.12.2016

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 уже не вызывается. Что это может быть? Не мог ли я каким-то датчиком сбить нормальную работу?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Раз в пять минут у Вас будет выполняться сразу пять функций:

Config.loop01();
Config.loop05();
Config.loop1();
Config.loop60();
Config.loop300();

все за раз.

Текста этих функций нет. Вы уверены, что они (все пять по очереди) выполняются быстрее, чем 100ms?

sigma_shig
Offline
Зарегистрирован: 30.12.2016

На данный момент все, кроме одной, эти функции пустые. Поэтому выполнятся заметно быстрее, чем 100 мс. Но за идею спасибо. Действительно, в "1 мин" функции у меня идет отсылка WatchDog, которая вполне может и быть длиннее, если сеть споткнется. Придется что-то выдумывать с очередью...