Data breakpoint in AVR Studio mit double

OP #1715934
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
Moderator Persönliche Seite #1715960
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.
OP #1716009
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
Moderator Persönliche Seite #1716075
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:
1
struct {
2
  uint8_t padding[3];   /* ausprobieren, wie viele */
3
  double d;
4
} thisvar;
5
#define doublevar thisvar.d
OP #1718908
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.