Hi zusammen,
im Moment versuche ich einen Controller, bestückt mit ATMega32 per JTAG
unter Linux zu debuggen. Ich compiliere mit GCC und nutze den AVR-Dragon
für das Programmieren und Debuggen. Als debugger setze ich GDB und als
Frontend DDD ein.
Leider passieren im DDD seltsame Dinge. Das "continue", "step" und
"next" funktioniert nicht wie erwartet.
Die Anwendung nutzt V-USB und es gibt einen Timer0 ISR-Routine in der
Ports eingelesen und entprellt werden (Interruptrate 1/10ms). Der Status
wir dann per HID-Joystick an das Notebook geschickt. Wenn ich mit das
Ergebnis mit "jstest /dev/input/js0" anschaue, funktioniert es auch. Der
Status der Ports wird als "Buttons" dargestellt. Allerdings gibt es noch
ein paar Fehler im Ablauf, die ich analysieren und korrigieren möchte,
darum das Debuggen. Mit avarice und DDD habe ich bisher nicht
gearbeitet, da ich überwiegend mit dem Mega8 gearbeitet habe und
simulavr verwendet habe. Beim Mega32 bietet sich jetzt aber die
JTAG-Schnittstelle an.
Der Code ist mit;
avr-gcc -Wall -Os -Iusbdrv -I. -mmcu=atmega32 -DF_CPU=12000000L
-DDEBUG=dwarf-2 -DDEBUG_LEVEL=2 -g -c main.c -o main.o
compiliert, keine Warnings oder Fehlermeldungen.
avarice starte ich mit;
avarice --program --file main.elf --part atmega32 -g :4242
Code wird geladen, fuses angezeigt, keine fehlermeldungen, "Waiting for
connection"
Dann starte ich ddd;
ddd --debugger "avr-gdb -x gdb.conf"
Inhalt von gdb.conf:
file main.elf
target remote localhost:4242
ddd startet, source code wird angezeigt. Programmzeiger steht auf der
main function.
----------------
int main(void) {
needupdate = 1;
initProg();
while (1)
{ // main event loop
#if !DEBUG_LEVEL
wdt_reset();
#endif
usbPoll();
if (needupdate && usbInterruptIsReady()) {
needupdate = 0;
usbSetInterrupt(ReportBuffer, BuildReport());
}
}
return 0;
}
-------------------
Bis hier hin sieht das alles genau so aus wie es sein sollte.
Probleme gibt es wenn ich debuggen möchte.
Ich setze einen Breakpoint auf die 1. Zeile mit der Zuweisung von 1 auf
needupdate;
"Continue" -> bleibt genau auf der Zeile stehen.
Wenn ich jetzt wieder "Continue" wähle stoppt die Anzeige nach einem
Moment wieder an der selben Stelle. Diese Codezeile sollte aber nur ein
einziges mal erreicht werden. Später wird ja nur noch die endlose while
Schleife durchlaufen.
Verstehe ich da irgendetwas nicht richtig oder verhält sich das System
falsch? Der Watchdog ist aus. Kann es trotzdem sein das durch das
Debuggen Resets ausgelöst werden und darum immer wieder der selbe
(einige Breakpoint im Programm) "angesprungen" wird?
Wie verhält es sich mit den Interrupts, wenn man auf diese Weise mit
JTAG debugged?
DDD-Version: 3.3.12 (x86_64-pc-linux-gnu)
AVaRICE version 2.10, Feb 8 2010 07:22:54
gcc-Version 4.3.5 (GCC) (--build=x86_64-linux-gnu
--host=x86_64-linux-gnu --target=avr)
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Linux: uname -rm -> 2.6.38-16-generic x86_64 (Ubuntu natty)