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


von David H. (david_h)


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
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von David H. (david_h)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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

von David H. (david_h)


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

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.