You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:32:25