while(1) Laufbedinung bricht ab

Gast #4929413
Lesenswert?

Die Laufbedingung  bricht ab und das Programm startet von beginn (Wie 
RESET). Wenn Variablen fahrt_counter = 0;  counter_endwert = 0 in 
PrintData() gelöscht werden, wiederholt die    while (fahrt_counter > 3) 
problemlos. wenn ich Variable fahrt_counter = 0;  counter_endwert = 0 
dazu schreibe, bricht die Laufbedingung der while (fahrt_counter > 3) 
aber auch while(1) !!!! warum ? kann jemand mir das erklären warum mein 
Code so läuft. Danke

1
int main ()  {
2
Konf_GPIO();
3
Konf_Timer();
4
Konf_SPI_MASTER(); 
5
Konf_ADC();
6
sei();
7
Dummy_Readout_ADC();
8
Konf_Motor();
9

10
 while (1) {
11

12
    if (counter_Umax > counter_Umax_alt && counter_Umax < 10) {
13
      E_Umax += 10;
14
      counter_Umax_alt = counter_Umax;
15
    }
16

17
   ...
18
   ...Funktionen(); 
19

20
    PrintData();
21
    while ((micros() - timer_ms[0]) < 1000 * dt);
22
  }
23

24
}
25

26

27

28
void PrintData() {
29

30
  if (sollwert == endwert) {
31
    if (counter_endwert % slope == 0) {
32
      fahrt_counter++;
33
      zeitrampe = 0;
34
      while (fahrt_counter > 3) {
35
        if (fahrt_counter < 5) {
36
          print_Data_speicher();
37
        }
38
        counter++;
39
        _delay_ms(20);
40
        ADC_einzelmessungen();
41
        standby(1);
42
        if (counter % 100 == 0) {
43
          printFile();
44
          fahrt_counter = 0;
45
          counter_endwert = 0;
46
          counter_Umax++;
47
          _delay_ms(1000);
48
        }
49
        fahrt_counter++;
50
      }
51
    }
52
    counter_endwert++;
53
  }
54
}
#4929429
Lesenswert?

Der Fehler dürfte im nicht geposteten Code zu finden sein.
Ein while (1){...} wird regulär nur durch break oder goto verlassen.

Du könntest aber auch Fehler wie Stack Overflows im Code drin haben, das 
gibt dann gar lustige Folgen. Oder der Controller geht in den Reset und 
das Programm startet dadurch neu.
Gast #4929434
Lesenswert?

Das hat auf jeden Fall keinen Einfluss. Das Problem wo anderes. warum 
wird die Laufbedingung der While(1) abgebrochen.
1
 
2
    if ((counter_Umax > counter_Umax_alt) && (counter_Umax < 10)) {
3
      E_Umax += 10;
4
      counter_Umax_alt = counter_Umax;
5
    }
Gast #4929503
Lesenswert?

Dann schreib' Dir doch mal hinter die while-Schleife in main einen 
Debugmarker (gib' was aus, lass eine LED angehen...) und mach danach 
eine leere while(1) Schleife.

Damit solltest Du sehen können, ob die Schleife sauber abgebrochen wird 
oder doch etwas anderes (wie andere schon geschrieben haben) der Grund 
ist.
Gast #4929578
Lesenswert?

Gegen stack overflow compiliert man z.B. bei GCC mit der Option 
-fstack-usage. Dann sucht man sich den Codepfad mit der schlimmsten 
Stackbenutzung anhand der .su-Dateien raus, addiert noch die Interrupts 
drauf, plus ein wenig Sicherheitsreserve (etwa 512-1024 Bytes) und schon 
weiß man, was man braucht.

Sonst hast Du das Problem, daß es scheinbar läuft, aber sobald die 
Interrupts ausgerechnet im Moment maximaler Stackbenutzung kommen, 
knallt es gelegentlich trotzdem. Sehr schwer zu debuggen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren