ADX调试时,跳到一大堆dci指令.
ADS的设置按照芯片手册,应该不会错.
大家帮帮忙.
程序的bin文件直接在内存运行可以.
有些现象:刚开始时,很多Register为0,包括SP.刚开始调试会停在Main(),可以单步,但是碰到函数调用就到了一堆dci.估计是Data Abort Exception引起的.可是SP不应该是手动设置的吧?
那就奇怪了,即使bin也可以对应汇编,既然bin是能跑的,说明文件是好的,怎么会Data Abort 呢?这个bin到底是ok的?还是有error的?
bin OK.
反汇编看了一下,那条函数调用被翻译成bl 0x...,而这个地址是低于内存于ARM中定义的最低地址的.
整个文件载入以最低地址开始的RAM中,但其中的某个函数的开始地址却低于RAM最低地址.问题出在那里,重定位?
不是Data Abort.
init.o是第一个执行的,其第一句为跳转指令B(目标地址低于芯片定义的Rom最低地址),而该目标地址的内容就是一大堆dci指令.
问题是在ADS里定义了Ro Base为芯片定义的Rom最低地址,为什么编译出来的函数地址会低于Ro Base!?
init.o载入Ro Base后,默认入口为Ro Base,经观察,Ro Base处为Vector Table.
现在的问题是在进入Main()函数以前,必有一些初始化动作.那入口地址应该定在那里?
ARM架构的CPU,启动入口一般是在0x0,通常都是Flash,也就是说不管片内还是片外flash,只要是作为启动用的,都是从0x0开始的。而不是RAM地址。
在进入main()之前,做的是cpu的一些初始化配置,这些一般都是汇编语言写的。启动就是先执行这些汇编代码。
我拿别人的工程试了一下,上面的都没问题.
人家的init.o刚开始就是一片dci,照样执行,最后在Main()入口处中断.只是单步中断不能跟踪到Main().
俺的为什么就一直在dci指令片里转,或者说太大了还没跳出去?
被警告了:回复太快!如果你是恶意刷楼,将会受到严厉惩罚!^^