www.mikrocontroller.net

Forum: Compiler & IDEs _delay_ms im Simulator


Autor: Reiner Franke (reiner)
Datum:

Bewertung
0 lesenswert
nicht 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):
#include <avr/io.h>          
#define F_CPU 1000000UL     // 1 MHz
#include <util/delay.h>

int main(void)
{
  DDRD  = 0xff;           // PORTD ist Ausgang
  DDRA  = 0xff;      // PORTA ist Ausgang
  PORTD = 0xff;           // PORTD alle LEDs an

  while (1)       // Hauptprogrammschleife
  {
    PORTA ^= 0xff;    // umschalten PORTA
    _delay_ms(100);    // 100ms warten
    PORTD ^= 0xff;    // umschalten PORTD
  }
}

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

Autor: nicht Gast (Gast)
Datum:

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

Autor: Reiner Franke (reiner)
Datum:

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

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

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

Autor: Reiner Franke (reiner)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für das klare "nein" und die entsprechenden Hinweise.

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.