Forum: Mikrocontroller und Digitale Elektronik C Programm neustarten


von Andreas (Gast)


Lesenswert?

Hey,

gibt es ein Befehl in C mit dem man das Hauptprogramm Neustarten kann?

hab es bisher mit einem goto gelöst, find die Methode aber nicht ganz so 
schön. Gibt es da noch andere befehle? bei Return 0; hängt sich alles 
auf. und bei break passiert das selbe da ich im Main Programm bin.

von Dr. Sommer (Gast)


Lesenswert?

1
int main (void) {
2
  int run = 0;
3
  do {
4
    // ... Code ...
5
    
6
    // Neu starten
7
    run = 0; continue;
8
  } while (run);
9
}

von Dr. Sommer (Gast)


Lesenswert?

Aah, "run = 1;" muss es natürlich sein...

von Julius J. (joe_joule)


Lesenswert?

Aus deinem Hauptprogramm eine große Schleife machen.

von Peter II (Gast)


Lesenswert?

Andreas schrieb:
> gibt es ein Befehl in C mit dem man das Hauptprogramm Neustarten kann?

nein.

Vermutlich geht es um eine µC. Da müsste man an die init Adresse 
springen. Mit goto kommt du zwar zum Anfang der Main aber das ist ja 
nicht der anfang vom Programm. (globale Variabel müssen initialisiert 
werden).

Das das kann man mit einen Funktionszeiger erledigen.

von Daniel A. (daniel-a)


Lesenswert?

1
// ungetestet
2
3
#include <setjmp.h>
4
5
static jmp_buf jmp_main;
6
7
void restart(){
8
  longjmp(jmp_main,1);
9
}
10
11
void do_something(){
12
  restart();
13
}
14
15
int main(){
16
  setjmp(jmp_main);
17
  do_something();
18
  return 0;
19
}

Edit: Dabei wird natürlich speicher der mit malloc reserviert wurde, 
etc. nicht wieder freigegeben oder zurückgesetzt. Dazu brauchte man noch 
ein fork()

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

Oder man triggert einen Reset an. Manche Mikrocontroller können das, 
aber wie so oft hier verweigert der Themenersteller um welche Hardware 
es genau geht.

: Bearbeitet durch User
von Andreas (Gast)


Lesenswert?

Autsch xD

manchmal kommt man auf die einfachsten Sachen nicht.

Also hab jetzt das ganze Programm in eine große While(1) schleife 
gepackt und kann es per break Neustarten.

wie sieht das ganze den aus, wenn ich den Hardware Reset drücke fängt 
das Programm ja in Zeile:1 an. Momentan starte ich ja nur das 
Hauptprogramm neu, gibt es da auch eine lösung?

von Daniel A. (daniel-a)


Lesenswert?

Andreas schrieb:
> kann es per break Neustarten

Nein, du brauchst continue.

von Mark B. (markbrandis)


Lesenswert?

Nun sag uns doch endlich einmal, um was es hier geht. Reden wir von 
einem Mikrocontroller? Wenn ja, von welchem? Wenn nein, von was sonst?

von Andreas (Gast)


Lesenswert?

Den Reset ansteuern hört sich sehr gut an.

Also handelt sich um nen Atmega16.

von Oliver S. (oliverso)


Lesenswert?

Und was genau ist das Problem? Warum möchtest du das "Hauptprogramm" neu 
starten? Warum beendest du es überhaupt?

Oliver

von Hypocrita (Gast)


Lesenswert?

Mark B. schrieb:

> Oder man triggert einen Reset an. Manche Mikrocontroller können das,
> aber wie so oft hier verweigert der Themenersteller um welche Hardware
> es genau geht.

Hält dich aber nicht vom Antworten ab.

von Mark B. (markbrandis)


Lesenswert?

Hypocrita schrieb:
> Mark B. schrieb:
>
>> Oder man triggert einen Reset an. Manche Mikrocontroller können das,
>> aber wie so oft hier verweigert der Themenersteller um welche Hardware
>> es genau geht.
>
> Hält dich aber nicht vom Antworten ab.

Weil ich im Gegensatz zu Dir etwas Sinnvolles beigetragen habe. :-)

von Andreas (Gast)


Lesenswert?

So danke für den tipp mit der Hardware Auslösung.

Hab das ganze jetzt mit einen WD-Reset gelöst.

von Andreas (Gast)


Lesenswert?

Eine frage habe ich noch:

wieso bekomme ich Neustart auf der UART beim Auslösen des WD Doppelt 
angezeigt?
1
      
2
uart_output(NEUSTART);
3
uart_output("\r\n");
4
_delay_ms(10);
5
      
6
WDTCR |= (1<<WDE);

setzt ich das WDTCR in eine while-schleife passiert das nicht.

von Andreas (Gast)


Lesenswert?

ok Fehler gefunden, bzw 2 fehler xD

Falsche Spalte was die Zeit angeht zum auslösen sollte ein 
_delay_us(16400)sein und natürlich erst nach dem der WD aktiviert wird. 
Und nicht davor.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.