Kann es sein, daß AVR Studio nicht damit zurecht kommt, wenn ich ein Breakpoint mitten im Macro setze? Beim Starten des Simulators kommt immer die Meldung, daß der Breakpoint ignoriert wird. Wenn ich diesen in einer CALL Unterroutine setze, funktioniert es, auch in iclude Dateien, aber nicht im Macro. AVR Studio müsste doch heraus finden können, wo das Macro gestartet wird, vor allen wurde das Macro nur einmal benutzt. Konfiguration: ATGEMA128, STK600 zum brennen, JTAGICE MKII für in circuit debugging
Versteh ich das richtig, dass du den Breakpoint in der Definition des Macros verwenden möchtest, nicht im "Aufruf"?
@Igor Deine Frage lässt durchblicken, dass du im Grunde nicht verstanden hast, wie ein Makro funktioniert. Grundlegendes zu Funktionen und Makros: Eine Funktion ist nichts weiter als ein Stück Code, zu dem per CALL-Aufruf gesprungen wird. Von welcher Stelle aus das Programm zur Funktion springt ist dabei nicht relevant, denn der gegenwärtige Instuction Pointer wird dabei auf den Stack gepackt und am Ende wiederhergestellt. Ein Makro ist auch ein Stück Code, jedoch mit dem Unterschied, dass du ein Makro zur Laufzeit nicht "aufrufst", sondern zur Compilierzeit wird das Makro an die Aufrufstelle kopiert. Makros sollten daher kurz sein oder nur selten verwendet werden. Der Vorteil des Makros liegt darin, dass der Overhead des CALL wegfällt, und einfach linear im code weitergemacht werden kann, was Rechenzyklen spart. Dein Makro-Breakpoint kann also gar nicht funktionieren, denn der Debugger weiß gar nicht, welchen "Makroaufruf" du damit gemeint hast, respektive wo der Instruction Pointer gerade steht!
Ja, Dieter, mitten in der Definition selbst. @ Phantomix Soweit kapiert. Wenn ich nun also z.B. dieses Macro im Programm 2 mal aufrufen würde, würde ich zwei Breakpoints erzeugen. Spätestens beim kompilieren würde er die Adressen kennen, damit er diese zum JTAGICE übertragen könnte. Aber soweit scheint AVR Studio nicht zu denken, oder?
Wie gesagt, geht ein Breakpoint in der Definition einen Makros nicht, da das Makro nach dem Compilieren im Code nicht mehr existiert. Als alternative wäre es möglich in den Zeilen der Benutzung des Makros Breakpoints zu legen. Oder das Makro zu Debugzwecken stattdessen als Funktion zu definieren.
@Dieter: Fast richtig. Genau genommen existiert das Makro bereits vor dem Compilieren nicht mehr! Es wird bereits vom Präprozessor ersetzt. Ansonsten sollte man sich den Begriff "Aufruf" (oder "Call") im Zusammenhang mit Makros unbedingt abgewöhnen. Ein Makro wird eben NICHT aufgerufen, ein Makro wird ersetzt! CU
... wrote: > @Dieter: > Fast richtig. Genau genommen existiert das Makro bereits vor dem > Compilieren nicht mehr! Es wird bereits vom Präprozessor ersetzt. Nicht unbedingt. Mit -g3 löst gcc (bzw. der Präprozessor) die Makros zwar auf, lässt sie aber in der Quelle stehen. Er fügt sogar defines hinzu, nämlich solche, die per -D oder -U von der Kommansozeile kommen sowie Builtin-Defines wie
1 | # 1 "display.c"
|
2 | # 1 "/home/john/projects/avr/dcf/"
|
3 | # 1 "<built-in>"
|
4 | #define __STDC__ 1
|
5 | #define __STDC_VERSION__ 199901L
|
6 | #define __STDC_HOSTED__ 1
|
7 | #define __GNUC__ 4
|
8 | #define __GNUC_MINOR__ 3
|
9 | #define __GNUC_PATCHLEVEL__ 0
|
10 | #define __SIZE_TYPE__ unsigned int
|
11 | #define __PTRDIFF_TYPE__ int
|
12 | ...
|
13 | # 1 "<command-line>"
|
14 | #define F_CPU 8000000
|
15 | ...
|
Ebenso befinden sich im Präcompilat Anmerkungen darüber, aus welcher Include-Datei nachfolgende Zeilen stammen, obwohl der Präprozessor #include aufgelöst hat:
1 | # 1 "/home/john/install/avr/lib/gcc/../../avr/include/avr/io.h" 1 3
|
2 | # 92 "/home/john/install/avr/lib/gcc/../../avr/include/avr/io.h" 3
|
3 | #define _AVR_IO_H_
|
4 | |
5 | # 1 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 1 3
|
6 | # 36 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 3
|
7 | #define _AVR_SFR_DEFS_H_ 1
|
8 | # 121 "/home/john/install/avr/lib/gcc/../../avr/include/avr/sfr_defs.h" 3
|
9 | #define _SFR_ASM_COMPAT 0
|
Auch wenn dieser Beitrag uralt ist. Für jeden, der diesen über Google findet wie ich: Man kann keine breakpoints im Makro setzen, zumindest nicht im Quellcode. Allerdings kann man im Fenster "Disassembly" die einzelnen Instruktionen des Makros aufgelöst sehen und dort auch Breakpoints setzen oder im Einzelschrittmodus durchgehen.
Stefan Noack schrieb: > Man kann keine breakpoints im Makro setzen, zumindest nicht im > Quellcode. Das gilt für welche Compileroptionen und welche -version?
Breakpoints kann man nur zeilenweise setzen, nicht aber auf eine Anweisung innerhalb der Zeile. Und ein Macro ist ja immer nur eine Zeile lang. Peter
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.