现在的位置: 首页 > 综合 > 正文

Keil for ARM/ Realview MDK 中用JTAG调试的方法 && k​e​i​l​ ​c​ ​的​在​线​调​试​与​断​点​设​置

2018年03月16日 ⁄ 综合 ⁄ 共 3387字 ⁄ 字号 评论关闭

Keil for ARM/ Realview MDK 中用JTAG调试的方法

http://blog.sina.com.cn/s/blog_4892ec8b0100bnim.html

ysmz4注:以下步骤仅供参考,作用是了解RAM、FLASH如何使用。我的stm32f103 Jtag调试不是这么设置的。

首先说明,在ARM中运行程序的方法其实和我们PC机差不多,程序开始是放在Flash中的,在芯片加电启动后,Flash中的程序会通过内存映射的方式加载到RAM中运行,这一步是由启动代码来完成的(我还没看懂),对应PC机中的话,就是程序放在硬盘中,执行时把程序加载到内存中,然后在内存中运行程序。
所以在Keil中用JTAG调试实际上是要在RAM中调试。因为Flash中的程序烧写进去的,而用JTAG调试是没有办法更改Flash的,所以RAM调试和JTAG调试是一回事。
用过几天三星的S3C44B0,现在又改用了NXP的LPC2131。这两者一个使用片外的RAM,另外一个把RAM集成在了芯片内,但在利用Keil进行调试的时候,两者基本一样,所以后面以LPC2131为例说明。
首先,建立工程,选择需要的芯片,加载默认的启动代码Startup.s(由于目前大多数厂家出的开发板自带的程序都是基于ADS的,而ADS下的Startup.s和Keil下的有区别,所以如果直接用开发板自带的启动代码的话会出现一些错误),添加你所需要的各个代码文件,然后在Target那个文件夹图标那里右击,然后在弹出的菜单中,选择“option for target”,然后在弹出的界面上选择“Target”选项卡然后设置你的晶振频率。如果编译没有问题的话,那么就可以直接用Keil进行软件仿真了。
第二,开始JTAG调试设置,前提是你已经连接好JTAG线,并运行相应的JTAG驱动程序如H-JTAG,首先右击Startup.s,然后在弹出的菜单中,选择“option for startup.s”,进入后选择“Asm”选项卡,在下面的“Define”后面的空白处填入“RAM_MODE REMAP”。这是要设置RAM调试模式,地址重定位
第三,在Target那个文件夹图标那里右击,然后在弹出的菜单中,选择“option for target”,然后在弹出的界面上选择“Target”选项卡,在“Read only area”下方选择“on-chip”,选中前面的default,然后第一个空填入0x40000000,第二个空填入0x1000,选中startup,然后在后面对应的行内选中default,第一个空填入0x40001000,第二个空填0x1000,后面的starup不要选中。(这几个数据与所选的CPU型号有关,如果是44b0的话,对应的是0x0c000000,0x2000,0x0c000000,0x2000。)
注意,这一步中,第一个数字代表你的芯片所对应的真实的RAM的起始地址,第二个数字表示你仿真时用来模拟只读区域的长度,第三个数字代表仿真时模拟RAM的长度,它的值必须大于等于第一个值加第二个值,否则会编译时提示你两个区域重合的错误。另外,第二个数字加第四个数字必须小于等于你的真实物理RAM的大小,推荐小于,因为你的RAM生产中不可能刚刚好是标称的大小。
另外补充,两个区域的大小不是固定的,可以根据需要调整,但是有时候要注意,如果你的区域设置不合适,可能会出一些问题,所以推荐第一个区域大于等于第二个区域,一般可以设为平分RAM。
第四,点击Linker选项卡,取消“Use Memory Layout From Dialog”,然后在后面的R/O base和R/W base中填入在Target选项卡中的第一个和第三个数字,必须保持对应。清空下面的Scatter File中文件名。
第五,点击Debug选项卡,选择右半部分的Use……(默认是左半部的Use Simulator),在后面的下拉菜单里选择“RDI Interface Driver”(不是带有JTAG字样的那个啊),然后点击setting,选择你的H-JTAG驱动程序所在的目录下对应的H-JTAG..dll(可能你用的JTAG驱动和我的不一样,方法是一样的),然后config一下。
第六,点击确定后返回刚才的options for target界面Debug选项卡,取消RDI Interface Driver下面的“Load Application at Startup”。
第七,在你的工程对应的目录下,新建一个文本文档,输入以下内容
FUNC void Setup (void)
{
PC = 0x40000000;  //这里的值填你的RAM起始地址,也就是在//Target中的第一个值,如44b0换成0x0c000000
}
Setup(); // Setup for Download
LOAD ****.axf INCREMENTAL // Download
g,main
其中****.axf为你编译好后生成的文件名,根据实际情况修改
然后保存为RAM.ini文件。
在刚才的. Debug选项卡Load Application at Startup下面的Initialization Files里边选择你刚才的那个RAM.ini文件,然后点击确认保存。
第八,重新编译你的工程,点击Debug进行调试,如果进入后,PC定位在了RAM起始地址的话,则可以开始调试,否则再检查一次。

一些可能出现的问题
1:最好是先擦除你的CPU的Flash,这样加电后,芯片不会执行程序,否则会出现一点击调试,程序就开始运行了,但不出结果,而不是停留在RAM开始处,但这个问题似乎在调试44b0的时候没有发现,原因不明。
2:一点击调试,程序就开始运行,除了第一种可能以外,还有可能前面的设置有问题,重新设置一下,再者,停止Debug,断掉你的开发板电源,重新加电一次试试,这种情况常见于Debug一次后再一次Debug时候,因为JTAG连上以后,就会带电,而如果上次Debug错误,即使复位,RAM中仍然没有完全断电,第二次Debug时上次的程序还在运行,所以出问题。
3:由于LPC2131的RAM较小,8K,如果你的程序较大的话,比如你把很多的端口初始化以及接口子函数都用上了,那么就会发现,你在Debug时,开始停在RAM起始地址,点击运行后就会进入死循环,如果单步运行的话可以发现你的程序只能执行到一半。如果你换一个简单的小文件没有出现这种情况的话,那么只能是你的程序代码太大了(我这样理解,具体是不是可能还要请教高手)。
以上就是一些简单的总结,一部分来自互联网,一部分自己体会、猜测,如果有高手指出错误,本人不甚感激,因为关于Keil工具的参考资料实在很少啊。

k​e​i​l​ ​c​ ​的​在​线​调​试​与​断​点​设​置

http://wenku.baidu.com/link?url=BEg4dXUgUMUUcjYqjFGC1dgztwgsX6o-K27i9wcR82tLXo0p79UIL6CJe0WTUvp0vCTYDyLRJN8RziBY2Lo4flkw0uMu3cHml6UCpaUpfKa

CTRL+F5后,Keil 内建了一个仿真 CPU 用来模拟执行程序,该仿真 CPU 功 能强大,可以在没有硬件和仿真机的情况下进行程序的调试。

不过在学习之前必须明确,模拟毕竟只是模拟,与真实的硬件执行程序肯定还是有区别的,其中最明显的就是时序,软件模拟是不可能和真实的硬件具有相同的时序的,具体的 表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。

在线汇编 
在进入 Keil 的调试环境以后,如果发现程序有错,可以直接对源程序进行修改,但是 要使修改后的代码起作用,必须先退出调试环境,重新进行编译、连接后再次进入调试,如 果只是需要对某些程序行进行测试,或仅需对源程序进行临时的修改,这样的过程未免有些 麻烦,
为此 Keil 软件提供了在线汇编的能力,将光标定位于需要修改的程序行上,用菜单Debug->Inline
 Assambly
… 即可出现如图 3 的对话框,在 Enter  New 后面的 编缉框内直接输入需更改的程序语句,输入完后键入回车将自动指向下 一条语句,可以继续修改,如果不再 需要修改,可以点击右上角的关闭按钮关闭窗口


图 3

抱歉!评论已关闭.