MDK 启动代码中复制RW 字节对齐
LDR r0,=|Image$$RO$$Limit| ;LDR r1, =|Image$$RW$$Base| ; and RAM copy
LDR r3, =|Image$$ZI$$Base| ; Zero init base => end of RW init
CMP r0, r1 ; Check that they are different
BEQ RWDONE
RWINIT
CMP r1, r3 ; Copy init values for RW data
LDRCC r2, , #4
STRCC r2, , #4
BCC RWINIT
帮忙看看,这是初始化的时候复制RW类容的程序。
如果Image$$RO$$Limit是4字节的倍数,就没问题,但是如果不是,例如尾数是3,他就会提前3个字节开始多复制RW,也就是说我所有RW的初值都移位了。
有人遇到过同样的情况么,需要怎么设置MDK。或者有办法加一段ASM去解决。多谢!!! 等.... 等.... 本来就得4字节对齐吧…… 回复【楼主位】gmyu
-----------------------------------------------------------------------
解决办法是不要自己去复制,让__main自己去完成。要裁剪C运行库也不是这么干的。
这样初始化的,基本上都是源自很久以前,ADS那时候的代码;这么做会和C运行库构建起模模糊糊的关系,结果就是潜在的不定错误。
另外,RVCT4的RAM初始化数据可能是有压缩的;而且这样初始化,在多Exec Region的时候会出错。 顶楼上,我也这么想过,一直没试过。是自己不能摆脱8位机的思想,凡是都想亲历亲为,有时候虽然只是一条语句调用一个库就加上10k的代码。
主要是看到本坛的一个同志说过不要去调用_main,特别是将来要移植OS的时候。 IMPORT__main
;LDR R0, =main_entry
;BX R0
B __main
改了一个语句,让MDK去跳转到C,代码增加了500个字节,编译pass,程序却停在
SWI_Handler B SWI_Handler
不能跳转到main() 代码全部重新写过,现在ok了,多谢dr2001
页:
[1]