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