39、优化重定位数据段和清bss段

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18077275/article/details/89299465

1、因为每次读取一个字节开销太大,需要优化,DQM因cpu写入四个字节,屏蔽另外的三个字节

2、改进,已四字节为单位操作flash和SDRAM。

3、改进后的代码

    /* 重定位data段 */
    ldr r1, =data_load_addr  /* data段在bin文件中的地址, 加载地址 */
    ldr r2, =data_start      /* data段在重定位地址, 运行时的地址 */
    ldr r3, =data_end          /* data段结束地址 */

cpy:
    ldr r4, [r1]
    str r4, [r2]
    add r1, r1, #4
    add r2, r2, #4
    cmp r2, r3
    ble cpy


    /* 清除BSS段 */
    ldr r1, =bss_start
    ldr r2, =bss_end
    mov r3, #0
clean:
    str r3, [r1]
    add r1, r1, #4
    cmp r1, r2
    ble clean

4、以上清bss段的时候会清掉一些其他的全局变量,因为四字节对其的原因导致,将地址0x3000 0002强制取值为0x3000 0000。需要改进连接脚本为,强制所以全局变量向四取整。添加. = ALIGN(4);

SECTIONS {
   .text   0  : { *(.text) }
   .rodata  : { *(.rodata) }
   .data 0x30000000 : AT(0x800) 
   { 
      data_load_addr = LOADADDR(.data);
      . = ALIGN(4);
      data_start = . ;
      *(.data) 
      data_end = . ;
   }
   
   . = ALIGN(4);
   bss_start = .;
   .bss  : { *(.bss) *(.COMMON) }
   bss_end = .;
}

5、同理重定位data段的时候也会有这样的问题,因为我们手动设置了.data 0x30000000 : AT(0x800)  四字节对其了,也可以添加如下  . = ALIGN(4);

.data 0x30000000 : AT(0x800) 
   { 
      data_load_addr = LOADADDR(.data);
      . = ALIGN(4);
      data_start = . ;
      *(.data) 
      data_end = . ;
   }

6、可以参考uboot里面的连接脚本和start.S中的拷贝函数,拷贝采用批量拷贝。

猜你喜欢

转载自blog.csdn.net/qq_18077275/article/details/89299465