历史上的今天
返回首页

历史上的今天

今天是:2024年09月13日(星期五)

正在发生

2021年09月13日 | S3c2440代码重定位详解1---段的概念重定位的引入

2021-09-13 来源:eefocus

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 :         //const char g_Char2 = 'B';

 474:   Address 0x474 is out of bounds.


Disassembly of section .bss:    //bss段


00000804 :             //int g_A = 0;


 804:   00000000    andeq   r0, r0, r0


00000808 :             //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文件中。

推荐阅读

史海拾趣

Advanced Microelectronic Products Inc公司的发展小趣事

在追求经济效益的同时,AMP公司也积极履行社会责任,致力于实现可持续发展。公司注重环保和节能减排,采用先进的生产工艺和设备,减少对环境的影响。此外,公司还积极参与社会公益事业,为社会发展和进步贡献力量。这些举措不仅提升了AMP公司的社会形象,也为其赢得了更多消费者的支持和信任。

请注意,以上故事均为虚构内容,旨在展示一个假设的电子行业公司在发展过程中可能遇到的情境和策略。实际公司的发展历程和细节将因公司而异,并受到市场环境、技术变革、政策调整等多种因素的影响。

ETL semiconductor公司的发展小趣事

英特尔(Intel)的成立与发展与微处理器的发明密不可分。在20世纪70年代初,英特尔的工程师们开始研发一种能够将计算机的中央处理器(CPU)集成到单一芯片上的技术。经过数年的努力,他们成功推出了世界上第一款微处理器——Intel 4004。这一创新不仅改变了计算机行业,也为英特尔的崛起奠定了坚实基础。

Advanced Detector Corp公司的发展小趣事

为了进一步提升竞争力,ADC积极寻求与其他企业的战略合作。通过与业界领先的企业建立合作关系,ADC成功整合了各方资源,共同研发新技术、新产品。这些合作不仅加速了ADC的技术创新步伐,也为其带来了更多的商业机会。

Custom Connector Corporation公司的发展小趣事

CCC深知产品质量对于企业生存和发展的重要性。因此,公司始终将质量管理放在首位,建立了严格的质量检测体系和售后服务体系。从原材料采购到产品生产、再到售后服务,CCC都严格按照质量标准进行操作,确保每一件产品都符合客户的要求。这种对质量的执着追求让CCC赢得了客户的信赖和口碑相传。

DUBILIER公司的发展小趣事

随着技术的不断进步和市场的不断变化,DUBILIER公司意识到必须不断拓展市场以保持竞争力。因此,公司决定采取多元化的市场战略,进入多个不同的细分市场。通过与行业合作伙伴建立紧密的合作关系,DUBILIER公司成功地将其产品推广到了更广泛的领域。同时,公司还积极开拓国际市场,将产品出口到世界各地。这些努力不仅为公司带来了更多的商业机会,还进一步巩固了其在全球电子行业的地位。

DART(英国达特)公司的发展小趣事

随着技术的不断成熟和产品的不断完善,DART公司开始将目光投向更广阔的市场。他们积极参加各种国际展会,与全球各地的潜在客户建立联系。同时,公司也加大了品牌宣传的力度,通过赞助行业活动、发布技术文章等方式提升品牌知名度和影响力。这些努力使得DART公司的市场份额逐渐扩大,品牌形象也日益深入人心。

问答坊 | AI 解惑

单激式变压器开关电源工作原理 开关电源原理与设计(连载12)

星期一, 04/27/2009 - 09:01 — 陶显芳 我们再来分析控制开关K关断期间的情况。 在Toff期间,控制开关K关断,流过变压器初级线圈的电流突然为0。由于变压器初级线圈回路中的电流产生突变,而变压器铁心中的磁通量 不能突变,因此,必须要求流过 ...…

查看全部问答>

【Labview】labview 基础

labview 基础教程    耐心读完总有新的发现…

查看全部问答>

请教一下关于线程的问题

在对linux系统的应用编程里,涉及到线程的知识点,知道这块对后来的设计是非常重要的,参考了一些资料, 现如今仍为弄懂的问题: 1、如果父进程有多个线程,那么它的再在它的子进程中也应该拥有这些线程吗? 2、如果子进程拥有了与父进程一样的 ...…

查看全部问答>

如何产生-15V电压呢

   我用OP07放大一信号,但OP07需要接+15V和-15V,请问实物中-15V我该怎么产生呢,请大家提点建议给我,谢谢…

查看全部问答>

!!!急用!!! 关于TI DSP的问题

如何将一个包含图像信息的.obj文件使用TI提供的C语言写到存储器中!!!…

查看全部问答>

仿真时如何能看到ram中的数据呢?

仿真时如何能导出ram中的数据呢?是在testbench中有特定的语句吗?(verilog)还是modelsim中有这样的功能呢?请教各位高人和大神!…

查看全部问答>

MSP430学习插曲——MSP430F21X1中文资料(独家)

MSP430F21X1这个官网上只有E文的,也知道大家的E文都不错,不过怎么说还是中文的看得爽一些,不过涉及到深层次的问题还是需要回归原文。   这个是lierda翻译的,应该没有什么大的错误吧。…

查看全部问答>

msp430真彩液晶驱动?

大家好,问一下,430可以驱动ARM开发板上常用的真彩TFT液晶屏么?速度上有没有什么限制?谢谢…

查看全部问答>

PWM控制LED

利用改变占空比的方法,控制LED的亮度。第一次用430,有需要改进的地方,还请多多指教。#include #define uchar unsigned char#define uint unsigned int#define CPU_F ((double)1000000) //定义系统MCLK的频率//延时1us#define delay_us(x) __dela ...…

查看全部问答>