这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » [求助]请教:在用ADS调试的时候,复位和中断处理的疑问

共5条 1/1 1 跳转至

[求助]请教:在用ADS调试的时候,复位和中断处理的疑问

菜鸟
2005-09-05 03:01:03     打赏
我看了一些资料,说JTAG调试只能在RAM中进行,但是复位地址是0x0处,也就是说,是在Flash中,这样的话,那么在用AXD进行调试的时候,是程序从0x0处运行,然后到RAM中的一个固定地址(所谓固定,是说ADS编写的调试程序必须要将入口放在这个位置)进行程序的执行,然后被ADS的调试断点断住,再进行调试?

不知道是不是这样???如果是这样,那么也就是说,在flash中的初始化程序(bootloader)必须要运行完初始化工作后,转到一个特定的地方(与ADS调试程序约定的地方,或者更确切的说,应该是ADS中要进行程序的调试,应该将入口地址放在bootloader初始化后要执行的地方),是这样子的么?

如果是这样,那么,在编写非bootloader的程序进行调试时,中断向量的安排也要遵守一定的原则么?就是说也要放在bootloader在异常处理中跳转处么?

在将程序写到flash中后,正常的执行我是知道如何处理的,但是调试时,就不是很明白了.因为JTAG要在RAM中进行调试,那么就是说,必须要对RAM进行正确的初始化,只有初始化正确后,才能执行程序调试么???这样的话,就必须要有正确的bootloader才能使用JTAG进行程序的调试了???

或者,JTAG调试时,使用了一个特殊的"内存映射",让ARM内核能将复位程序及及异常处理程序的入口改到程序中的entry处呢???(好像这个不可能)

才学ARM,对于这个调试机制不清楚,哪位高手能够讲解一下是怎么回事呢???

我使用的是Samsung的S3C44B0,类似公板的那种简易开发板.
谢谢!



关键词: 求助     请教     在用     调试     时候     复位     中断     处理         

菜鸟
2005-09-06 00:00:00     打赏
2楼

非常感谢两位!

原来是可以在ROM里调试程序的.还是有个疑问:我使用的板子是44B0,差不多就是公板的那个样子,BANK0是一个SST39VF160,从0x0c000000开始是16M的SDRAM.买来的时候,里面已经烧了一个也是很常见的那个44B0的bios吧,那么我调试的时候,是不是其实程序是先从flash的0x0地址开始运行BIOS,直到BIOS运行完后,跑到SDRAM中的一条特定地址呢?如果这个特定地址不是我要调试程序的入口(如在ADS中将程序的入口设在那一个位置),是不是就有可能运行不到我要调试的程序的入口?(我觉得应该是这样子的,那么也就是说,我调试程序时,应该将入口址与bios中的跳转址址进行配合.我觉得这样才合理的样子,但我问买我板子的那个人,他说只要是SDRAM里的任何位置都可以.但如果是那样,如果碰巧BIOS跳到我的调试程序的那个位置,是一个死循环呢!)

两位说直接在flash中调试程序也是允许的,那开始调试的时候,是不是ADS是默认在要调试程序的入口处设置断点?因为我用他给我的demo程序,看ro base是设置在SDRAM中的.每次调试时,也是在那个入口停下来的.于是我才有了一个疑问,是不是调试程序可以做remap(但44b0好像没有这个功能).如果我要以汇编的方式,从flash的入口址开始一句一句的调试(我说的汇编方式,是指因为没有flash那部分的源码,调试的时候,应该只可以看到汇编),应该在ADS中如何设置?

另外想问的是:那个汇编语言中的ENTRY,我看书上说,一个程序只允许有一个ENTRY,说那是程序的入口,也就是说,程序应该是将ENTRY作为程序"第一条"要执行的指令,那么的话,ENTRY开始的第一条指令应该是ro base吧?但好像情况不是这样子的,如果我在ADS的设置中,不在layout中,填入那个ENTRY所在的filename.o和modulename,程序并不一定将ENTRY那放在ro base处.实在觉得不知道是怎么回事.还有,如果我的汇编文件中已经有ENTRY关键字,是不是不用在link选项填入entry呢?

另外,ADS中有个link order,不知道是不是只有在link order那个项里的文件,才会被link呢?还是只要在file list中的都会被link?

初学arm,觉得不难,只是有些机制不是很明白,觉得跟以前用的51,avr之类,差别很大.希望高手指教啦!


菜鸟
2005-09-06 02:37:00     打赏
3楼

还是不太明白,我的意思是想问,如果flash中原来有代码,而我现在的程序,是从SDRAM开始的,那么在调试的时候,调试器启动CPU以后,是不是要先从flash中执行flash中的代码?

如果在要调试中的代码的入口处设置断点,是不是要flash中原来的程序,能够跳到入口点的SDRAM的地址才可以断住它?

另外,想请教XJTAG在ADS中如何使用?谢谢!


菜鸟
2005-09-06 05:11:00     打赏
4楼

哦,差不多明白了,谢谢twentyone!

嗯,再问详细些:

1.不同的SDRAM,可能时序有不同,像刷新之类的配置什么的也会不相同,那么,在ADS的AXD下载我的程序到SDRAM中去的时候,它使用的配置是直接用当前CPU的配置状态么(就是说,如果flash里面原来有初始化程序,初始化后的配置呢?)?在使用Flashprm下载程序的时候,会要配置一些状态.这个AXD,也是需要进行配置的么?我现在用Wiggler进行调试的时候,在AXD中,也没提示下载错误,但执行一会儿就跑飞了,到了DCD的位置.而在RealView中则出现这样的错误:

Error S0025 (Server): Unable to write memory at specified addr while Loading File.

Failed loading 'D:\Learning ARM\KEY\Key.axf'

Error: Readback verify error in Program memory at 8000

我不知道到底是什么原因?

2.这样看来,如果flash里原来没有中断向量,或者指向的中断向量位置与欲调试的程序的中断处理程序的位置不同,那就不能调试中断了吧?也就是说,其实发生中断的时候,44B0也是向flash中的中断处理程序里进行跳转吧?--确认一下,我觉得应该是这样子的.对了,那个VECTOR CATCH是不是指,发生选中的中断时,AXD就给断下来,而不管有没有在中断向量处设置断点?

3.你说的"3-修改CPU的PC,让它执行你的程序的第一条指令",也就是说,默认AXD是将PC修改为指向我SDRAM中的第一条指令处么?也就是说,开始执行调试时,其实第一条指令是执行的并不是FLASH中的0x0处的那条指令?(我估计这与AXD有关吧,应该是都可以吧,因为ARM中有embeded ICE,可以随意设置PC吧)不知道是不是这样?那有没有办法让AXD从0x0处开始执行调试呢?(问得有点多了,不过这一系统问题困挠了我几天,本来想自己用硬件试的,可板子可能有问题,flash不能编程,JTAG调试也有问题).

唉,初学ARM,问题多多,还请twentyone不厌其烦的解释,谢谢!


菜鸟
2005-09-06 08:09:00     打赏
5楼

谢谢,我想现在我算是基本理解是怎么回事了.

对了,在哪可以找到关于AXD调试时的那几个步骤的描述?有相关资料么?我把ADS安装目录下那个390页左右的"ADS_AXDarmsdGuide_D"大致看了一下,没有相关叙述,而且也没提到在调试前如何通过命令配置SDRAM的.同时,如果要配置SDRAM,是通过修改存储器的那些指令么?

再次谢谢你!


共5条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]