J-Link双内存映射功能

浏览:124来源:本站时间:2023-12-01

J-Link调试器支持将程序下载到RAM或Flash中,并通过设置无限断点、查看内存寄存器等方式实现在线调试。如果没有这种调试能力,我们需要反复试错。

当调试过程停止,没有办法继续时,系统被“锁定”或“调试挂起”。引起异常的一种情况是程序或调试器在外部RAM控制器配置之前访问了外部内存。

为了解决该问题,J-Link增加了新功能-双内存映射。


01 什么是双内存映射?能解决什么问题?

应用程序从main()开始,main()之前的启动过程,我们通常默认其正常工作。因此,在main()之前出现的问题,特别是锁定调试逻辑并阻止进一步调试,是一个大问题。其中一个问题是在外部RAM控制器配置之前访问外部内存。

使用J-Link的双内存映射,一个内存映射用于处理启动阶段的内存访问,第二个内存映射在初始化完成后使用。第一个内存映射阻止对外部内存的访问,第二个内存映射允许全内存访问,消除了在配置完成之前访问外部内存的可能性和问题。


02 问题发现

在更新一些代码时,我们注意到一些用户界面代码中的错误,重写了它,并像往常一样下载到目标中。在重置应用程序时,我们得到了目标连接丢失的消息。我们检查了所有的物理连接,然后再试一次……


…但它又失败了。

对目标重新上电,再次下载应用程序,但结果相同。


03 罪魁祸首

通过J-Link日志文件:

JLINK_ReadMem(0x0033D4C0, 0x340 Bytes,…)

CPU_ReadMem(832字节@ 0x0033D4C0)

failed

- 40.959ms returns 1

Embedded Studio告诉J-Link从目标的地址0x0033D4C0读取832字节,在XC7Z010平台上该地址位于外部DDR RAM中的内存。DDR RAM在访问之前必须被初始化。而Embedded Studio在启动目标应用程序之后让J-Link立即读取内存,该操作在DDR RAM初始化之前。

我们没有添加任何会影响DDR RAM初始化的代码。为什么这一切突然发生了呢?

一个打开的内存窗口,显示了外部DDRRAM中的数组“aMyArrInExtDDRRAM”内容。


我们没有考虑到打开的内存窗口是问题所在,内存窗口仅在调试会话期间可见,增加了这种情况的隐蔽性,

调试会话开始时不打开内存窗口并不是一个解决办法。例如,第三方调试器可能默认打开内存窗口,或者不允许用户关闭它等。同样的,使用单内存映射解决方案,通过J-Link脚本文件指定某些区域为非法区域,在这种情况下也不起作用。


04解决方案

使用两个内存映射:一个用于处理启动完成之前的内存访问,另一个用于处理启动完成之后的内存访问。用户可以向每个映射中添加自定义区域。

第一个内存映射的访问限制就像一个安全模式。一旦应用安全通过了这个阶段,就会动态切换到第二个内存映射。


05易于实现

使用J-Link Control Panel,现在可以很容易地将“excluded”区域添加到第一个内存映射中,J-Link在目标应用程序启动完成之前使用该映射。


单击“Add region…”将弹出如下对话框:


配置之后,J-Link在初始化完成之前不会访问外部DDR RAM。

针对XC7Z010平台,我们在J-Link软件中添加了XC7Z010的通用设置步骤。此配置中,XC7Z010的外部DDR RAM区域在默认情况下会在启动完成之前被排除。未来我们可能对所有支持的芯片执行此工作。

京ICP备:京ICP备05011254号-1 版权归北京麦克泰软件技术有限公司所有
北京麦克泰软件技术有限公司