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
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.
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
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
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.