Vastlopen van programma.

algemene C code
Berichten: 22
Geregistreerd: 26 Okt 2014, 14:17

Vastlopen van programma.

Berichtdoor stanleyvc » 16 Nov 2014, 23:48

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.

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vastlopen van programma.

Berichtdoor nicoverduin » 17 Nov 2014, 08:55

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)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 22
Geregistreerd: 26 Okt 2014, 14:17

Re: Vastlopen van programma.

Berichtdoor stanleyvc » 17 Nov 2014, 19:42

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:
log.JPG
log
log.JPG (33.52 KiB) 8438 keer bekeken

Van 11:04:19 tot 16:00:00 is 6x opnieuw gestart.

Wat zijn de redenen waardoor een programma kan vastlopen?

Alvast bedankt

Berichten: 22
Geregistreerd: 26 Okt 2014, 14:17

Re: Vastlopen van programma.

Berichtdoor stanleyvc » 18 Nov 2014, 07:11

Wat mij nu opvalt is dat het altijd xx:xx:19 dus altijd word er gestart op 19 seconden!

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vastlopen van programma.

Berichtdoor nicoverduin » 18 Nov 2014, 10:23

Zonder code komen we nergens. Je kan altijd de hele zaak zippen en als bijlage toevoegen. Anders wordt het wel een erg uitgebreid gokspel :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4068
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Vastlopen van programma.

Berichtdoor shooter » 20 Nov 2014, 12:51

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.
paul deelen
shooter@home.nl

Berichten: 22
Geregistreerd: 26 Okt 2014, 14:17

Re: Vastlopen van programma.

Berichtdoor stanleyvc » 22 Nov 2014, 13:45

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
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.

Berichten: 4068
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Vastlopen van programma.

Berichtdoor shooter » 22 Nov 2014, 16:48

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

Berichten: 22
Geregistreerd: 26 Okt 2014, 14:17

Re: Vastlopen van programma.

Berichtdoor stanleyvc » 29 Nov 2014, 13:29

He he na vele uren zoeken, heb ik een oplossing :D

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?

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Vastlopen van programma.

Berichtdoor nicoverduin » 29 Nov 2014, 19:38

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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Volgende

Terug naar C code

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten