jz2440裸机开发与分析:S3c2440代码重定位详解1---段的概念重定位的引入

S3C2440的CPU可以直接给SDRAM发送命令、给Nor Flash发送命令、给4K的片上SRAM发送命令,但是不能直接给Nand Flash发送命令
在这里插入图片描述

NAND启动过程

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

为什还可以使用NAND启动?

上电后,Nand启动硬件会自动把Nand Flash前4K复制到SRAM;
CPU从0地址运行SRAM;
如果我的程序大于4K怎么办?
前4K的代码需要把整个程序读出来放到SDRAM(即代码重定位)

NOR启动过程

如果从Nor Flash启动,会出现什么问题?

将拨动开关拨到Nor Flash启动时,此时CPU认为的 0地址 在Nor Flash上面,片内内存SRAM的基地址就变成了0x40000000(Nand启动时片内内存SRAM的基地址基地址是0),
由于Nor Flash特性:可以像内存一样读,但不能像内存直接写,因此需要把全局变量和静态变量重定位 放到SDRAM里。
例如执行如下几条汇编指令

 MOV R0, #0
 LDR R1, [R0] @读有效
 STR R1, [R0] @写无效

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


#include "s3c2440_soc.h"
#include "uart.h"
#include "init.h"

char g_Char = 'A';  //定义一个全局变量
const char g_Char2 = 'B'; //定义固定的全局变量
int g_A = 0;
int g_B;

int main(void)
{
    uart0_init();

    while (1)
    {
        putchar(g_Char); /*让g_Char输出*/
        g_Char++;         /* nor启动时, 此代码无效 */
        delay(1000000);
    }


    return 0;
}

编译运行查看是否有效果

查看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启动时, 此代码无效 */

Disassembly of section .data:
00000700 <__data_start>:
 700:   Address 0x700 is out of bounds.  //数据段
Disassembly of section .rodata:
                            //放在只读数据段内
00000474 <g_Char2>:         //const char g_Char2 = 'B';
 474:   Address 0x474 is out of bounds.

Disassembly of section .bss:    //bss段

00000804 <g_A>:             //int g_A = 0;

 804:   00000000    andeq   r0, r0, r0

00000808 <g_B>:             //int g_B;
 808:   00000000    andeq   r0, r0, r0
Disassembly of section .comment:

一个程序里面有:

1、.text 代码段
2、.data 数据段
3、rodata 只读数据段(const全局变量)
4、bss段 (初始值为0,无初始值的全局变量)
5、commen 注释
其中bss段和commen 注释不保存在bin文件中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值