0

我有一个自定义引导加载程序。加载程序必须能够对闪存的任何部分进行编程,包括自行升级。为此,加载程序启动代码将整个程序从闪存复制到 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 中,并且在那里设置断点应该没有问题。

4

0 回答 0