Following the instructions in "Getting started with Raspberry Pi Pico" [1] I was able to set up a "picoprobe", which is a Pico running picoprobe firmware, and connect it to the debug ports on a Pico running Mecrisp Stellaris Forth. The set up looks a little funny because my second breakout board hadn't arrived yet, so I just attached some terminal blocks directly onto the picoprobe, but it works.
picoprobe connected to Pico running Mecrisp
Then, continuing to follow the instructions, I was able to build the rp2040 branch of openocd, connect openocd to the picoprobe, and attach a gdb-arm session to it.
christopher@theoden ~/Build/openocd$ sudo ~/local/bin/openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl Password: Open On-Chip Debugger 0.11.0-g610f137 (2022-03-30-08:35) Licensed under GNU GPL v2 For bug reports, read http://openocd.org/doc/doxygen/bugs.html Info : only one transport option; autoselect 'swd' adapter speed: 5000 kHz Info : Hardware thread awareness created Info : Hardware thread awareness created Info : RP2040 Flash Bank Command Info : Listening on port 6666 for tcl connections Info : Listening on port 4444 for telnet connections Info : clock speed 5000 kHz Info : SWD DPIDR 0x0bc12477 Info : SWD DLPIDR 0x00000001 Info : SWD DPIDR 0x0bc12477 Info : SWD DLPIDR 0x10000001 Info : rp2040.core0: hardware has 4 breakpoints, 2 watchpoints Info : rp2040.core1: hardware has 4 breakpoints, 2 watchpoints Info : starting gdb server for rp2040.core0 on 3333 Info : Listening on port 3333 for gdb connections Info : accepting 'gdb' connection on tcp/3333 target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00 target halted due to debug-request, current mode: Thread xPSR: 0x81000000 pc: 0x2000257c msp: 0x20020350 Info : RP2040 B0 Flash Probe: 2097152 bytes @10000000, in 512 sectors Info : New GDB Connection: 1, Target rp2040.core0, state: halted Warn : Prefer GDB command "target extended-remote 3333" instead of "target remote 3333"
When GDB connects to openocd, then automatically the system is halted at its current point of execution. I am able to continue execution of Mecrisp using the "continue" command, and halt it again with "Ctrl-C". When halted, the "i r" command allows me to view the registers, and "disas $pc,+40" allows me to view the instructions at the current location specified by the Program Counter.
(gdb) continue Continuing. ^Ctarget halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00 Thread 1 received signal SIGINT, Interrupt. 0x2000257c in ?? () (gdb) i r r0 0x2000492e 536889646 r1 0x200200bb 537002171 r2 0x0 0 r3 0x34 52 r4 0x0 0 r5 0x2003fee4 537132772 r6 0xffffffff -1 r7 0x20020270 537002608 r8 0xffffffff -1 r9 0xffffffff -1 r10 0xffffffff -1 r11 0xffffffff -1 r12 0x4001801c 1073840156 sp 0x20020350 0x20020350 lr 0x20002571 536880497 pc 0x2000257c 0x2000257c xPSR 0x81000000 -2130706432 msp 0x20020350 0x20020350 psp 0xfffffffc 0xfffffffc primask 0x0 0 basepri 0x0 0 faultmask 0x0 0 control 0x0 0 (gdb) disas $pc,+40 Dump of assembler code from 0x2000257c to 0x200025a4: => 0x2000257c: mvns r6, r6 0x2000257e: pop {pc} 0x20002580: b.n 0x20002584 0x20002582: ands r0, r0 0x20002584: ldmia r5, {r0, r1, r2, r3, r4, r5, r7} 0x20002586: lsls r7, r7, #7 0x20002588: and.w r0, r0, #2147483648 ; 0x80000000 0x2000258c: ldrb r6, [r7, #31] 0x2000258e: movs r4, r7 0x20002590: stmia r0!, {} 0x20002592: ands r0, r0 0x20002594: strh r0, [r0, #0] 0x20002596: ands r5, r0 0x20002598: lsls r4, r1, #8 0x2000259a: movs r0, r0 0x2000259c: strh r0, [r0, #0] 0x2000259e: ands r0, r0 0x200025a0: ands r0, r0 0x200025a2: ands r2, r0 End of assembler dump.
Because I tied together the UART lines, I can still interact with the Forth system in the normal way over sterm.
christopher@theoden ~$ sterm -n /dev/ttyACM0 -s 115200 2 3 * . 2 3 * . 6 ok.
Now that I can debug a live system, I was planning to study my ARM manual [2] again and learn more about the different registers and such like.
[1]
Getting started with Raspberry Pi Pico
[2]