www.mikrocontroller.net

Forum: Compiler & IDEs Anfängerproblem mit AVR-Studio und WinAVR


Autor: Christian W. (crissi79)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Frederik Krämer (n0ll4k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mhh wird die Schleife vielleicht einfach wegoptimiert vom kompiler, so 
das der Simulator dann aus der main rausläuft und nicht mehr weiter 
weiß?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Simulator hat so seine Schwierigkeiten mit leeren 
(Endlos-)Schleifen, da kann man mit einem merkwürdigen Trick abhilfe 
schaffen:
while(1); // geht nicht
while (1)                   // ein Assemblerkommentar
    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

Autor: Das Nichts (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ohne int vor main(), gibt es sowieso eine Warnung.

Autor: Rene H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ganze wird weg optimiert, weil
x = 5;

x nicht mehr weiter verwendet wird, also nimmt der Compiler an das das 
wegoptimiert werden kann.
Dasselbe mit
while(1);

weil eine leere Endlosschleife.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rene H. schrieb:

> Dasselbe mit
>
>
> while(1);
> 
>
> 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
   while( 1 )
     ;

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
  while( 1 )
     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.

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>@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

Autor: Christian Witkowski (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.