Forum: Mikrocontroller und Digitale Elektronik Hauptschleife wird ignoriert!


von opcode (Gast)


Lesenswert?

Sehr geehrte Forum-Mitglieder,

ich habe den unten stehen Source Code in AVR Studio 4 sowie in AVR 
Studio 5 simuliert und habe festgestellt, dass in AVR Studio 4 die 
Hauptschleife in der "main()" Funktion "einfach" ignoriert wird. In der 
Version 5 des Programmes läuft das Programm im Simulator in die 
Schleife. In der Version 4 wird das Programm an der Stelle der Schleife 
beendet. Habe ich noch irgendwas bezüglich dies nicht verstanden oder 
sind da irgendwelche verrückten Einstellungen die Hauptschuldigen ? Die 
Compiler Settings (wie
Code Optimization etc..) habe bei beiden Versionen soweit identisch.
Die Schleife funktioniert in AVR Studio 4 nur dann, wenn die Schleife
der erste Befehl in der "main()" Funktion ist und sie funktioniert dann,
wenn in der Schleife irgendein Befehl ausgeübt wird. In der Forensuche 
habe ich zwar einen Beitrag bezüglich dieses Problem gefunden, welcher 
aber keine eindeutige Problemlösung beinhaltet. Die Frage lautet daher, 
warum funktioniert das in AVR Studio 5 und nicht in AVR Studio 4 ?!

Hier der Code:
1
#include <avr/io.h>
2
3
int main(void)
4
{
5
    DDRB |= (1<<PB0);   
6
 
7
    while(1)
8
    {
9
 
10
    }
11
}

Bin für jede Hilfestellung dankbar.

Einen guten Start in die Woche und freundliche Grüße,
opcode
von Christian H. (christian_h)


Lesenswert?

Schreit nach Optimierung durch das AVR Studo 4 (bzw. dessen Simulator) 
selber, welches sieht, da kommt nichts mehr und da es simuliert wird, 
können wir auch anhalten. (running out of code passiert dann ja nicht)
von Klaus (Gast)


Lesenswert?

opcode schrieb:
> die
> Hauptschleife in der "main()" Funktion "einfach" ignoriert wird.

Klar. Da in dieser Schleife nichts passiert, kann sie ignoriert werden. 
Das ist völlig normal. Ansonsten wäre das nur Platzverschwendung im 
Programmspeicher.
von (prx) A. K. (prx)


Lesenswert?

Klaus schrieb:

> Klar. Da in dieser Schleife nichts passiert, kann sie ignoriert werden.
> Das ist völlig normal.

Nur Schleifen, die theoretisch irgendwann beendet werden, dürfen 
ignoriert werden. Diese folglich nicht.
von opcode (Gast)


Lesenswert?

Danke für die schnelle Rückmeldung.
Wie kann ich diese Optimierung in AVR Studio 4 abschalten ? (falls man 
diese überhaupt abschalten kann...).

Gruß,
opcode
von (prx) A. K. (prx)


Lesenswert?

Wirf mal den erzeugten Assembler-Code beider Versionen rüber.
Um zu sehen, was wirklich Sache ist.
von Matthias (Gast)


Lesenswert?

opcode schrieb:
> Wie kann ich diese Optimierung in AVR Studio 4 abschalten ?

Project  Configuration Options  Optimization
von Stefan P. (form)


Lesenswert?

Ersetze
1
while(1)
2
    {
3
4
    }

durch
1
while(1)
2
    {
3
        ;
4
    }
von (prx) A. K. (prx)


Lesenswert?

Ergibt das nachweislich einen Unterschied? Sollte es nicht.
von Martin (Gast)


Lesenswert?

opcode schrieb:
> Wie kann ich diese Optimierung in AVR Studio 4 abschalten ?

Warum willst du dies abschalten? Dein Programm wird so ja nicht bleiben.
von opcode (Gast)


Angehängte Dateien:

Lesenswert?

@A.K.

Ich habe im Anhang die erzeugten Assembler Codes hochgeladen.
Die Codes sind in zwei seperaten Dateien gespeichert.

Danke.

Gruß,
opcode
von Peter D. (peda)


Lesenswert?

opcode schrieb:
> Die Schleife funktioniert in AVR Studio 4 nur dann, wenn die Schleife
> der erste Befehl in der "main()" Funktion ist und sie funktioniert dann,
> wenn in der Schleife irgendein Befehl ausgeübt wird.

Das ist korrekt.
Ein Simulator kann nur dort halten, wo auch Code generiert wird.
Eine '{' oder gar Leerzeile enthält aber nichts, wo der Simulator 
anhalten kann.

Der Simulator führt eine Anweisung aus und setzt dann den Kursor auf die 
zugehörige Quell-Zeile, nicht umgekehrt.


Peter
von Matthias L. (Gast)


Lesenswert?

Ich mach das immer so:
1
while(1)
2
{
3
  asm volatile ("nop");
4
}
von opcode (Gast)


Lesenswert?

@Matthias Lipinsky:

Vielen dank für diesen Vorschlag. Klappt wunderbar.

Grüße,
opcode
von opcode (Gast)


Lesenswert?

An dieser Stelle natürlich ein herzliches Dank an alle anderen 
Forum-Mitglieder für die Bemühungen.

Grüße,
opcode
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.