能否通过GDB在Flash擦除的微控制器上动态执行任意代码?
在Flash未初始化的RP2040上通过GDB+OpenOCD动态执行硬件操作的方案
我在开发RP2040微控制器时,可通过GDB和OpenOCD建立调试会话(我关心这种方法是否适用于所有支持GDB调试的外部MCU)。
我需要实现一个简单硬件操作:将指定GPIO引脚拉高,等待2000个CPU周期后拉低。对应的基于Pico-SDK的C代码如下:
#define MY_PIN_NR 12 static inline void my_hardware_init(void) { gpio_init(MY_PIN_NR); gpio_set_dir(MY_PIN_NR, GPIO_OUT); } static inline void my_hardware_do_process(void) { // raise pin high: gpio_put(MY_PIN_NR, 1); // wait for 2000 CPU cycles uint16_t cycles_to_wait = 2000; while(cycles_to_wait--) { asm volatile("nop"); } // set pin low: gpio_put(MY_PIN_NR, 0); } void my_hardware_full_process(void) { // ensure hardware is initialized my_hardware_init(); // do process: my_hardware_do_process(); }
如果代码已编译烧录到Flash中,可在GDB会话中直接调用:
(gdb) call my_hardware_full_process()
(或使用p my_hardware_full_process()),即使MCU处于断点暂停状态,该函数也能执行并返回调试器。但这种方法依赖Flash中已烧录的代码,当微控制器Flash被完全擦除/未初始化(无代码可运行,但仍能通过GDB+OpenOCD连接)时,通过.elf文件获取的函数地址没有有效代码,call命令会失效。
我推测可以编译包含my_hardware_full_process汇编代码及所有依赖(如gpio_init)的静态构建二进制Blob(类似PC端的静态编译),并希望解答以下问题:
- 能否通过GDB读取PC端的该二进制Blob,将指令和数据推送至MCU并动态执行,完成操作后返回GDB?
- 如何生成这类静态构建的二进制Blob?
- 如何通过GDB指令让MCU运行该Blob?
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

