keil5下lpc2194程序不运行,但jtag调试正常

keil5下lpc2194程序不运行,但jtag调试正常,第1张

首先说明,在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的代码,求教高手等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9282777.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存