微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 位置无关和位置相关

位置无关和位置相关

时间:11-21 来源:互联网 点击:
1、

SECTIONS {

firtst 0x00000000 : { head.o init.o nand.o}

second 0x30000000 : AT(4096) { main.o }

}

对应启动源码:

@将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中

@nand_read_ll函数需要3个参数:

ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址

mov r1, #4096 @2. 源地址 = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处

mov r2, #2048 @3. 复制长度= 2048(bytes),对于本实验的main.c,这是足够了

bl nand_read @调用C函数nand_read

2、

SECTIONS {

. = 0x30000000;

.text : {

head.o(.text)

init.o(.text)

nand.o

*(.text)

}

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

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

.bss ALIGN(4) : { *(.bss) *(COMMON) }

}

@将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中

@nand_read_ll函数需要3个参数:

ldr r0, =0x30000000 @1. 目标地址=0x30000000,这是SDRAM的起始地址

mov r1, #0 @2. 源地址 = 0

mov r2, #4096 @3. 复制长度= 4096

bl nand_read @调用C函数nand_read

总结:S3C2440启动时硬件会强制的把nand flash中前4K的内容复制到2440片内的RAM中执行,这4K的代码的任务是初始化nand flash、SDRAM,然后把全部的代码从nand flash中拷贝到SDRAM中,再跳到SDRAM中执行。

1、1中head.o init.o nand.o三个文件的链接地址是:0x00000000 即片内内存(RAM),当硬件把前4K内容拷贝到2440片内的RAM中时head.o init.o nand.o三文件就在片内执行,实际运行的地址和运行时应该在的地址相同,故这三段代码中可以使用位置相关码,即可以使用全局变量,当初始化nand flash、SDRAM完成后只是拷贝了源地址=4096的main.o段;

2、中head.o init.o nand.o三个文件的链接地址是:0x30000000,即片外SDRAM,说明head.o(.text) 、init.o(.text) 、nand.o *(.text)这三段代码运行时应该在0x30000000地址,但是S3C2440启动时硬件会强制的把nand flash中前4K的内容复制到2440片内的RAM中执行时它们处于0x00000000 的地址,故只能使用位置无关码,即不可以使用全局变量,当初始化nand flash、SDRAM完成后程序拷贝了全部的代码,拷贝过去以后head.o(.text) 、init.o(.text) 、nand.o *(.text)三文件才位于该在的地址:0x30000000。

注:链接地址是程序运行时应该位于的地方,如果程序不在链接地址上运行,那么访问全局变量的时候就会出错。


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top