Forum: Mikrocontroller und Digitale Elektronik programmausführung beenden


von Re T. (toobatch)


Lesenswert?

hi,

weiß vielleicht jemand ob es irgendwie möglich ist das laufende programm 
(main())  zu beenden.
dachte bis gerade das sich das Programm alleine beendet mit erreichen 
des "}"-zeichens   des main()-blocks - aber nein , das Prog.  geht 
wieder von vorn los .


 also kA vielleicht gibts da was in der avr-libc oder so was dafür


könnte auch ne funktion rufen die dann endlos läuft aber is bissl 
unelegant möcht ich meinen.

von Gast (Gast)


Lesenswert?

Was macht der Prozessor wenn das Programm zu ende ist? Führt er dann 
keine Befehle mehr aus? Wird der Taktgeber abgeschaltet?

Gast

von Re T. (toobatch)


Lesenswert?

ja ist nur ein temp. testprogramm ... also soll nur durchlaufen  und 
"anhalten" ...

das Prog. macht UART-ausgaben und es stört wenn das mit den ausgaben 
immer wieder von vorn begint.

von micha (Gast)


Lesenswert?

Endlosschleife als letzte Anweisung ?

von Timmo H. (masterfx)


Lesenswert?

Der Prozessor rattert einfach weiter. Entweder wird ein Reset ausgeführt 
weil er in ungültige Speicherbereichte zugreift oder er läuft einfach 
durch den speicher bis er wieder vorne ist. Jenachdem welche Architektur 
du benutzt. Ist halt nicht mit einem Windowsprogramm vergleichbar wo 
einfach nach einem return aus main das Programm beendet wird. Wenn du 
das Teil stehenbleiben soll musst du halt ne Endlosschleife am Ende 
machen.

von kopfkratzer (Gast)


Lesenswert?

KOPFKRATZ
Stell das Programm einfach mal hier rein, dann kann auch was dazu gesagt 
werden.
Zwei Beispiele:
1
main()
2
{
3
 printf("HAllo Welt.");
4
}
Gibt einmal "Hallo Welt" aus und beendet sich dann.
1
main()
2
{
3
 while(1)
4
 {
5
  printf("Hallo Welt.");
6
 }
7
}
Gibt unendlich "Hallo Welt" aus.
Wenn es nicht terminiert muß irgendwo eine Endlosschleife drin sein.

von Klaus (Gast)


Lesenswert?

>könnte auch ne funktion rufen die dann endlos läuft aber is bissl
>unelegant möcht ich meinen.

nö ist es nicht!
In der Endlosschleife setzt man gewöhnlich ein "sleep" um Strom
zu sparen.

Klaus

von Gast (Gast)


Lesenswert?

Wenn Dir eine "leere" Endlosschleife als Endstation Deines Programms 
nicht gefällt, kannst Du auch alle Interrupts deaktivieren und den 
Controller danach mit sleep für immer schlafenlegen:

cli
sleep

Die Sleep-Fähigkeit muss dazu natürlich enabled sein; setz also 
mindestens das "SE"-Bit im MCUSR-Register auf 1, und ggf. noch 
"SM"-Bits.

von Michael U. (amiga)


Lesenswert?

Hallo,

@kopfkratzer: Du weißt aber, daß wir hier von Microcontrollern reden?

Die Theorie stimmt, wenn solch ein Programm von einer höheren Ebene 
aufgerufen wird, meist Betriebssystem genannt. Dann kehrt es am Ende 
dorthin zurück und das Betrienssystem hat das Problem, was es wieterhin 
macht.

Ein µC hat aber (meist) kein Betriebssystem, also kann man ihn nur 
irgendwie beschäftigen (mit einer Endlosschleife z.B.) oder schlafen 
schicken.

Da ist nichts unelegantes dran.

while(1) {}

oder

ende: rjmp ende

sind also völlig legitime Lösungen.

Gruß aus Berlin
Michael

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.