我有一个自定义引导加载程序。加载程序必须能够对闪存的任何部分进行编程,包括自行升级。为此,加载程序启动代码将整个程序从闪存复制到 RAM 中,然后跳转到 main()。
该程序运行良好,但我无法让调试器设置断点。我得到的具体错误消息是“无法在目标上设置请求的断点”。读取变量的状态和单步执行似乎确实有效。
如何让调试器在此设置中工作?
开发环境:Atmel Studio 7
处理器:ATSAME70(这是一个 ARM Cortex M7)
编译器:GCC
工具:Atmel-ICE
接口:SWD(串行线调试)
链接器脚本的相关部分如下所示......
/* Memory Spaces Definitions */
MEMORY
{
rom (rx) : ORIGIN = 0x00400000, LENGTH = 0x00004000 /* rom, 2097152K */
ram (rwx) : ORIGIN = 0x20400000, LENGTH = 0x00060000 /* ram, 393216K */
}
SECTIONS
{
.reset : {
. = ALIGN(4);
KEEP("Device_Startup/startup.o"(.text))
KEEP(*(.reset_code))
} > rom
PROVIDE(_exit = .);
.text :
{
. = ALIGN(4);
_rom_to_ram_copy_vma_start = .;
KEEP(*(.vectors .vectors.*))
*(.text .text.* .gnu.linkonce.t.*)
...
...
_rom_to_ram_copy_vma_end = .;
} > ram AT > rom
_rom_to_ram_copy_lma_start = LOADADDR(.text);
}
该程序将 _rom_to_ram_copy_vma_start 和 _rom_to_ram_copy_vma_end 之间的所有内容复制到 RAM 中,然后跳转到 RAM 中的 main。
鉴于我在链接器脚本中使用了“ram AT > rom”,人们会认为调试器应该知道代码在 RAM 中,并且在那里设置断点应该没有问题。