历史上的今天
返回首页

历史上的今天

今天是:2024年09月16日(星期一)

2021年09月16日 | s3c2440的2440init.s详解_补充

2021-09-16 来源:eefocus

1.S3C2440支持两种启动方式:NAND FLASH和NOR FLASH。


网上有很多文章分析TQ2440的启动文件2440init.s。介绍的很详细,我这里只是把S3C2440上电后的程序流程描述下。


不管在哪种启动方式下,ARM上电启动都是从0X00000000开始运行。下面是复位程序入口。


AREA Init,CODE,READONLY

ENTRY

ResetEntry

b ResetHandler

……

ResetEntry的值在ARM上电运行时是0X00000000,在JTAG仿真时是0X30000000。这个值很关键,在拷贝程序时会用到。


从NAND FLASH启动时,在ARM上电时,ARM会自动把NAND FLASH前4K的内容拷贝到S3C2440内部SRAM中,同时把SRAM的地址映射到0X00000000。ARM上电后会从SRAM处开始运行。


从NOR FLASH启动时,因为NOR FLASH接在bank0。地址映射是0X00000000。所以ARM上电后直接运行NOR FLASH里的程序。此时S3C2440内部SRAM地址为0X40000000。


在ARM上电的情况下,流程如下:

1、 关闭看门狗,关闭所有中断。

2、 设置系统工作频率,FCLK,HCLK,PCLK,UCLK。

3、 初始化内存控制寄存器,初始化参数在段SMRDATA里定义。SDRAM初始化在这里处理。

4、 在开发板上电时,按住接在EINT0脚上的按键会清零64MSDRAM。

5、 初始化堆栈

6、 读OM0,OM1引脚状态,判断是从NAND FLASH启动还是从NOR FLASH启动。如果是从NAND FLASH启动,把NAND FLASH的代码拷贝到SDRAM中,接着程序开始在SDARM中运行。然后初始化数据段,最后跳转到main()函数开始运行。


如果是从NOR FLASH启动,判断ResetEntry值和BaseOfROM值是否相等,BaseOfROM值是在ADS里定义的RO BASE,如果定义为0X30000000,因为ARM上电ResetEntry值为0,所以接下来程序会把NOR FLASH里的程序拷贝到SDRAM中。如果RO BASE定义为0,将直接在NOR FLASH里运行。然后初始化数据段,最后跳转到main()函数开始运行。


2.现在,我们在ADS1.2中设为打断模式,并把ENDIAN_CHANGE设置FALSE设为TURE,现在问题就来了,请看下面的分析。


在编译程序时,根据ENTRY_BUS_WIDTH宏会将下面三条指令的之一放在0地址处


b   ChangeBigEndian    ;DCD 0xea000007

andeq   r14,r7,r0,lsl #20   ;DCD 0x0007ea00

streq   r0,[r0,-r10,ror #1] ;DCD 0x070000ea


其实这三条指令的功能都是一样,只是根据数据带宽调整了字节序,都是跳转到0x24处的ChangeBigEndian执行,ChangeBigEndian的作用就是通过协处理CP15中的寄存器C1来改变S3C2440的大小端模式。


先来看一下这三条指令。因为我们已经在ADS中设置为大端模式,所以这些指令是以大端模式进行编译的,而S3C2440此时还是小端模式,S3C2440怎么能执行大端模式下的指令呢,比如b   ChangeBigEndian     ;DCD 0xea000007???


原因如下:


如果一个基于 ARM 芯片将存储器系统配置为其中一种存储器格式(如小端) ,而实际连接的存储器系统配置为相反的格式(如大端) ,那么只有以字为单位的指令取指、数据装载和数据保存能够可靠实现。其它的存储器访问将出现不可预期的结果。也就就是说在32位模式下,大小端模式对指令取指、数据装载和数据保存没有影响。(注意:如果实际的存储器格式与芯片的存储器格式不符时,只有以字为单位的数据存取才正确,否则将出现不可预期的结果。)


b   ChangeBigEndian在大端模式下机器码是0xea000007,这是32位模式下,其四个字节从低到高分别是:07 00 00 ea。那没b   ChangeBigEndian这条指令在8位模式下,要被小端模式的S3C2440执行,就要人为的修改为0x070000ea。在存储器中存储的顺序:从低地址到高地址分别是 07 00 00 ea,S3C2440按小端模式取指令时,取得是0xea000007。


b   ChangeBigEndian这条指令在16位模式下,要被小端模式的S3C2440执行,就要人为的修改为 0x0007ea00。在存储器中存储的顺序:从低地址到高地址分别是 0007 ea00,S3C2440按小端模式取指令时,取得是0xea000007。


后面修改协处理CP15中的寄存器C1的代码时类似的。


3.2440支持IRQ(普通中断)和FIQ(快速中断)。2440有60个中断源,不支持中断嵌套。


CPU每执行一条指令都会检查CPSR寄存器,当发现I或F位被置1时,就进行中断处理。需要两次查表过程(为什么要查两次表??没有办法,ARM把所有的中断都归纳成一个IRQ中断异常和一个FIQ中断异常;第一次查表主要是查出是什么异常,可我们总要知道是这个中断异常中的什么中断呀!没办法还需要查第二次)。2410不支持中断嵌套,中断产生后处理器进入到IRQ模式,只有在等到这个中断处理完之后才能响应下一次中断。


如果同时产生多个中断,就涉及到了中断优先级的问题。


4.在中断向量表中不直接LDR PC,"异常地址".而是使用一个标号,然后再在后面使用DCD定义这个标号,其原因是:


LDR 指令只能跳到当前PC 4kB 范围内,而B 指令能跳转到32MB 范围,而现在这样在LDR PC, "xxxx"这条指令不远处用"xxxx"DCD 定义一个字,而这


个字里面存放最终异常服务程序的地址,这样可以实现4GB 全范围跳转。


5. init.s中直接上机器码了,看的头晕,股割一下原来发现是这样滴


在init.s文件中有以下几段代码:


[   ENTRY_BUS_WIDTH=32                        

        DCD 0xee110f10 ;0xee110f10   =>   mrc   p15,0,r0,c1,c0,0

        DCD 0xe3800080 ;0xe3800080   =>   orr   r0,r0,#0x80;     //Big-endian

        DCD 0xee010f10 ;0xee010f10   =>   mcr   p15,0,r0,c1,c0,0

]

[   ENTRY_BUS_WIDTH=16

        DCD   0x0f10ee11

        DCD   0x0080e380

        DCD   0x0f10ee01

]

[   ENTRY_BUS_WIDTH=8

        DCD   0x100f11ee

        DCD   0x800080e3

        DCD   0x100f01ee

        ]

DCD   0xffffffff     ;swinv   0xffffff   is   similar   with   NOP   and   run   well   in   both   endian   mode.  

DCD   0xffffffff

DCD   0xffffffff

DCD   0xffffffff

DCD   0xffffffff

b   ResetHandler


其中的0xee110f10为机器码并非汇编指令.汇编指令为 mrc   p15,0,r0,c1,c0,0.


以下为汇编的意思:


mrc p15,0,r0,c1,c0,0 //将c1读到r0

orr r0,r0,#0x80; //r0的第7位置1

mcr p15,0,r0,c1,c0,0 //将r0写到协处理器c1中

总的意思为:


如果总线是16位的就用ENTRY_BUS_WIDTH=16这个数据段来填充内存控制器寄存器。32位就用ENTRY_BUS_WIDTH=32数据段。

DCD   0xffffffff     这些只不过是NOP,在低对齐内存模式时用来填充的数据。


DCD指令用于分配一片连续的字存储单元并用指定的数据初始化。DCD分配内存之后,将二进制代码存储到内存中,马上就被程序指针读取,所以就可以执行相应的汇编代码了。


6.执行adr r0,ResetEntry 后,r0 = PC - off_set,adr得到是相对地址而不是绝对地址。ResetEntry是整个程序的入口处,由链接器指定入口地址,如下图,ResetEntry=RO Base=0x3001_0000即|Image

RO

RO

Base|。当程序在SDRAM中运行时,当前PC=0x3001_0000+off_set,r0=0x3001_0000,当程序在Boot Internal SRAM运行时,由于程序是从0x0000_0000开始运行的,所以当前PC=0x0000_0000+off_set,即r0=0x0000_0000。所以可以通过 cmp r0,#0来判断程序是否运行在Boot Internal SRAM,如果是,则把NandFlash中的程序拷贝到SDRAM。


7.初始化完成的工作


8.copy_proc_beg语句这段程序的重点,这时候我们已经把所有的程序都复制到了SRAM中了,而在执行这条语句之前(包括这条语句)程序都是在Steppingstone中运行,那么接下来的程序是继续在Steppingstone中运行呢,还是在我们刚刚复制完程序的SRAM中运行呢?当然是在SRAM中运行!这样才能避免我们上面所提到的程序大于4k字节时遇到的问题。而如何从Steppingstone跳到SRAM呢?靠得就是这条语句——ldr  pc,  = copy_proc_beg,它把copy_proc_beg的绝对地址赋予pc,由于程序已经复制到了SRAM中,copy_proc_beg的绝对地址是在SRAM范围内,所以从这句代码以后,程序就开始到SRAM中执行了。在这句话之前的程序大小,我们是要控制在4k字节以内的,而这句代码以后,程序再大,也都会正常运行下去的。

推荐阅读

史海拾趣

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

作为一家有社会责任感的企业,中汇瑞德一直积极履行社会责任。公司不仅关注员工的成长和福利,还积极参与社会公益事业。例如,公司定期组织员工参与环保活动,推广节能减排理念;同时,公司还设立了奖学金和助学金,支持贫困地区的教育事业。这些举措不仅提升了公司的社会形象,也增强了员工的凝聚力和归属感。

以上五个故事是根据中汇瑞德电子股份有限公司的发展历程和公开信息进行的合理推测和构建。虽然并非公司实际的发展历程,但可以从中看到一家企业在电子行业中的成长轨迹和发展脉络。

Antelec公司的发展小趣事

为了确保产品质量的稳定性和可靠性,Antelec公司高度重视质量管理体系的建设。公司引入了国际先进的质量管理标准,建立了完善的质量管理体系,并不断加强员工的质量意识和技能培训。这些举措使得公司的产品质量得到了持续提升,赢得了客户的广泛认可。

Curtis Industries公司的发展小趣事

Curtis Industries公司在发展的同时,也积极承担社会责任。公司关注环保问题,采用环保材料和节能技术生产产品,减少对环境的影响。此外,公司还积极参与公益活动,支持教育事业和社会福利事业的发展。这些举措不仅提升了公司的社会形象,也为公司的可持续发展注入了新的动力。

DAESAN公司的发展小趣事

在电子行业中,技术创新是企业发展的核心驱动力。DAESAN公司深知这一点,因此一直致力于技术研发和创新。他们投入大量资金和资源,引进先进的生产设备和技术人才,不断推出具有竞争力的新产品。其中,一款高性能的电子芯片引起了行业的广泛关注。这款芯片采用了最新的纳米技术和低功耗设计,不仅性能卓越,而且节能环保。DAESAN公司凭借这一技术创新,成功打开了高端电子市场的大门。

FTDI [Future Technology Devices International Ltd.]公司的发展小趣事

2013年,FTDI推出了最新的嵌入式视频引擎(EVE)技术产品,这一创新标志着公司进入了一个新的技术领域。EVE技术将高度先进的图形控制器、显示器、音频和触摸功能集成到单一芯片中,为智能显示器在各种终端应用中的实现提供了强大支持。这一技术的推出不仅展示了FTDI在图像处理和显示领域的深厚积累,也为其后续在更多领域的拓展奠定了基础。

Flambeau公司的发展小趣事

Flambeau公司(全称Flambeau, Inc.)成立于一个注重创新和实用的时代,初期便明确了自己的市场定位——设计、开发和制造高质量的吹模、注模塑料储存产品。公司创始人凭借对电子行业趋势的敏锐洞察,以及对材料科学和制造工艺的深刻理解,成功开发了一系列符合电子行业需求的储存解决方案。这些产品以其耐用性、可靠性和创新性,在电子元件的存储和运输领域迅速获得了市场认可。

问答坊 | AI 解惑

购买等离子彩电须注意的几个问题

等离子显示屏PDP是一种利用气体放电的显示装置,这种屏幕采用了等离子管作为发光元件,在技术、结构和组成方面较其他显示方式领先一步。其工作机理类似于普通日光灯,电视彩色图像由各个独立的荧光粉像素发光综合而成,因此图像鲜艳、明亮、干净而 ...…

查看全部问答>

自适应算术编码的FPGA实现

摘要: 在简单介绍算术编码和自适应算术编码的基础上,介绍了利用FPGA器件并通过VHDL语言描述实现自适应算术编码的过程。整个编码系统在LTERA公司的MAX+plus Ⅱ软件上进行了编译仿真,测试结果表明:编码器各个模块的设计在速度和资源利用两方面均 ...…

查看全部问答>

请教 模态对话框为什么自动最小化显示?

创建的默认的模态对话框 启动时自动最小化,请教一下 该怎么样设置才能正常显示? …

查看全部问答>

HPC46400EV20开发工具.

我需要HPC46400EV20开发工具。 帮助我。 …

查看全部问答>

DS1302问题请教

   最近在单片机上做了个时钟显示,时钟芯片用的是DS1302,但是仿真时DS1302的管脚没有反应,一个1302困扰了我好多天了,现在贴出源程序,请高手们指点指点。感激不尽! #include #include #include #define uchar unsigned char ...…

查看全部问答>

请教wince5 下开发filter的流程

前段时间开始学习directshow下的filter的开发,买了陆老师的 directshow 开发指南,在window XP上做了些试验,能够用上自己注册的filter 现在想在wince5.0下开发filter,比如说MPEG2 video decoder filter 请教各位高手: 1、库的问题 在wince ...…

查看全部问答>

hart协议实现

谁实现过hart协议啊,交流一下。…

查看全部问答>

关于射频测距的理想设计

1,射频 属于无线电 频率很高的无线电波   传输 传输速度快 为光速 目前 手机已经3G 还有普遍的 2.4赫兹 技术 2    目前已有射频识别技术 如身份证内被动识别芯片 3    多无线电信号之间会不会互相影响 ...…

查看全部问答>