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中的拷贝函数,拷贝采用批量拷贝。