欢迎光临散文网 会员登陆 & 注册

13.1代码重定位_段的概念

2020-08-20 18:40 作者:韦东山  | 我要投稿

S3C2440的CPU可以直接给SDRAM发送命令、给Nor Flash发送命令、给4K的片上SRAM发送命令,但是不能直接给Nand Flsh发送命令

假如把程序烧写到Nand Flsh上,即向Nand Flsh烧入 bin 文件,CPU是无法从Nand Flsh中取代码执行的。

为什还可以使用NAND启动?

  1. 上电后,Nand启动硬件会自动把Nand Flsh前4K复制到SRAM;

  2. CPU从0地址运行SRAM;

如果我的程序大于4K怎么办?
前4K的代码需要把整个程序读出来放到SDRAM(即代码重定位)。

如果从Nor Flash启动,会出现什么问题?
将拨动开关拨到Nor Flash启动时,此时CPU认为的 0地址 在Nor Flash上面,片内内存SRAM的基地址就变成了0x40000000(Nand启动时片内内存SRAM的基地址基地址是0),由于Nor Flash特性:可以像内存一样读,但不能像内存直接写,因此需要把全局变量和静态变量重定位 放到SDRAM里。


例如执行如下几条汇编指令 

当程序中含有需要写的全局变量或静态变量时,假如是在Nand Flash可以正常操作,如果是在Nor Flash,修改无效。因此我们需要把全局变量和静态变量重定位 放到SDRAM 

编译运行查看是否有效果

查看sdram.dis文件 发现data数据段放在了0x00008474这个地址导致 程序太大

在makefile中加入这么一句话 

arm-linux-ld -Ttext 0 -Tdata 0x700 start.o led.o uart.o init.o main.o -o sdram.elf

16进制的700就是十进制的2048 这时我们的bin文件就变为2049 


烧写程序:

烧写在NORFlash 和 烧写在NANDFlash观察这两种的效果。

设置成NANDFlash启动没有问题 显示ABCDE...

设置成NORFlash启动显示AAA...

对于NOR启动时

g_Char++;         /* nor启动时, 此代码无效 */


一个程序里面有

  • .text 代码段

  • .data 数据段

  • rodata 只读数据段(const全局变量)

  • bss段 (初始值为0,无初始值的全局变量)

  • commen 注释

其中bss段和commen 注释不保存在bin文件中。 


13.1代码重定位_段的概念的评论 (共 条)

分享到微博请遵守国家法律