www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Data breakpoint in AVR Studio mit double


Autor: David H. (david_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kann mir das Verhalten von AVR Studio nicht erklären: Ich habe data 
breakpoints gesetzt. Bei einem int funktionieren die auch. Aber wenn ich 
bei einem double angebe er soll auslösen, wenn die Variable größer 1 
dann stoppt der Debugger trotzdem jedes mal wenn dieses double 
ausgelesen wird.

Kann man doubles nicht mit databreakpoints verwenden? Hat da jemand 
schon Erfahrung gemacht?

Ich compiliere für einen ATmega162 mit dem gcc - falls das relevant sein 
sollte!?

Grüße, David

: Verschoben durch Moderator
Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die data breakpoints im AVR sind etwas ulkig implementiert.  Man kann
nur eine Adresse und eine Maske angeben in der zuständigen Logik, was
zur Folge hat, dass man auf Daten von mehr als 1 Byte Größe nur dann
vernünftig einen breakpoint setzen kann, wenn diese im Speicher
entsprechend ihrer Länge auch auf eine passende Adresse ausgerichtet
sind (bei 32-bit floating-point also auf einer durch 4 teilbaren
Adresse).  Da der AVR sonst aber kein memory alignment der Variablen
benötigt, können dir Compiler und Linker dieses alignment auch nicht
bieten.

Autor: David H. (david_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok. Schade. Ich hätte gedacht, dass das AVR Studio sich um solche Dinge 
wie alignment kümmert. Immerhin wird auch der Datentyp richtig 
interpretiert und der Inhalt angezeigt.

Eine eigene Maske zu entwickeln ist mir zu viel Aufwand. Da kenne ich 
bessere Methoden für meinen Zweck.

Danke für die kompetente Antwort!

David

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
David H. schrieb:
> Ich hätte gedacht, dass das AVR Studio sich um solche Dinge
> wie alignment kümmert.

Wie sollte es?  Das müsste doch der Compiler machen, aber der hat das
für normalen Code einfach nicht nötig (d. h., es wäre eine Verschlimm-
besserung, wenn er es täte).

Das Dilemma ist einfach, dass der Prozessor zwar kein alignment für
Daten benötigt, jedoch die Debugregister es benötigen würden.

Als Hack könntest du ggf. deine Variable in eine Struktur packen,
bei der du vor den double-Wert ein array aus 1...3 uint8_t packst,
wobei du die genaue Zahl durch manuelle Iteration über Compiler und
Linker ermittelst.  Mit einem #define danach kannst du den double-
Teil der Struktur für den Rest des Programms wieder so aussehen
lassen wie die ursprüngliche double-Variable, also etwa so:
struct {
  uint8_t padding[3];   /* ausprobieren, wie viele */
  double d;
} thisvar;
#define doublevar thisvar.d

Autor: David H. (david_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

mein Problem ist inzwischen veraltet und da ich im Urlaub bin habe ich 
gerade kein AVR Studio zur Hand um es auszuprobieren.

Aber der Workarround mit dem Struct klingt plausibel. Ich werde ihn bei 
bedarf einsetzen.

Vielen Dank für deine Antwort!

David

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.