Data breakpoint in AVR Studio mit double

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren