首先说明,在ARM中运行程序的方法其实和我们PC机差不多,程序开始是放在Flash中的,在芯片加电启动后,Flash中的程序会通过内存映射的方式加载到RAM中运行,这一步是由启动代码来完成的,对应PC机中的话,就是程序放在硬盘中,执行时把程序加载到内存中,然后在内存中运行程序。
所以在Keil中用JTAG调试实际上是要在RAM中调试。因为Flash中的程序烧写进去的,而用JTAG调试是没有办法更改Flash的,所以RAM调试和JTAG调试是一回事。
用过几天三星的S3C44B0,现在又改用了NXP的LPC2131。这两者一个使用片外的RAM,另外一个把RAM集成在了芯片内,但在利用Keil进行调试的时候,两者基本一样,所以后面以LPC2131为例说明。
首先,建立工程,选择需要的芯片,加载默认的启动代码Startups,(由于目前大多数厂家出的开发板自带的程序都是基于ADS的,而ADS下的Startups和Keil下的有区别,所以如果直接用开发板自带的启动代码的话会出现一些错误),添加你所需要的各个代码文件,然后在Target那个文件夹图标那里右击,然后在d出的菜单中,选择“option for target”,然后在d出的界面上选择“Target”选项卡然后设置你的晶振频率。如果编译没有问题的话,那么就可以直接用Keil进行软件仿真了。
第二,开始JTAG调试设置,前提是你已经连接好JTAG线,并运行相应的JTAG驱动程序如H-JTAG,首先右击Startups,然后在d出的菜单中,选择“option for startups”,进入后选择“Asm”选项卡,在下面的“Define”后面的空白处填入“RAM_MODE REMAP”。这是要设置RAM调试模式,地址重定位。
第三,在Target那个文件夹图标那里右击,然后在d出的菜单中,选择“option for target”,然后在d出的界面上选择“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-JTAGdll(可能你用的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为你编译好后生成的文件名,根据实际情况修改
然后保存为RAMini文件。
在刚才的 Debug选项卡Load Application at Startup下面的Initialization Files里边选择你刚才的那个RAMini文件,然后点击确认保存。
第八,重新编译你的工程,点击Debug进行调试,如果进入后,PC定位在了RAM起始地址的话,则可以开始调试,否则再检查一次。
一些可能出现的问题
1:最好是先擦除你的CPU的Flash,这样加电后,芯片不会执行程序,否则会出现一点击调试,程序就开始运行了,但不出结果,而不是停留在RAM开始处,但这个问题似乎在调试44b0的时候没有发现,原因不明。
2:一点击调试,程序就开始运行,除了第一种可能以外,还有可能前面的设置有问题,重新设置一下,再者,停止Debug,断掉你的开发板电源,重新加电一次试试,这种情况常见于Debug一次后再一次Debug时候,因为JTAG连上以后,就会带电,而如果上次Debug错误,即使复位,RAM中仍然没有完全断电,第二次Debug时上次的程序还在运行,所以出问题。
3:由于LPC2131的RAM较小,8K,如果你的程序较大的话,比如你把很多的端口初始化以及接口子函数都用上了,那么就会发现,你在Debug时,开始停在RAM起始地址,点击运行后就会进入死循环,如果单步运行的话可以发现你的程序只能执行到一半。如果你换一个简单的小文件没有出现这种情况的话,那么只能是你的程序代码太大了
本文目录一览:
1、Keil在单步调试为什么有些代码不执行 如第73 73行
2、keil c51问题,那程序前面没有绿色的代表没有执行吧,为什么调试不执行,实际会不会执行呢~~!?
3、为什么我用KEIL写好了程序, 却不能运行的?检查错误都不行?还有目标没有建立的语句出现?
4、你好,想请问一下,在KEIL中JTAG调试时,有几步程序直接跳过没执行,你是怎么解决这个问题的?谢谢
5、keil5下lpc2194程序不运行,但jtag调试正常
6、在用KEIL调试程序时,遇到读取外部数据、死循环使得程序不能继续执行时怎么办
Keil在单步调试为什么有些代码不执行 如第73 73行
因为在编译优化之后,该行并没有对应的唯一代码。并不是不执行,而是编译器没法放一个针对该行语句的断点。
keil c51问题,那程序前面没有绿色的代表没有执行吧,为什么调试不执行,实际会不会执行呢~~!?
可能是优化导致程序的运行过程与你的源代码并不能严格对应。
你可以查看生成的汇编,应当是符合你的预期流程的,只不过编译器自动将一些可以合并的代码段合并了。例如你每个函数中都有完全相同的代码块,这正是优化大显身手的机会。
代码级的调试应当以看汇编为主、源码为辅。
分类: 电脑/网络 >> 程序设计 >> 其他编程语言
问题描述:
int ask_over()
{
object me,mon;
int bonus,exp,pot,tempp,kar;
me = this_player();
kar = me->query("kar");
if (!me->query_temp("fengyaoover")) {
message_vision("平一指惊讶的对$N说道:“哦! 你再开什么玩笑,我这不是养老院。”\n",me);
return 1;
}
me->delete_temp("fengyaoover");
if (me->query_temp("fengyaow")) {
if(random(kar)>=11)
{
message_vision("平一指哼了一声,对$N说:“你是怎么搞的,乱分药,是想砸我的招牌吗?\n 看在你还努力的份上还是赏你点钱吧。”\n",me);
exp = 10 + random(20);
mon = new("/clone/money/silver");
mon->set_amount(exp);
tell_object(me,HIW"平一指给了你" + chinese_number(exp) + "两白银。 \n"NOR);
mon->move(me);
me->delete_temp("fengyaow");
return 1;
}
message_vision(" 平一指哼了一声,对$N说:你是怎么搞的,乱分药,是想砸我的招牌吗?\n",me);
return 1;
}
message_vision("平一指笑着对$N说:“小兄弟还不错嘛,可以可以,这是你应该得的。”\n",me);
exp = 10 + random(80);
pot = 10 + random(50);
bonus = (int) me->query("bat_exp");
tempp = bonus;
bonus += exp;
me->set("bat_exp", bonus);
bonus = (int) me->query("potential");
bonus += pot;
me->set("potential", bonus);
mon = new("/clone/money/silver");
mon->set_amount(exp);
mon->move(me);
me->start_busy(3);
tell_object(me,"你被奖励了:"HIR + chinese_number(exp) + NOR"点经验,"HIR+ chinese_number(pot) + NOR"点潜能和"HIW+chinese_number(exp) + NOR"两白银。 \n");
bonus=(int) me->query("potential");
return 1;
}
问一下,是不是表示如果far大于等于11的话会出现下面两行文字
平一指哼了一声,对$N说:“你是怎么搞的,乱分药,是想砸我的招牌吗?\n 看在你还努力的份上还是赏你点钱吧
如果far小于11的话 就只出现一行文字 不会出现上面的两行
平一指哼了一声,对$N说:“你是怎么搞的,乱分药,是想砸我的招牌吗?
不会出现上面的两行?
解析:
基本正确,但是注意判断条件中调用的是random(far),它返回1到far之间的一个随机值。
以上就是关于keil5下lpc2194程序不运行,但jtag调试正常全部的内容,包括:keil5下lpc2194程序不运行,但jtag调试正常、keil不更新程序调试、一段LPC的代码,求教高手等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)