[求助]请教:在用ADS调试的时候,复位和中断处理的疑问
不知道是不是这样???如果是这样,那么也就是说,在flash中的初始化程序(bootloader)必须要运行完初始化工作后,转到一个特定的地方(与ADS调试程序约定的地方,或者更确切的说,应该是ADS中要进行程序的调试,应该将入口地址放在bootloader初始化后要执行的地方),是这样子的么?
如果是这样,那么,在编写非bootloader的程序进行调试时,中断向量的安排也要遵守一定的原则么?就是说也要放在bootloader在异常处理中跳转处么?
在将程序写到flash中后,正常的执行我是知道如何处理的,但是调试时,就不是很明白了.因为JTAG要在RAM中进行调试,那么就是说,必须要对RAM进行正确的初始化,只有初始化正确后,才能执行程序调试么???这样的话,就必须要有正确的bootloader才能使用JTAG进行程序的调试了???
或者,JTAG调试时,使用了一个特殊的"内存映射",让ARM内核能将复位程序及及异常处理程序的入口改到程序中的entry处呢???(好像这个不可能)
才学ARM,对于这个调试机制不清楚,哪位高手能够讲解一下是怎么回事呢???
我使用的是Samsung的S3C44B0,类似公板的那种简易开发板.
谢谢!
关键词: 求助 请教 在用 调试 时候 复位 中断 处理 疑
楼主好像钻到死胡同里去了:JTAG调试只能下载到RAM里去?可板子上电后只有FLASH可以用?那怎么调试?
其实问题很简单:你通过仿真器和DEBUGGER,可以直接配置CPU,使得SDRAM可以用。SDRAM的配置并不一定需要BOOTLOADER来完成的。所以,在调试的时候,一般是先通过debugger,用命令配置好存储空间,在下载程序调试。不过这样的缺点是每次板子重新上电后,都需要再次手动配置。我的做法是:在FLASH里面放一段配置存储空间的程序,这样,每次板子上电后,都先运行这段程序,把存储空间配置好,调试的时候,就可直接下载了,省去了手动配置的过程。
澄清一个个问题:调试只能在RAM里面?这个版主已经说了,其实调试可以在FLASH里面,也可以在RAM里面,为什么大部分的调试都在SDRAM里面呢?因为FLASH是READ ONLY的,你每次把程序下载到FLASH里面需要专门的烧写软件,而RAM是可读写的,通过仿真器,调试器可以直接把程序下载到RAM里面去,相对于FLASH调试而言,简单直接,而且节省时间。
非常感谢两位!
原来是可以在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之类,差别很大.希望高手指教啦!
CPU上电后,从地址0x0中取指令,然后开始执行,如果没有用户的干预,CPU将一直保持运行。。。
通过仿真器,不过CPU运行到那里了,都可以将CPU给停下来,让CPU进入调试状态。在调试状态下,通过仿真器可以修改CPU的状态,包括指令计数器(pc)。所以,FLASH原来的程序,不管它运行到那里了,都不会影响调试的。所以调试的一般过程:1-把CPU停下来,让它进入调试状态,2-下载你的程序到MEM里去;3-修改CPU的PC,让它执行你的程序的第一条指令;4-让CPU重新运行。
这样的话,CPU就会开始执行你的程序了,当然,在执行过程当中,你还可以在合适的地方设置断点,实现程序的单步运行。
X-JTAG的使用:
1.你下载X-JTAG的安装文件,运行SETUP安装;
2.用wiggler连接好你的板子,上电,然后启动X-JTAG,X-JTAG会自动检测到你的CPU
3.在ADS的调试器AXD里面进行如下的设置:AXD -> OPTIONS -> CONFIGURE TARGET -> ADD -> 选择X-JTAG安装目录下的XDI.DLL,按确定,就可以完成设置了。
4. 另外,建议把vector catch 和 semihosting给去掉:
AXD - > CONFIGURE PROCESSOR -> VECTOR CATCH ->CLEAR ALL
AXD -> CONFIGURE PROCESSOR -> SEMIHOSTING -> 把SEMIHOSTING给的那个选项给去掉。
设置好以后,你需要配置好你的板子的SDRAM,然后load image就可以下载程序到SDRAM里进行调试了。一般来说,你的程序的RO_BASE要设置在你的SDRAM地址范围内,这样就可以把程序下载到SDRAM里去调试。
哦,差不多明白了,谢谢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不厌其烦的解释,谢谢!
1. AXD不会自动去帮你配置SDRAM,配置SDRAM是用户的事情。AXD只不过提供了命令行,让
用户可以配置CPU内部的管理单元。AXD下载的时候,假设用户已经配置好了SDRAM,所以
在下载的时候,是用户的责任去确保下载的区域是可写的。一般,在下载完之后,你可以
在AXD里面用MEMORY VIEW看看内存的内容和你的程序是否一致。有鞋debugger也提供了
验证功能,在下载之后,把内容读回来,看看是否一样。象你所说的READBACK VERIFY ERROR
应该就是说明了下载不正确。
2. 不管什么时候,发生中断的时候,CPU都会到特定的地方去取中断处理指令。如果你要调试
中断处理程序的话,你自己必须保证中断处理的正确性。VECTOR CATCH的作用和你说的一样,
其实VECTOR CATCH的原理就是在相应的位置设置断点,捕捉中断。你在VECTOR CATCH的设置
的地方设置了相应的位,就会设置断点。不过在ARM7系列里,CPU本省没有提供专门的VECTOR
CATCH硬件以支持VECTOR CATCH,所以,调试器提示中断发生的时候,用户还需要自己判断一下。
特别是你的程序是从地址0x0开始执行的情况下。
3. 你的理解是正确的,可以随意设置PC。如果你想让程序从地址0x0开始执行,你可以在AXD里
自己设定PC的值,不过你自己要保证从地址0x0能取到有效的指令,不然的话,调试也没有意
义。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |