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.
1 | int main (void) { |
2 | int run = 0; |
3 | do { |
4 | // ... Code ...
|
5 | |
6 | // Neu starten
|
7 | run = 0; continue; |
8 | } while (run); |
9 | }
|
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.
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
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
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?
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?
Den Reset ansteuern hört sich sehr gut an. Also handelt sich um nen Atmega16.
Und was genau ist das Problem? Warum möchtest du das "Hauptprogramm" neu starten? Warum beendest du es überhaupt? Oliver
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.
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. :-)
So danke für den tipp mit der Hardware Auslösung. Hab das ganze jetzt mit einen WD-Reset gelöst.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.