TO djyos: 函数的地址的确在变,
test是个函数,而addr是个全局变量,将函数test的地址赋给addr,结果在FLASH中运行和<br />把代码复制到RAM中运行时,addr的值变了.刚好相差那么多.从下面这个汇编结果也可以<br />看出来,它是将PC-0x170做为了test的地址,所以函数的地址不再是常量了。<br /><br /> 1015: addr=(unsigned long int)test; <br />0x0000351C E24F0E17 SUB R0,PC,#0x00000170<br />0x00003520 E59F11A8 LDR R1,[PC,#0x01A8]<br />0x00003524 E5810000 STR R0,[R1]<br /> 1016: test(); <br />0x00003528 EBFFFFA1 BL test(0x000033B4)<br /> 1017: ((void(*)(void))addr)(); <br /> 1018: <br />0x0000352C E59F019C LDR R0,[PC,#0x019C]<br />0x00003530 E5900000 LDR R0,[R0]<br />0x00003534 E1A0E00F MOV R14,PC<br />0x00003538 E12FFF10 BX R0<br /><br /><br /><br /><br /><br />to mybao: 我不太清楚HEX是如何转成bin的,因为HEX中直接有地址信息,所以中间<br />空的可以跳过.但是bin文件就是二进制文件,它是如何知道第一个字节的地址是多少的?<br />所以我认为二进制文件的第一个字节的地址为0.那么到地址0x0C000000,就有几百M那么大了。<br /><br />我把RO地址设置在0x0C000000,这样就编译通不过了,晕死,错误如下:<br />linking...<br />*** ERROR L138: CODE GENERATION: PROBLEM WHEN PROCESSING INSTRUCTIONS<br /> CAUSE: Target is out of Range<br /> SEGMENT: STARTUPCODE<br /> ADDRESS: 01E0H<br />Program Size: data=10490 const=3207 code=21504<br />Target not created<br /><br /><br />今晚又试了RealView,结果还是不行,倒塌了~~~~~自己的函数调用没问题. 问题好象出在<br />系统的库函数上,调用到这些时就会跑到FLASH中,不过具体是不是我还没弄清楚,全是汇编,<br />看了就头疼.....<br /><br />看来用让它全部产生相对跳转的代码是不大现实的了。但是把RO地址设置为RAM地址又<br />编译通不过,晕死.我现在的想法是,先编一个很小的串口程序,它可以通过串口将<br />一个bin文件加载(而这个bin文件就是我现在做的这个,把它的RO设置在RAM地址),<br />然后再跳转到这里执行。然后利用它,将自己再固化到FLASH中,然后下次复位后,<br />就把这些代码复制到RAM中,运行之...
|
|