Forum: Compiler & IDEs _delay_ms im Simulator


von Reiner F. (reiner)


Lesenswert?

Hallo,

beim Debuggen eines C-Programms im AVRStudio bleibt der 
Einzelschrittmodus bei _delay_ms() Aufrufen hängen. In anderen Beiträgen 
hier im Forum habe ich bereits über die Grenzen des Debuggens im 
Zusammenhang mit der delay Funktion gelesen. Mir ist aber nicht klar, ob 
ich in diesem Zusammenhang nicht doch noch einen individuellen Fehler 
begehe.

Als Beispiel genügt ein einfaches Blinkprogramm (compiliert ohne 
Optimierung):
1
#include <avr/io.h>          
2
#define F_CPU 1000000UL     // 1 MHz
3
#include <util/delay.h>
4
5
int main(void)
6
{
7
  DDRD  = 0xff;           // PORTD ist Ausgang
8
  DDRA  = 0xff;      // PORTA ist Ausgang
9
  PORTD = 0xff;           // PORTD alle LEDs an
10
11
  while (1)       // Hauptprogrammschleife
12
  {
13
    PORTA ^= 0xff;    // umschalten PORTA
14
    _delay_ms(100);    // 100ms warten
15
    PORTD ^= 0xff;    // umschalten PORTD
16
  }
17
}

Beim Debuggen im Einzelschrittmodus (Step over) läuft der gelbe Pfeil 
problemlos bis "PORTA ^= 0xff;". Beim Klicken auf den nächsten Step 
verschwindet der gelbe Pfeil und es bleibt der Curser auf der Code Zeile 
PORTA ^= 0xff; stehen. Dieser Zustand ändert sich nicht bei fünf 
weiteren Steps! Beim siebten Klick erscheint der gelbe Pfeil wieder und 
zwar in der Zeile nach dem delay.

Die Frage nochmals, ist das beschriebene Verhalten des Simulators 
"normal", oder begehe ich beim Bedienen bzw. Einstellen des Debuggers 
einen Fehler.


danke vorab
Reiner

von nicht Gast (Gast)


Lesenswert?

Reiner Franke schrieb:
> (compiliert ohne Optimierung)

Die User Manual sagt aber:
>In order for these functions to work as intended, compiler optimizations
>must be enabled

http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

von Reiner F. (reiner)


Lesenswert?

Danke für den Hinweis mit der Compiler Optimierung bei delay.
Mein Verständnis war bisher, dass eine Compilieren ohne Optimierung nur 
dazu führt, dass man sich auf die Delay Zeit nicht verlassen kann. Aber 
erklärt das auch das Verhalten des Simulators?
Dazu kommt, dass nach einer Optimierung das Schrittweise Debuggen 
insgesamt nicht mehr vernünftig funktioniert.

Habe eben mal mit -Os compiliert. Jetzt bleibt der gelbe Pfeil nur für 2 
Steps verschwunden.

Gibt es denn keine Chance, dass der Simulator vernünftig mit dem delay 
Aufruf umgeht?

Gruß
Reiner

von Karl H. (kbuchegg)


Lesenswert?

Nein.
Mit dem was der Compiler aus dem _delay_ms macht, kommt der Debugger 
nicht vernünftig klar. Egal wie du es compilierst.

Das hängt auch damit zusammen, dass der _delay_ms kein echter 
Funktionsaufruf ist, sondern ein Makro, welches in mehrer C-Anweisungen 
übersetzt wird.

Am einfachsten ist es, in die Zeile nach dem _delay_ms einen Breakpoint 
zu setzen (F9) und den Simulator mittel Run (F5) da drüber laufen zu 
lassen.

von Reiner F. (reiner)


Lesenswert?

Danke für das klare "nein" und die entsprechenden Hinweise.

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.