while(1) Laufbedinung bricht ab

Gast #4929413
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
}
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.
Persönliche Seite
Das bringt garnichts, unvollständigen Code zu posten ... Es gibt viele 
Möglichkeiten ... Könnte ein Interrupt sein, der spinnt oder oder oder, 
aber man sieht ja keinen Code.

Kann gut sein, dass in dem Teil, den du gepostest hast, kein solcher 
Fehler vorliegt, weshalb deine Verwunderung zurecht ist.

Poste mal den Rest bitte :)
Gast
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
Was machen denn die Variablen die Du 0 setzt?
Division durch Null in einer Funktion?

Prima Gelegenheit den Debugger zu bemühen, bzw. Debug Nachrichten zu 
senden.
Gast
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
Ich denke auch, das Teil bootet neu.
Ähnliche Dinge hatte ich auch schon mal. Jetzt toggle ich da immer einen 
Ausgang. Dann kann man ein Oszi drauf ansetzen.
Gast
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.