37、连接脚本和重定位的使用示例

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

1、norflash启动,全局变量的存储方式,因为norflash只能读,不能写

2、nandflash启动,全局变量的存储方式

3、解决全局变量在norflash启动时,无法读取norflash改写全局变量的问题,引入重定位

4、连接脚本的书写

SECTIONS {
   .text   0  : { *(.text) }                                //代码段
   .rodata  : { *(.rodata) }                            //可读段
   .data 0x30000000 : AT(0x800)              //数据段,.data 0x30000000代码运行地址,AT(0x800)在 bin文件中的地址
   { 
      data_load_addr = LOADADDR(.data);        //获取AT(0x800)在 bin文件中的地址
      data_start = . ;                                              //数据段开始
      *(.data)                  
      data_end = . ;                                             //数据段结束   
   }
   .bss  : { *(.bss) *(.COMMON) }             //*(.bss) *(.COMMON)段
}

5、重定位,重定位前需要初始化SDRAM

    bl sdram_init                           // 初始化SDRAM

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

cpy:                                  //重定位,拷贝数据段到SDRAM中,从norflash和SRAM中读取数据段到SDRAM中,后面在mian中就可
    ldrb r4, [r1]                   //以正常在norflash中使用全局变量的。
    strb r4, [r2]
    add r1, r1, #1
    add r2, r2, #1
    cmp r2, r3
    bne cpy

猜你喜欢

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