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区域在默认情况下会在启动完成之前被排除。未来我们可能对所有支持的芯片执行此工作。
审核编辑:汤梓红
-
应用程序
+关注
关注
37文章
3237浏览量
57541 -
调试器
+关注
关注
1文章
299浏览量
23665 -
J-Link
+关注
关注
0文章
83浏览量
22093 -
内存映射
+关注
关注
0文章
14浏览量
7408
发布评论请先 登录
相关推荐
评论