分享

Cached段启动,导致调试断点失效

 开心果NeedCar 2023-06-21 发布于上海

1、问题描述

(一)将程序烧录到目标板,在TRACE32中,Core0和Core1分别设置断点,如下所示:

第一次运行调试,程序停在了预期的Core0断点位置,如下所示:

使用调试器进行Target Reset设置,进行复位操作,如下所示:

如上图,程序复位到了非缓存区地址0xA0000020。
再次进行程序调试,程序停在了非预期的Core1断点位置而不是预期的Core0断点位置,如下所示:

2、问题分析

查看工程对应的链接文件(*.lsl),如下所示:
......#define RESET 0x80000020......SECTIONS{  ......  .startup (0x80000020) : FLAGS(rxl)  {    BootModeIndex = .;    . = ALIGN(8);    KEEP (*(.start));    . = ALIGN(8);  } > pfls0 =0xFF  ......}

启动地址(0x80000020)为Cached区,对应的*.map文件如下所示:

而Debugger复位时,复位到了NonCached区的启动地址(0xA0000020),调试器在此区域找不到对应的Symbol,使得断点无效。

3、解决措施

方法一:启动地址设置到NonCached区

......#define RESET 0xA0000020......SECTIONS{  ......  .startup (0xA0000020) : FLAGS(rxl)  {    BootModeIndex = .;    . = ALIGN(8);    KEEP (*(.start));    . = ALIGN(8);  } > pfls0_nc =0xFF  ......}

如上,启动地址为NonCached区,即:启动地址设置为0xA0000020。重新编译工程,生成的*.map文件如下所示:

1、将程序烧录到目标板,在TRACE32中,Core0和Core1分别设置断点,如下所示:

2、第一次运行调试,程序停在了预期的Core0断点位置,如下所示:

3、使用调试器进行Target Reset设置,进行复位操作,程序复位到了非缓存区复位地址0xA0000020,且找到了对应的Symbol,如下所示:

4、再次进行程序调试,程序停在了预期的Core0断点位置,如下所示:

方法二:修改PC寄存器

如果只是想临时调试使用,不想进行复位内存的修改,可以在每次复位后,通过PC寄存器设置软件的运行位置,具体操作如下:

1、CPU->CPU Registers,如下所示:

2、右击PC->Set...

3、设置PC值为实际的启动地址0x80000020,如下所示:

4、单击OK,程序跳转到启动位置,且出现Symbol,如下所示:

5、调试程序,程序在停在预期的Core0断点位置,如下所示:

如上两种方式,方式一措施一劳永逸,方式二临时设置。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多