40、重定位代码段、只读段、数据段与位置无关码

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

1、以前我们都是分体的连接脚本,就是代码段和数据段是分开来的,而uboot不是分体的连接脚本,而是连在一起的,而且JATG是不支持分体调试的。如下

SECTIONS
{
    . = 0x30000000;

    . = ALIGN(4);
    .text      :
    {
      *(.text)
    }

    . = ALIGN(4);
    .rodata : { *(.rodata) }

    . = ALIGN(4);
    .data : { *(.data) }

    . = ALIGN(4);
    __bss_start = .;
    .bss : { *(.bss) *(.COMMON) }
    _end = .;
}

2、程序启动分析

3、B和bl跳转,只是相对跳转命令,还是在flash上面运行,而不是在SDRAM上面运行。

4、位置相对码和位置绝对码。

5、位置无关码的定义

就是和位置没有关系的代码,使用的是相对位置,不是绝对位置,他是flash中执行,不是在sdram中执行。

6、数组不能放在重定位前面,因为初始值冲放在可读数据段里面。

/**************************************************************************   
* 设置控制SDRAM的13个寄存器
* 使用位置无关代码
**************************************************************************/   
void memsetup(void)
{
    unsigned long *p = (unsigned long *)MEM_CTL_BASE;    
    p[0] = 0x22111110;        //BWSCON
    p[1] = 0x00000700;        //BANKCON0
    p[2] = 0x00000700;        //BANKCON1
    p[3] = 0x00000700;        //BANKCON2
    p[4] = 0x00000700;        //BANKCON3    
    p[5] = 0x00000700;        //BANKCON4
    p[6] = 0x00000700;        //BANKCON5
    p[7] = 0x00018005;        //BANKCON6
    p[8] = 0x00018005;        //BANKCON7
    p[9] = 0x008e07a3;        //REFRESH,HCLK=12MHz:0x008e07a3,HCLK=100MHz:0x008e04f4
    p[10] = 0x000000b2;        //BANKSIZE
    p[11] = 0x00000030;        //MRSRB6
    p[12] = 0x00000030;        //MRSRB7
}


#endif

void sdram_init2(void)
{
    unsigned int arr[] = {
        0x22000000,     //BWSCON
        0x00000700,     //BANKCON0
        0x00000700,     //BANKCON1
        0x00000700,     //BANKCON2
        0x00000700,     //BANKCON3    
        0x00000700,     //BANKCON4
        0x00000700,     //BANKCON5
        0x18001,     //BANKCON6
        0x18001,     //BANKCON7
        0x8404f5,     //REFRESH,HCLK=12MHz:0x008e07a3,HCLK=100MHz:0x008e04f4
         0xb1,    //BANKSIZE
         0x20,    //MRSRB6
         0x20,    //MRSRB7

        };
    volatile unsigned int * p = (volatile unsigned int *)0x48000000;
    int i;

    for (i = 0; i < 13; i++)
    {
        *p = arr[i];
        p++;
    }
    
}

2、重定位代码段、只读段、数据段

    /* 重定位text, rodata, data段整个程序 */
    mov r1, #0
    ldr r2, =_start         /* 第1条指令运行时的地址 */
    ldr r3, =__bss_start    /* bss段的起始地址 */

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

猜你喜欢

转载自blog.csdn.net/qq_18077275/article/details/89301202
今日推荐