历史上的今天
返回首页

历史上的今天

今天是:2024年09月10日(星期二)

正在发生

2021年09月10日 | S3c2440代码重定位详解4---拷贝代码和链接脚本的改进

2021-09-10 来源:eefocus

本节进行拷贝代码的改进和链接脚本的改进。

前面重定位时,需要ldrb命令从的Nor Flash读取1字节数据,再用strb命令将1字节数据写到SDRAM里面


cpy:

    ldrb r4, [r1] /*首先从flash读出一个字节*/ 

    strb r4, [r2] /*让后把数据写到SDRAM*/

    add r1, r1, #1

    add r2, r2, #1

    cmp r2, r3

    bne cpy


JZ2440上的Nor Flash是16位,SDRAM是32位。

假设现在需要复制16byte数据,

采用ldrb命令每次只能加载1byte,因此CPU需要发出16次命令,内存控制器每次收到命令后,访问硬件Nor Flash,因此需要访问硬件16次;

同理,访问SDRAM时,CPU需要执行strb 16次,内存控制器每次收到命令后,访问硬件SDRAM,也要16次,这样总共访问硬件32次。


现在对其进行改进,使用ldr从Nor Flash中读,ldr命令每次加载4字节数据,因此CPU只需执行4次,但由于Nor Flash是16位的,内存控制器每次收到CPU命令后,需要拆分成两次访问,因此需要访问硬件8次;

使用str写SDRAM,CPU只需执行4次,内存控制器每次收到命令后,直接硬件访问32位的SDRAM,因此这里只需要4次,这样总共访问只需要12次。


在整个操作中,花费时间最长的就是硬件访问,改进后代码,减少了硬件访问的次数,极大的提高了效率。

在这里插入图片描述

根据上面原理修改代码,修改start.S


cpy:

ldr r4, [r3]

str r4, [r0]

add r0, r0, #4

add r3, r3, #4

cmp r0, r1

ble cpy

/*清除BSS段*/

mov r0, #0

ldr r1, =bss_start

ldr r2, =bss_end

clear:

str r0, [r1]

add r1, r1, #4

cmp r1, r2

ble clear

bl main


然后编译烧写,发现启动后没有输出字符。修改主程序,尝试以整数格式输出字符,发现输出的数从0开始,应该是

全局变量被破坏了

在这里插入图片描述
在这里插入图片描述

由上图可知:


str r0,[r1]    ===> 

把0存在0x30000002地址里面,

由于要4字节对齐,

所以把把0存在0x30000000地址里面.而0x30000000时数据g_char地址,所以破坏了全局变量


屏蔽掉start.S里面的清理命令,测试是否是清除bss段是清除了全局变量。


clean:

    //str r3, [r1] //注释掉此句话,str不仅把bss段清除,把全局变量这些也清除了

    add r1, r1, #4

    cmp r1, r2

    ble clean


    bl main


屏蔽后,正常输出,锁定了问题大致位置。查看反汇编文件,原来是没有向4取整。

修改链接脚本让bss段,使用ALIGN(4)向4取整。


SECTIONS {

.text 0 : {*(.text)}

.rodata : {*(.rodata)}

.data 0x30000000 : AT(0x700)

{

data_load_addr = LOADADDR(.data);

data_start = . ;

*(.data)

data_end = . ;

}

. = ALIGN(4); 

bss_start = .;

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

bss_end = .;

}


现在重新编译烧写,测试结果正常。

再次查看反汇编文件,发现现在bss段以4字节对齐,清理bss段也是正常的

在这里插入图片描述

同样的问题也会出在代码重定位这里,如何保证data段起始地址也是向4对齐呢?

也是使用ALIGN(4)向4取整


SECTIONS

{

    . = 0x30000000;


    . = ALIGN(4);

    .text      :

    {

      *(.text)

    }


    . = ALIGN(4);

    .rodata : { *(.rodata) }


    . = ALIGN(4);

    .data : { *(.data) }


    . = ALIGN(4);

    __bss_start = .;

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

    _end = .;

}


Uboot是裸机的集大成者,可以参考uboot链接脚本也是类似的

推荐阅读

史海拾趣

GREATECS公司的发展小趣事

在电子行业中,有许多伟大的企业(GREATECS公司,这里假设为泛指多个杰出电子企业)通过不同的路径和策略实现了显著的发展。以下是五个相关故事,每个故事均基于事实,旨在展示这些企业如何成长和壮大。

1. 通用电气(General Electric, GE)的多元化扩张

通用电气(GE)的故事始于1888年,由托马斯·爱迪生创立,最初专注于电力和照明领域。随着时间的推移,GE通过一系列的战略并购和内部创新,逐渐扩展到电机、电动机制造、航空、医疗设备、核能等多个领域。在20世纪,GE成为全球最大的多元化企业之一,其业务遍布全球。特别是在杰克·韦尔奇担任CEO期间(1981-2001),通过大规模的并购和扩张,GE的营业收入和市值显著增长。然而,2008年金融危机后,GE面临经济困境,随后进行了战略调整,出售金融资产并重点发展核心业务,如今仍是全球领先的科技和工业公司之一。

2. 索尼(Sony)的创新之路

索尼公司成立于1946年,最初由井深大和盛田昭夫创立,起初是一家小型电子产品制造商。索尼的崛起得益于其持续的创新精神和对消费者需求的敏锐洞察。1958年,索尼推出了世界上第一台便携式晶体管收音机,开启了便携式电子产品的新时代。随后,索尼又推出了Walkman便携式音乐播放器、PlayStation游戏机等一系列革命性产品,这些产品不仅改变了人们的娱乐方式,也奠定了索尼在全球电子行业的领先地位。索尼的成功在于其不断追求技术创新和产品质量,以及对市场趋势的准确把握。

3. 三星电子的崛起

三星电子是韩国最大的电子企业,其发展历程充满了挑战与机遇。起初,三星主要从事贸易和低端电子产品制造。然而,在20世纪80年代末至90年代初,三星决定实施“新经营”战略,通过大规模投资研发、提升产品质量和品牌形象,实现了从低端制造商向高端科技企业的转型。在半导体、智能手机、显示面板等领域,三星取得了重大突破,成为全球市场的领导者。三星的成功在于其强大的研发能力、高效的供应链管理以及对市场变化的快速响应。

4. 英特尔(Intel)的芯片霸主地位

英特尔公司成立于1968年,最初是一家专注于半导体存储器的初创企业。然而,随着日本存储器制造商的崛起,英特尔面临了巨大的竞争压力。在关键时刻,英特尔决定放弃存储器业务,转而专注于微处理器(CPU)的研发和生产。这一战略转型使英特尔迅速崛起为全球最大的CPU制造商,其“Intel Inside”计划更是深入人心,成为个人电脑行业的标准配置。英特尔的成功在于其强大的技术创新能力、对市场需求的精准把握以及与全球合作伙伴的紧密合作。

5. 华为的技术突破与全球化战略

华为作为中国电子行业的代表企业,其发展历程充满了传奇色彩。起初,华为主要从事电信设备的研发和销售。然而,随着技术的不断进步和市场需求的不断变化,华为逐渐将业务扩展到智能手机、云计算、人工智能等多个领域。华为的成功在于其持续的技术研发投入、对全球市场的深入洞察以及灵活的市场策略。特别是在5G技术方面,华为取得了重大突破,成为全球领先的5G解决方案提供商。同时,华为还积极推动全球化战略,与全球多个国家和地区的运营商建立了紧密的合作关系。

General Electric Solid State公司的发展小趣事

首先,需要澄清的是,直接关于“General Electric Solid State”公司的发展故事在现有的参考资料中并不详尽,因为“General Electric Solid State”可能并不是一个独立的公司名称,而是指通用电气公司(General Electric Company,简称GE)在固态技术或固态电子领域的业务或产品部门。以下是根据通用电气公司在电子行业,特别是固态技术领域的发展历程,提炼出的五个相关故事:

1. 固态技术的早期探索

背景:在20世纪中后期,随着半导体技术的飞速发展,通用电气公司(GE)作为电气行业的领导者,迅速投入到了固态技术的研发中。这一时期,GE的工程师们致力于开发更高效的固态器件,如晶体管、集成电路等,以替代传统的电子管设备。

发展:GE的研究团队在固态材料的选择、制造工艺的优化以及性能提升方面取得了显著进展。这些成果不仅推动了GE自身产品的升级换代,也为整个电子行业向固态化、集成化方向发展奠定了基础。

2. 固态器件在电力系统中的应用

背景:电力系统是GE的传统优势领域之一。随着固态技术的成熟,GE开始将固态器件应用于电力系统中,以提高电力系统的效率和可靠性。

应用:GE研发了一系列基于固态技术的电力电子设备,如固态继电器、固态断路器、固态变压器等。这些设备在电力系统中扮演着重要角色,能够有效减少能源损耗、提高电力传输效率,并增强电力系统的稳定性和安全性。

3. 固态照明技术的突破

背景:通用电气公司的创始人托马斯·爱迪生因发明电灯而闻名于世。进入21世纪后,GE继续在照明领域深耕,将固态技术应用于照明产品中。

成果:GE成功推出了LED(发光二极管)照明产品,这些产品具有能效高、寿命长、环保等优点。GE的LED照明技术不仅应用于家庭和商业照明领域,还广泛应用于户外照明、工业照明等多个场景,为全球节能减排事业做出了贡献。

4. 固态传感器与工业自动化

背景:随着工业自动化水平的不断提高,对传感器的精度、稳定性和可靠性提出了更高的要求。GE凭借其在固态技术方面的积累,开始研发高性能的固态传感器。

应用:GE的固态传感器在工业自动化领域得到了广泛应用,如温度传感器、压力传感器、加速度传感器等。这些传感器能够实时监测设备的运行状态和环境参数,为工业自动化控制提供精准的数据支持。

5. 固态技术在医疗设备中的创新

背景:医疗设备对技术的要求极高,尤其是在精确性和可靠性方面。GE作为医疗设备领域的领军企业之一,不断将固态技术引入医疗设备的研发中。

创新:GE利用固态技术开发出了一系列创新的医疗设备,如固态成像设备(如CT、MRI等)、固态激光治疗器等。这些设备在医疗诊断、治疗等方面发挥了重要作用,提高了医疗服务的效率和质量。

请注意,以上故事是基于通用电气公司在电子行业,特别是固态技术领域的整体发展历程进行提炼的。由于“General Electric Solid State”并非一个明确的公司名称,因此故事中的具体细节可能需要根据GE的实际情况进行适当调整和补充。

Fronter Electronics Co Ltd公司的发展小趣事

为了寻求更广阔的发展空间,Fronter电子开始积极拓展国内外市场。公司通过参加各类行业展会、建立广泛的销售网络以及开展国际合作等方式,不断开拓新客户和市场领域。同时,Fronter电子还逐步向多元化经营转型,不仅限于电子元器件的销售,还涉足到了电子产品的设计、制造和服务等多个环节。这种多元化经营的策略使得Fronter电子能够更好地满足市场需求,提升整体竞争力。

安森德(Ascend)公司的发展小趣事

随着产品技术的成熟,安森德公司开始积极拓展市场。公司凭借优质的产品和服务,成功进入工业电源、电机驱动、消费电子等多个领域。同时,安森德积极寻求与全球顶尖企业的战略合作,通过与这些企业的技术交流和业务合作,不断提升自身的技术水平和市场竞争力。这些合作不仅为安森德带来了更多的商业机会,也进一步提升了公司在行业内的知名度和影响力。

ATO SOLUTION公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。ATO SOLUTION公司始终坚持以质量为核心,建立了严格的质量管理体系。公司从原材料采购到产品生产的每一个环节都进行严格把控,确保产品质量的稳定性和可靠性。这种对品质的执着追求,使公司赢得了客户的信任和口碑,为公司的长期发展奠定了坚实基础。

CUI公司的发展小趣事

近年来,智能化和物联网技术的快速发展为电子行业带来了前所未有的机遇。CUI技术作为实现电子设备智能化和互联互通的关键环节之一,得到了广泛的应用。一些企业针对智能化和物联网的需求,开发出具有特殊功能的CUI材料,如柔性CUI、透明CUI等,为电子产品的创新提供了有力支持。

请注意,以上故事仅为概述性质,并非针对特定公司的实际发展历程。每个公司的具体情况可能因市场环境、技术实力、管理策略等因素而有所不同。如果需要了解特定公司的具体发展故事,建议查阅相关公司的官方网站、新闻报道或行业分析报告。

问答坊 | AI 解惑

求助:plc 选型

主要是用PLC和触摸屏做一个控制柜(用于水泥厂的立磨),没有其他特别要求。总共I/O点数分别为:DI 101个,DO 32个,AI 58个,AO 7个。要求接口要有20%的冗余。 请大家支招,用哪个型号的PLC?谢谢!…

查看全部问答>

QuartusII10.0 Bug汇总

QuartusII 10.0 的新颖之处的确吸引着大家,但是由于是用QT重写了quartus,可能很多地方存在bug 1。有没有安装完10.0之后并口下载线无法找到的?我的bbii不能用了!!! 声明一下,我的系统是重新装的,没有老版本的quartus存在!直接安装的10. ...…

查看全部问答>

DM9000驱动的问题

我用的是Mini2440开发板,板载的DM9000网卡的INT端接在SCS2440芯片上的EINT7上。在为uC/OS-II编写驱动时,请求EINT7中断就会死机。 代码如下: [code]…

查看全部问答>

想做一个usb驱程该从何入手啊

如题,对如何写驱程还不了解?正在看接口,还需要学什么呢?不同的设备所编写的驱程一样吗? …

查看全部问答>

wince 和 activesync连接不上,各位哥哥姐姐帮帮我把

1。前几天是可以连接上的,昨天起连不上了,证明这个版本的wince是可以用的 2。我的系统上2440,我重新下载了wince5.0的镜像文件,用的是usb下载方式,证明usb口和usb线是可以用的,用串口调试看 wince也启动起来了 3。无论我是先启动2440再插usb ...…

查看全部问答>

FPGA用AS模式下载的问题

请教一下quartus下下载的问题 用jtag模式都正确,下载.jic文件也可以 但是用as模式后就会出现不能识别id的错误 将*.sof转换为jic再用jtag下载后,可以正常工作,但是拔掉下载线后系统就不工作了,请问下怎么回事?错在哪儿? 配置芯片用万用表 ...…

查看全部问答>

bootLoadModule

STATUS bootLoadModule     (     FAST int fd,        /* fd from which to read module */     FUNCPTR *pEntry     /* entry point of module */   ...…

查看全部问答>

FPGA中管脚约束与管脚分配的区别

FPGA中管脚约束与管脚分配的区别:   管脚约束:指时序方面的设置,比如上升时间,保持时间等 管脚分配:定义该管脚的输入输出信号的功能。    …

查看全部问答>

100PIN,stm32控制PC卡问题

                                 我现在需要使用STM32F103vet6,100pin芯片来控制DVB-CI的PC卡(16位PCMCIA卡兼容),看了STM32技术参考手册,上面 ...…

查看全部问答>

wince 下用应用程序给nandflash 多分区的一个方法

在CSDN看到的,转过来学习一下 http://bbs.csdn.net/topics/330066780 用CreatePartition()就可以了。流程 1、用FindFirstStore()和FindNextStore()枚举系统中所有Store设备,根据szStoreName判断是不是我们要的Nand Flash。 2、根据找到 ...…

查看全部问答>