Hallo an alle! ich beschäftige mich seit ein paar Tagen mit dem ATMEGA8 in Verbindung mit AVR Studio und WinAVR. Allerdings verstehe ich das verhalten des MC nicht so richtig: #include<avr/io.h> int x; main() { x=5; while(1); } Wie man nicht schwer erkennen kann sollte der MC in der while-Schleife für die Ewigkeit in der Schleife bleiben. In der Simulation "stürtz" er allerdings ab und macht nichts mehr?! Lasse ich x=5 weg dann läuft der MC vor sich hin, so wie es eigendlich sollte......??? Hat einer ne Ahnung was ich falsch mache? Gruß crissi79
Hi, Christian, an Deinem Code fällt mir nichts auf, der müsste so laufen. Also ist eine anständige Diagnose gesucht. Die braucht eine anständige Anamnese. Verdächtige, fehlerträchtige Gebiete: Alles von der Stromversorgung über den Quarz bis zu den Fuse-Bits. Was geschieht, wenn Du ein Programm aus einem Tutorial laufen lässt? Wenn das zuverlässig läuft, dann ist das der Beweis, das Drumrum ist alles in Ordnung. Ciao Wolfgang Horn
Mhh wird die Schleife vielleicht einfach wegoptimiert vom kompiler, so das der Simulator dann aus der main rausläuft und nicht mehr weiter weiß?
WinAVR hängt an jedes Programm eine Endloschleife an, das der Prozessor "nicht mehr weiter weiß", kann eigentlich auch nicht vorkommen. Allerdings lässt der Optimierer tatsächlich nichts von dem Programm übrig, debuggen im Source-Code sieht daher schon seltsam aus. Probier es mal ohne Optimierung. Oliver
Der Simulator hat so seine Schwierigkeiten mit leeren (Endlos-)Schleifen, da kann man mit einem merkwürdigen Trick abhilfe schaffen:
1 | while(1); // geht nicht |
2 | while (1) // ein Assemblerkommentar |
3 | asm volatile (";\n\t"); // nicht mal ein 'nop' |
Andererseits kann man auch einfach Programmcode in die Schleife schreiben und/oder (Timer-/ADC-)Interrupts aktivieren. hth, Jörg
Und ohne int vor main(), gibt es sowieso eine Warnung.
Das ganze wird weg optimiert, weil
1 | x = 5; |
x nicht mehr weiter verwendet wird, also nimmt der Compiler an das das wegoptimiert werden kann. Dasselbe mit
1 | while(1); |
weil eine leere Endlosschleife.
Rene H. schrieb: > Dasselbe mit > >
1 | > while(1); |
2 | >
|
> > weil eine leere Endlosschleife. Eine leere Endlosschleife darf ein Compiler nie wegoptimieren. Das Verhalten des Programms ändert sich dadurch. Mit Schleife hängt das Programm für immer und ewig in dieser Schleife. Ohne Schleife tut er genau das nicht. @Jörg G. Was passiert bei
1 | while( 1 ) |
2 | ;
|
Manche (ältere) Simulatoren/Debugger haben so ihre Schwierigkeiten, wenn mehrere Statements in einer Zeile sind. Persönlich finde ich es konsequenter, wenn der ';' in die nächste Zeile rutscht. Ich schreib ja auch
1 | while( 1 ) |
2 | tu_irgend_was; |
und nur weil aus tu_irgend_was plötzlich eine leere Anweisung wird, heb ich den ';' nicht auf die vorhergehende Zeile. Der Schleifenrumpf besteht aus einem einzigen, einsamen ';' (der leeren Anweisung) und da der Schleifenrumpf bei mir immer eingerückt in die nächste Zeile kommt, ist es nur konsequent, wenn der ';' dort steht. Ausserdem sieht man IMHO besser, dass die Absicht hier tatsächlich eine leere Schleife war und man nicht aus Versehen einen ';'-Tippfehler gemacht hat.
>@Jörg G. >Was passiert bei > > while( 1 ) > ; Funktioniert hier auch nicht, d.h. Das der Simulator 'hängt' und reagiert nicht mehr. Aber ich sehe gerade, ich hab Studio Version 4.14 hier - das ist mehr nicht so aktuell. hth, Jörg
Danke an alle. Der Tipp von Jörg G. funktioniert. Und da kommt mir auch glatt noch ne Frage in den Kopf: wie kann man(n) z.B. einen Assablercode in eine c-datei integrienen, wie z.b. ein nop befehl?
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.