gmyu 发表于 2010-9-3 19:32:20

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去解决。多谢!!!

gmyu 发表于 2010-9-4 14:10:14

等....

gmyu 发表于 2010-9-4 19:05:21

等....

minux 发表于 2010-9-7 20:32:58

本来就得4字节对齐吧……

dr2001 发表于 2010-9-7 20:43:25

回复【楼主位】gmyu
-----------------------------------------------------------------------

解决办法是不要自己去复制,让__main自己去完成。要裁剪C运行库也不是这么干的。
这样初始化的,基本上都是源自很久以前,ADS那时候的代码;这么做会和C运行库构建起模模糊糊的关系,结果就是潜在的不定错误。

另外,RVCT4的RAM初始化数据可能是有压缩的;而且这样初始化,在多Exec Region的时候会出错。

gmyu 发表于 2010-9-10 16:32:28

顶楼上,我也这么想过,一直没试过。是自己不能摆脱8位机的思想,凡是都想亲历亲为,有时候虽然只是一条语句调用一个库就加上10k的代码。
主要是看到本坛的一个同志说过不要去调用_main,特别是将来要移植OS的时候。

gmyu 发表于 2010-9-10 17:14:39

IMPORT__main
                ;LDR   R0, =main_entry
                ;BX      R0
        B       __main

改了一个语句,让MDK去跳转到C,代码增加了500个字节,编译pass,程序却停在
SWI_Handler   B       SWI_Handler

不能跳转到main()

gmyu 发表于 2010-9-10 18:38:31

代码全部重新写过,现在ok了,多谢dr2001
页: [1]
查看完整版本: MDK 启动代码中复制RW 字节对齐