使用链接脚本将所有内容放入RAM中。我看到你已经有了一个链接脚本(STM32WB55RGVX_RAM.ld),看起来是可以实现这个功能的。你可能只需通过更改 set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32WB55RGVX_FLASH.ld)
即可激活它。
您可以看到它定义了两个内存区域:
MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 192K
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 512K
}
你可以看到它将所有代码位都放在了RAM中。虽然定义了“FLASH”存储区域,但实际上从未使用过这个链接器脚本,因此它会保持为空。与_FLASH.ld链接器脚本进行比较。
构建应用程序后,您可以使用gdb加载.elf文件。gdb将忠实地将所有部分加载到链接器放置它们的区域。
最后一部分就是实际运行代码。
如果入口点设置正确,gdb还将初始化程序计数器以指向那里。然后,您可以像平常一样使用"continue next"等命令,在RAM中调试代码。入口点可以通过gcc链接器命令中的-e 0x20000000
之类的东西任意移动。
# example gdb commands to execute output.elf from RAM
# load the elf into gdb so that we can get debug information from it
file output.elf
# reset the mcu
monitor reset init
# load the elf into RAM
load output.elf
# verify that the register are correct
info registers
# run until main
break main
continue
执行程序时,首先运行的不是主函数main,而是所有设置C执行环境所需的启动代码。这包括设置堆栈和在startup_stm32wb55rgvx.s文件中的其他内容。因此,我已经在主函数上设置了断点并执行到那里。
顺便提一下,如果您实际上不需要启动代码,您可以构建非常小的可执行文件。如果您可以接受不完整的执行环境,则可以自己设置堆栈指针。当您想要将其余RAM用于其他事情或想要优化加载时间时,这非常有用。考虑设置一些仅微控制器可以访问的后期制作步骤。甚至是后期生产测试。为此,我推荐使用Python库pyswd,它是一个绝对福音。
--编辑--
我刚才注意到您想让您烧录的程序从RAM执行一些代码...在这种情况下,甚至更简单。
您甚至不需要编辑链接器脚本。
只需将函数放置在RAM节(方便的RamFunc存在)中即可。
__attribute__ ((longcall, section(".RamFunc"))) void test(){
disable_flash();
dothething();
}
int main(void) {
test();
}