Vastlopen van programma.
11 berichten
• Pagina 1 van 2 • 1, 2
Vastlopen van programma.
Beste Arduinoers,
Ik ben me rot aan het zoeken waarom het Arduino programma na 50 a 60 minuten iedere keer bevriest.
Ik heb een Due met een ethernet-shield.
Ik heb al getest met ledjes, welke gaan branden wanneer een bepaald gedeelte van het programma word uitgevoerd. Maar de Due lijkt steeds ergens anders te bevriezen.
Alle tips zijn welkom, alvast bedankt.
Ik ben me rot aan het zoeken waarom het Arduino programma na 50 a 60 minuten iedere keer bevriest.
Ik heb een Due met een ethernet-shield.
Ik heb al getest met ledjes, welke gaan branden wanneer een bepaald gedeelte van het programma word uitgevoerd. Maar de Due lijkt steeds ergens anders te bevriezen.
Alle tips zijn welkom, alvast bedankt.
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Vastlopen van programma.
Verlies je de connectie niet?
Laat anders je code hier zien en graag tussen de [ code2=cpp ] en [ /code2 ] tags (en dan zonder de spaties)
Laat anders je code hier zien en graag tussen de [ code2=cpp ] en [ /code2 ] tags (en dan zonder de spaties)
Re: Vastlopen van programma.
Het programma plaatsen is geen optie, veel te groot en diverse hulp programma 's (tabbladen).
Ik heb nu de watchdog aan staan. Tevens logt het programma alle gebeurtenissen in een eeprom.
Zie hieronder:
Van 11:04:19 tot 16:00:00 is 6x opnieuw gestart.
Wat zijn de redenen waardoor een programma kan vastlopen?
Alvast bedankt
Ik heb nu de watchdog aan staan. Tevens logt het programma alle gebeurtenissen in een eeprom.
Zie hieronder:
Van 11:04:19 tot 16:00:00 is 6x opnieuw gestart.
Wat zijn de redenen waardoor een programma kan vastlopen?
Alvast bedankt
Re: Vastlopen van programma.
Wat mij nu opvalt is dat het altijd xx:xx:19 dus altijd word er gestart op 19 seconden!
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Vastlopen van programma.
Zonder code komen we nergens. Je kan altijd de hele zaak zippen en als bijlage toevoegen. Anders wordt het wel een erg uitgebreid gokspel
Re: Vastlopen van programma.
het zijn telkens 51 minuten is 3060 seconden.
of er staat ergens in je programma een declaratie in de loop, of een subroutine. dus een probleem met je stack.
of er staat ergens in je programma een declaratie in de loop, of een subroutine. dus een probleem met je stack.
paul deelen
shooter@home.nl
shooter@home.nl
Re: Vastlopen van programma.
Het lijkt inderdaad op iets van een stack probleem.
Ik log nu delen naar een log bestand op de SD.
Ik maak gebruik van routines; dus iedere 00 seconden, van iedere minuut word er naar een routine gegaan "time_check()". Deze kijkt of een "gebeurtenis groep", in de directory "/domotica/events" op de SD aanwezig is. De gebeurtenissen in die map worden stuk voor stuk geopend en bekeken of de voorwaarden in het betreffende INI bestand aan de huidige situatie voldoet.
Wanneer de voorwaarden kloppen, worden de apparaten die bij deze groep horen, stuk voor stuk doorgestuurd naar de routine "event_go(event_bestand" in deze routine worden de acties uitgevoerd.
Wat ik in de log zie, is dat steeds op een andere plek in de routine (subtijd) of (time_check) een vastloper plaats vind en dus een wachtdog reset word uitgevoerd.
Een stukje loging:
12:01:00 > Subtijd LCD Start
Free Ram: -444
12:01:00 > Subtijd LCD Eind
Free Ram: -444
12:01:00 > Subtijd timer == 0 Eind
Free Ram: -444
En nog eentje:
10:06:00 > Time_Check: weekday
Free Ram: -724
10:06:00 > Time_Check: periode
Free Ram: -724
10:06:00 > Time_Check: event_time = htijd
Free Ram: -724
Wat mij ook niet duidelijk is, free Ram geeft meestal negatieve waardes?
csharp code
en
csharp code
csharp code
Alvast vriendelijk dank.
Ik log nu delen naar een log bestand op de SD.
Ik maak gebruik van routines; dus iedere 00 seconden, van iedere minuut word er naar een routine gegaan "time_check()". Deze kijkt of een "gebeurtenis groep", in de directory "/domotica/events" op de SD aanwezig is. De gebeurtenissen in die map worden stuk voor stuk geopend en bekeken of de voorwaarden in het betreffende INI bestand aan de huidige situatie voldoet.
Wanneer de voorwaarden kloppen, worden de apparaten die bij deze groep horen, stuk voor stuk doorgestuurd naar de routine "event_go(event_bestand" in deze routine worden de acties uitgevoerd.
Wat ik in de log zie, is dat steeds op een andere plek in de routine (subtijd) of (time_check) een vastloper plaats vind en dus een wachtdog reset word uitgevoerd.
Een stukje loging:
12:01:00 > Subtijd LCD Start
Free Ram: -444
12:01:00 > Subtijd LCD Eind
Free Ram: -444
12:01:00 > Subtijd timer == 0 Eind
Free Ram: -444
En nog eentje:
10:06:00 > Time_Check: weekday
Free Ram: -724
10:06:00 > Time_Check: periode
Free Ram: -724
10:06:00 > Time_Check: event_time = htijd
Free Ram: -724
Wat mij ook niet duidelijk is, free Ram geeft meestal negatieve waardes?
csharp code
void sub_tijd (bool nu) {
//sdlog("Subtijd Start");
delay(1);
// digitalWrite(3, HIGH);
if (timer > 499) {
timer = 0;
}
if (timer == 0) timingvoorminit++;
if (timer == 0 or nu == true) {
sdlog("Subtijd timer == 0 Start");
sdlog("Subtijd Readtime Start");
readTime();
sdlog("Subtijd Readtime Eind");
// DateTime for TimeLord
suntime[1] = minute; // Minuten
suntime[2] = hour; // Uur
suntime[3] = monthday; // Dag
suntime[4] = month; // Maand
suntime[5] = year; // Jaar
lhour = hour;
lday = monthday;
lmonth = month;
lweekday = weekday;
//loc.DST(suntime);
// Zomertijd berekening, wanneer deze aanstaat.
//if (setsummertime == true && IsDst(monthday, month, weekday)) { // Zomertijd
sdlog("Subtijd Summertime calc Start");
if (setsummertime == true and IsDst(monthday, month, weekday)) { // Zomertijd
lhour++;
if (lhour > 23) {
lhour = 0;
lday++;
if (lmonth == 3 && lday > 31 || lmonth == 4 && lday > 30 || lmonth == 5 && lday > 31 || lmonth == 6 && lday > 30 || lmonth == 7 && lday > 31 || lmonth == 8 && lday > 31 || lmonth == 9 && lday > 30) {
lday = 1;
lmonth++;
}
lweekday++;
if (lweekday > 7)
lweekday = 1;
} // lhour
} // IsDstn
sdlog("Subtijd Summertime calc Eind");
if (log_start == false) {
log_start = true;
log_write(0, 0, 0, 0);
}
htijd = (lhour * 60) + minute;
if (minute != last_minute) {
last_minute = minute;
sdlog("Subtijd Time_Check Start");
time_check();
sdlog("Subtijd Time_Check Eind");
}
sdlog("Subtijd LCD Start");
if (logo_showing == true) reset_display(); logo_showing = false;
char bw[4];
snprintf(bw, 3, "%02d", lday);
sendStrXY (bw , 0, 0);
snprintf(bw, 3, "%02d", lmonth);
sendStrXY (bw , 0, 3);
snprintf(bw, 4, "%02d", year);
sendStrXY (bw , 0, 6);
sendStrXY ("-" , 0, 2);
sendStrXY ("-" , 0, 5);
if (lhour == hour) {
sendStrXY ("Z0" , 0, 13);
loc.TimeZone(1 * 60);
zomertijd = false;
} else {
sendStrXY ("Z1" , 0, 13);
loc.TimeZone(2 * 60);
zomertijd = true;
}
snprintf(bw, 3, "%02d", lhour);
sendStrXY (bw , 2, 0);
snprintf(bw, 3, "%02d", minute);
sendStrXY (bw , 2, 3);
//printstring
//char* buf = shortday[lweekday].toCharArray();
sendStrXY((char*)shortday[lweekday] , 2, 12);
if (puntknip == false) {
sendStrXY (":" , 2, 2);
//digitalWrite(ledPin, HIGH);
puntknip = true;
} else {
sendStrXY (" " , 2, 2);
//digitalWrite(ledPin, LOW);
puntknip = false;
}
// Zons opkomst
loc.SunRise(suntime);
sendStrXY ("Z.OP:", 4, 0 );
//int zono;
char tuur[4];
char tmin[4];
hzonop = suntime[2] * 60 + suntime[1];
snprintf(tuur, 3, "%02d", suntime[2]);
snprintf(tmin, 3, "%02d", suntime[1]);
sunrise[0] = suntime[2];
sunrise[1] = suntime[1];
sendStrXY (tuur , 4, 6);
sendStrXY (":" , 4, 8);
sendStrXY (tmin , 4, 9);
// Zon onder
loc.SunSet(suntime);
sendStrXY ("Z.ON:", 6, 0 );
hzononder = suntime[2] * 60 + suntime[1];
snprintf(tuur, 3, "%02d", suntime[2]);
snprintf(tmin, 3, "%02d", suntime[1]);
sunset[0] = suntime[2];
sunset[1] = suntime[1];
sendStrXY (tuur , 6, 6);
sendStrXY (tmin , 6, 9);
sendStrXY (":" , 6, 8);
sdlog("Subtijd LCD Eind");
sdlog("Subtijd timer == 0 Eind");
}
timer++;
if (timingvoorminit >= 120) { // 1x per minuut word dit uitgevoerd.
sdlog("Subtijd Minute Timer Start (voor NTP)");
timingvoorminit = 0;
if (defntpt > 0 && defntps[0] > 0) {
ntpt++;
if (ntpt >= defntpt) {
sdlog("Subtijd NTP Start");
ntp(60);
sdlog("Subtijd NTP Eind");
}
} else {
ntpt = 0;
}
sdlog("Subtijd Minute Timer End (voor NTP)");
}
// digitalWrite(3, LOW);
}
en
csharp code
void event_go(String event_bestand, String emailtype) {
//String ss = event_bestand.substring(16);
//Serial.println(event_bestand);
//Serial.println(ss);
//log_write(1, 1, ss.toInt(), 1);
// Show logo
logo_showing = true;
reset_display();
for (int i = 0; i < 128 * 8; i++) // show 128* 64 Logo
SendChar(pgm_read_byte(logo + i));
char event_fn[50];
char sel_fn[50];
char dg_fn[50];
String sel_bestand;
String s;
char fn[50];
event_bestand.toCharArray(fn, event_bestand.length() + 1);
String action = readconfig(fn, "event_action");
String ename = readconfig(fn, "event_name");
sdlog("Event_Go: Email Start");
emailsubject = "Home controller start (" + emailtype + ") event!";
emailbody = "Starting event: ";
emailbody += ename;
emailbody += "\n\n";
sel_bestand = event_bestand.substring(0, event_bestand.length() - 3) + "SEL";
event_bestand.toCharArray(event_fn, event_bestand.length() + 1);
//Serial.println(sel_bestand);
int rn = 0;
int i;
String sel_file = "";
String best;
sdlog("Event_Go: While Start");
while (true) {
WDT_Restart( WDT );
String sel_file = read_regel_from_file(sel_bestand, rn);
if (sel_file.length() == 0) break;
i = sel_file.indexOf("=");
sel_file = sel_file.substring(0, i - 1);
//sel_file = sel_file.trim();
//String sel = sel_file.substring(0,i);
if (sel_file.substring(0, 3) == "app") { // laad gegevens uit app dir en bestanden
sel_file = sel_file.substring(4);
best = "/domotica/app/" + sel_file + ".INI";
char fn[50];
best.toCharArray(fn, best.length() + 1);
String mode = readconfig(fn, "app_mode");
String type = readconfig(fn, "app_type");
String adres = readconfig(fn, "app_address");
String name = readconfig(fn, "app_name");
//digitalWrite(ledPin, LOW);
delay(15);
sdlog("Event_Go: mode = normal Start");
if (mode == "normal") {
sdlog("Event_Go: Type = kaku Start");
if (type == "kaku") { // Alleen KaKu ondvanger nog geimplementeerd
char ad1 = adres.charAt(0);
String tm = adres.substring(1);
int ad2 = tm.toInt();
if (action == "off") {
kaKuTransmitter.sendSignal(ad1, ad2, false);
writeconfig(fn, "onoff", action);
log_write(1, 3, sel_file.toInt(), 0);
emailbody += name;
emailbody += " = OFF \n";
} // kaku = off
if (action == "on") {
kaKuTransmitter.sendSignal(ad1, ad2, true);
writeconfig(fn, "onoff", action);
log_write(1, 3, sel_file.toInt(), 1);
emailbody += name;
emailbody += " = ON \n";
} // kaku = on
} // Kaku
sdlog("Event_Go: Type = kaku End");
writeconfig(fn, "last_comm", action);
} // if normal
sdlog("Event_Go: mode = normal End");
} // is app
if (sel_file.substring(0, 3) == "grp") { // laad gegevens uit groep
// Nog niet aanwezig
sel_file = sel_file.substring(4);
}
rn++;
} // while
String last = String( year, DEC) + "-" + String(month) + "-" + String(monthday, DEC) + " " + String(hour, DEC) + ":" + String(minute, DEC);
writeconfig(fn, "last", last);
s = readconfig(event_fn, "event_random");
int ran = s.toInt();
ran = abs(ran);
ran = random(0 - ran , ran);
writeconfig(event_fn, "random", (String) ran);
sendemail();
sdlog("Event_Go: SendEmail!");
}
csharp code
void time_check() {
long event_time = -1;
String s;
File dir;
sdlog("Time_Check Open: (SD.open)");
dir = SD.open("/domotica/event/");
while (true) {
WDT_Restart( WDT );
File bestand = dir.openNextFile() ;
if (bestand) {
String bestand_name = "/domotica/event/";
bestand_name += bestand.name();
if (bestand_name.substring(bestand_name.length() - 4) == ".INI") {
sdlog("Time_Check Open: (openNextFile): " + bestand_name);
//Serial.println(bestand_name);
char fn[50];
bestand_name.toCharArray(fn, bestand_name.length() + 1);
sdlog("Time_Check Open: (configfile): Start");
String event_type = readconfig(fn, "event_type");
String weekdays = readconfig(fn, "weekdays");
String combination = readconfig(fn, "event_combination");
String ename = readconfig(fn, "event_name");
sdlog("Time_Check Open: (configfile): End");
String tmp;
tmp = readconfig(fn, "periode_van");
int periode_van = tmp.toInt();
tmp = readconfig(fn, "periode_tot");
int periode_tot = tmp.toInt();
//Serial.print(event_type);
//Serial.println("<");
int ok = 0;
sdlog("Time_Check HZON op/onder");
if (hzonop > 0 or hzononder > 0) {
if (event_type == "sun") {
ok = ok + 2;
String event_sun = readconfig(fn, "event_sun");
if (event_sun == "rise") { // Zon Opkomst
event_time = hzonop;
} else { // Zon Ondergang
event_time = hzononder;
}
s = readconfig(fn, "event_sun_fn");
int ti = s.toInt();
s = readconfig(fn, "random");
int ra = s.toInt();
event_time = event_time + ti + ra;
if (event_time < 0) event_time = (24 * 60) - event_time;
if (event_time > 24 * 60) event_time = event_time - (24 * 60);
}
}
WDT_Restart( WDT );
sdlog("Time_Check event_type = time");
if (event_type == "time") {
s = readconfig(fn, "event_time");
int et = s.toInt();
if (et > 0) {
int e1 = (et / 100);
int e2 = (et - (e1 * 100));
event_time = (e1 * 60) + e2;
s = readconfig(fn, "random");
int ra = s.toInt();
event_time = event_time + ra;
}
if (combination == "day") {
if (htijd >= hzonop && htijd < hzononder) ok = ok + 2;
} else if (combination == "night") {
if (htijd >= hzononder or htijd < hzonop) ok = ok + 2;
} else {
ok = ok + 2;
}
}
String nrt = bestand_name.substring(16);
int num;
num = nrt.indexOf(".");
nrt = nrt.substring(0, num);
WDT_Restart( WDT );
sdlog("Time_Check: weekday");
if (lweekday == 1 && weekdays.indexOf("dag_maa") > -1) ok = ok + 1;
if (lweekday == 2 && weekdays.indexOf("dag_din") > -1) ok = ok + 1;
if (lweekday == 3 && weekdays.indexOf("dag_woe") > -1) ok = ok + 1;
if (lweekday == 4 && weekdays.indexOf("dag_don") > -1) ok = ok + 1;
if (lweekday == 5 && weekdays.indexOf("dag_vry") > -1) ok = ok + 1;
if (lweekday == 6 && weekdays.indexOf("dag_zat") > -1) ok = ok + 1;
if (lweekday == 7 && weekdays.indexOf("dag_zon") > -1) ok = ok + 1;
tmp = String(periode_van,DEC);
int pvl = tmp.length();
tmp = String(periode_tot,DEC);
int ptl = tmp.length();
sdlog("Time_Check: periode");
WDT_Restart( WDT );
int tm = 0;
if (periode_van == 0 or periode_tot == 0) {
ok = ok + 4;
} else if (pvl < 3 && ptl < 3) { // van / tot alleen dag vergelijking.
if (lday >= periode_van && lday <= periode_tot) ok = ok + 4;
} else if (pvl < 5 && ptl < 5) { // van / tot alleen maand en dag vergelijking.
tm = (lmonth * 100) + lday;
if (tm >= periode_van && tm < periode_tot) ok = ok + 4;
} else if (pvl == 6 && ptl == 6) { // van / tot jaar /maand en dag vergelijking.
tm = (year * 10000) + (lmonth * 100) + lday;
if (tm >= periode_van && tm < periode_tot) ok = ok + 4;
} else {
ok = ok + 4;
}
sdlog("Time_Check: event_time = htijd");
WDT_Restart( WDT );
if (event_time == htijd && ok > 6) { // event voldoet aan de tijd!
log_write(1, 1, nrt.toInt(), 0);
sdlog("Time_Check: event_go Start");
event_go(bestand_name,"Automatic");
sdlog("Time_Check: event_go End");
event_time = -1;
} // if event_time
} // if bestandsname =
} else {
sdlog("Time_Check: Break");
break;
}
delay(1);
} // while
}
Alvast vriendelijk dank.
Re: Vastlopen van programma.
free ram negatief kan heel goed dat betekent dat het hoogste bitje aan is, dat is in een normale INT dus het sign bitje. als jet het logt als een UINT dan gaat het beter.
paul deelen
shooter@home.nl
shooter@home.nl
Re: Vastlopen van programma.
He he na vele uren zoeken, heb ik een oplossing
Er bleek geen fout in programma te zitten. Ik heb de routine met veel vergelijkingen, berekeningen en acties
in meerdere procedures verdeeld, om zo makkelijker te vinden in welke deel de Due vast loopt. Echter na het opsplitsen, loopt het programma niet meer vast. Inmiddels draait deze al meer dan 12 uur.
Maar dan blijft natuurlijk wel de vraag waarom het programma na 59 minuten vast liep?
Er bleek geen fout in programma te zitten. Ik heb de routine met veel vergelijkingen, berekeningen en acties
in meerdere procedures verdeeld, om zo makkelijker te vinden in welke deel de Due vast loopt. Echter na het opsplitsen, loopt het programma niet meer vast. Inmiddels draait deze al meer dan 12 uur.
Maar dan blijft natuurlijk wel de vraag waarom het programma na 59 minuten vast liep?
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Vastlopen van programma.
Als jij nog weet wat je allemaal hebt veranderd.... dan zou je het moeten kunnen vertellen. Als je alleen maar hebt zitten veranderen in de hoop dat het niet meer optreed heb je een prachtig gevalletje van symptoombestrijding uitgevoerd en in feite niets geleerd (behoudens dat opdelen van een groot probleem handiger is in in kleinere overzichtelijke) waardoor het een volgende keer in een andere vorm weer kan optreden.
11 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten