ImageVerifierCode 换一换
你正在下载:

RO段精.docx

[预览]
格式:DOCX , 页数:17 ,大小:50KB ,
资源ID:6479287      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6479287.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(RO段精.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

RO段精.docx

1、RO段精RO段、RW段和ZI段一般而言,一个程序包括只读的代码段和可读写的数据段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。这就涉及到程序的加载时域和运行时域。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态。对于比较简单的情况,可以在ADS集成开发环境的ARMLI

2、NKER选项中指定ROBASE和RWBASE,告知连接器RO和RW的连接基地址。对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为“分布装载描述文件”的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分布装载描述文件中的定义要按照系统重定向后的存储器分布情况进行。在引导程序完成初始化的任务后,应该把主程序转移到RAM中去运行,以加快系统的运行速度。关于44b0的RO,RW,ZI程序固化在FLASH中,有程序和字符串什么的东西,把程序部分当作ro,字串什么的是zw,而RO,ZW,ZI是编译器知道的东西,如果RO定位于FLASH地址空间的

3、话,那么程序只能在FLASH空间运行。初始化程序只需把rw(ROLimit为起始地址)拷贝到SDRAM中指定的RW处,然后把ZI区域初始化为0;如果RO定位于SDRAM空间的话,说明连接器生成代码位置无关,或者有些代码必须运行在SDRAM空间。这样的话久需要初始化的时候把FLASH里面的程序拷贝到SDRAM的RO区域,拷贝完成的时候指向ROM的指针就应该到了zwbase了。不知道这样理解对吗?有没有哪位大哥有详细的资料介绍一下,最好有图示或则视频演示,下面是我的程序,研究了一下好像不支持code从FLASH拷贝到SDRAM,LDRr0, =|Image$RO$Limit|; Get point

4、er to ROM dataLDRr1, =|Image$RW$Base|; and RAM copyLDRr3, =|Image$ZI$Base|;Zero init base = top of initialised dataCMPr0, r1; Check that they are differentBEQ%F10CMPr1, r3; Copy init dataLDRCCr2, r0, #4;- LDRCC r2, r0 + ADD r0, r0, #4STRCCr2, r1, #4;- STRCC r2, r1 + ADD r1, r1, #4BCC%B01LDRr1, =|Ima

5、ge$ZI$Limit| ; Top of zero init segmentMOVr2, #02CMPr3, r1; Zero initSTRCCr2, r3, #4BCC%B2有没有哪位大哥有可以拷贝的也一起传一个来吧。关于RO、RW、ZI的说明本人的正在写的总结中的一段,希望对你有帮助汇编:AREA sectionname,CODE,READONLYCodeAREA sectionname,DATA,READWRITERW 数据区AREA sectionname,DATA,READONLYRO 数据区C:const常量带初值RO 数据区全局变量带初值ZW 数据区局部变量带初值RO 数据区

6、仅定义全局变量ZI 数据区Release版本中,S3C44B0X一般RO区从0x0000 0000开始,RW区从0x0c00 0000开始,ZI区紧跟在RW区后。有时没有RW区,ZI区就从0x0c00 0000开始。这是简单的linktype。2.|Image$?$?|符号的作用S3C44B0X启动文件中有如下一段导入了这几个由 ARM连接器产生的奇怪符号:IMPORT|Image$RO$Limit|RO 代码区末IMPORT|Image$RW$Base|RW 数据区头IMPORT|Image$ZI$Base|ZI 数据区头IMPORT|Image$ZI$Limit|ZI 数据区末举例,某程序

7、编译后Code区占2724(0x0aa4)字节,RW区40(0x28)字节,RO区9608字节,下面是将启动代码载入到FLASH中的结果(经处理后):LDRr0, =|Image$RO$Limit|r0=#0x00000aa4LDRr1, =|Image$RW$Base|r1=#0x0c000000LDRr3, =|Image$ZI$Base|r3=#0x0c000028CMPr0, r1BEQ0x44c0x43c:CMPr1, r3搬FLASH中RW数据到RAM中LDRCCr2, r0, #4STRCCr2, r1, #4BCC0x43c0x44c:LDRr1, =|Image$ZI$Lim

8、it|r1=#0x0c0025b0MOVr2, #00x454:CMPr3, r1ZI 数据区清零STRCCr2, r3, #4BCC0x454有所启发经过一段时间的思考,已经初步了解了bootloader的机制:RO如果是在SDRAM的话,(最好在RAMSTART那里方便计算)。这样的话,所有的程序就最好在SDRAM空间运行了因为所有的标号绝对定位的话,就在0x0c000000之后了。下面说一下思路:bResetHandler ;因为是相对地址,所以也能跳到FLASH中的那个标号。ResetHandler防止有对PC绝对的赋值,最好一开始就开始拷贝拷贝完毕之后,FLASH ,和SDRAM里面

9、的程序都有程序了,也不用再在FLASH里面混了,进行对pc绝对赋值:copyendldr pc,entersdram;(entersdram是绝对地址,这样赋值之后PC就指向SDRAM空间了。上下衔接是比较连贯的。移花接木,呵呵。PC变了,但是对于CPU来说任务还是连贯的)entersdram然后进行其它的初始化、bl main 什么的可以继续了。一般而言,一个程序包括只读的代码段和可读写的数据段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit

10、)。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。这就涉及到程序的加载时域和运行时域。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态。对于比较简单的情况,可以在ADS集成开发环境的ARM LINKER选项中指定RO BASE和RW BASE,告知连接器RO和RW的连接基地址。对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为“分布装载描述文件”的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分布装载描述文

11、件中的定义要按照系统重定向后的存储器分布情况进行。在引导程序完成初始化的任务后,应该把主程序转移到RAM中去运行,以加快系统的运行速度。 什么是arm的映像文件,arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到rom里执行。在axd调试过程中,我们调试的是axf文件,其实这也是一种映像文件,它只是在bin文件中加了一个文件头和一些调试信息。映像文件一般由域组成,域最多由三个输出段组成(RO,RW,ZI)组成,输出段又由输入段组成。所谓域,指的就是整个bin映像文件所处在的区域,它又分为加载域和运行域。加载域就是映像文件被静态存放的工作区域,一般来说flash里的整个b

12、in文件所在的地址空间就是加载域,当然在程序一般都不会放在 flash里执行,一般都会搬到SDRAM里运行工作,它们在被搬到SDRAM里工作所处的地址空间就是运行域。我们输入的代码,一般有代码部分和数据部分,这就是所谓的输入段,经过编译后就变成了bin文件中ro段和rw段,还有所谓的zi段,这就是输出段。对于加载域中的输出段,一般来说ro段后面紧跟着rw段,rw段后面紧跟着zi段。在运行域中这些输出段并不连续,但rw和zi一定是连着的。zi段和rw段中的数据其实可以是rw属性。 | Image$RO$Base| |Image$RO$Limit| |Image$RW$Base| |Image$Z

13、I$Base| |Image$ZI$Limit|这几个变量是编译器通知的,我们在 makefile文件中可以看到它们的值。它们指示了在运行域中各个输出段所处的地址空间| Image$RO$Base| 就是ro段在运行域中的起始地址,|Image$RO$Limit| 是ro段在运行域中的截止地址。其它依次类推。我们可以在linker的output中指定,在 simple模式中,ro base对应的就是| Image$RO$Base|,rw base 对应的是|Image$RW$Base|,由于rw和zi相连,|Image$ZI$Base| 就等于|Image$ZI$limit| .其它的值都是编

14、译器自动计算出来的。 下面是2410启动代码的搬运部分,我给出注释 BaseOfROM DCD |Image$RO$Base| TopOfROM DCD |Image$RO$Limit| BaseOfBSS DCD |Image$RW$Base| BaseOfZero DCD |Image$ZI$Base| EndOfBSS DCD |Image$ZI$Limit| adr r0, ResetEntry; ResetEntry是复位运行时域的起始地址,在boot nand中一般是0 ldr r2, BaseOfROM; cmp r0, r2 ldreq r0, TopOfROM;TopOfRO

15、M=0x30001de0,代码段地址的结束 beq InitRam ldr r3, TopOfROM ;part 1,通过比较,将ro搬到sdram里,搬到的目的地址从 | Image$RO$Base| 开始,到|Image$RO$Limit|结束 0 ldmia r0!, r4-r7 stmia r2!, r4-r7 cmp r2, r3 bcc %B0; ;part 2,搬rw段到sdram,目的地址从|Image$RW$Base| 开始,到|Image$ZI$Base|结束 sub r2, r2, r3;r2=0 sub r0, r0, r2 InitRam ;carry rw to b

16、aseofBSS ldr r2, BaseOfBSS ;TopOfROM=0x30001de0,baseofrw ldr r3, BaseOfZero ;BaseOfZero=0x30001de0 0 cmp r2, r3 ldrcc r1, r0, #4 strcc r1, r2, #4 bcc %B0 ;part 3,将sdram zi初始化为0,地址从|Image$ZI$Base|到|Image$ZI$Limit| mov r0, #0;init 0 ldr r3, EndOfBSS;EndOfBSS=30001e40 1 cmp r2, r3 strcc r0, r2, #4 bcc

17、%B1理解启动代码(ADS) 所谓启动代码,就是处理器在启动的时候执行的一段代码,主要任务是初始化处理器模式,设置堆栈,初始化变量等等.由于以上的操作均与处理器体系结构和系统配置密切相关,所以一般由汇编来编写. 具体到S64,启动代码分成两部分,一是与ARM7TDMI内核相关的部分,包括处理器各异常向量的配置,各处理器模式的堆栈设置,如有必要,复制向量到RAM,以便remap之后处理器正确处理异常,初始化数据(包括RW与ZI),最后跳转到Main.二是与处理器外部设备相关的部分,这和厂商的联系比较大.虽然都采用了ARM7TDMI的内核,但是不同的厂家整合了不同的片上外设,需要不同的初始化,其中

18、比较重要的是初始化WDT,初始化各子系统时钟,有必要的话,进行remap.这一部分与一般控制器的初始化类似,因此,本文不作重点描述. 在进行分析之前,请确认如下相关概念: S64片上FLASH起始于0x100000,共64kB,片上RAM起始于0x200000,共16kB. S64复位之后,程序会从0开始执行,此时FLASH被映射到0地址,因此,S64可以取得指令并执行.显然,此时还是驻留在0x100000地址.如果使用remap命令,将会把RAM映射到0地址,同样的这时0地址的内容也只是RAM的镜像. S64的FLASH可以保证在最差情况时以30MHz进行单周期访问,而RAM可以保证在最大速

19、度时的单周期访问. OK,以下开始分析启动代码. 一,处理器异常 S64将异常向量至于0地址开始的几个直接,这些是必需要处理的.由于复位向量位于0,也需要一条跳转指令.具体代码如下: RESET B SYSINIT ; Reset B UDFHANDLER ; UNDEFINED B SWIHANDLER ; SWI B PABTHANDLER ; PREFETCH ABORT B DABTHANDLER ; DATA ABORT B . ; RESERVED B VECTORED_IRQ_HANDLER B . ; ADD FIQ CODE HERE UDFHANDLER B . SWIHA

20、NDLER B . PABTHANDLER B . DABTHANDLER B . 请注意,B指令经汇编后会替换为当前PC值加上一个修正值(+/-),所以这条指令是代码位置无关的,也就是不管这条指令是在0地址还是在0x100000执行,都能跳转到指定的位置,而LDR PC,=?将向PC直接装载一个标号的值,请注意,标号在编译过后将被替换为一个与RO相对应的值,也就是说,这样的指令无论在哪里执行,都只会跳转到一个指定的位置.下面举一个具体的例子来说明两者的区别: 假定有如下程序: RESET B INIT 或者 LDR PC,=INIT INIT 其中RESET为起始时的代码,也就是这条代码的偏

21、移为0,设INIT的偏移量为offset.如果将这段程序按照RO=0x1000000编译, 那么B INIT可理解为ADD PC, PC, #offset,而LDR PC,=INIT可被理解为 MOV PC,#(RO+offset) .显然当系统复位时,程序从0开始运行,而0地址有FLASH的副本,执行B INIT将把PC指向位于0地址处的镜像代码位置,也即INIT;如果执行LDR PC,=INIT将会将PC直接指向位于FLASH中的原始代码.因此以上两者都能正确运行.下面将RO设置为0x200000,编译后生成代码,还是得烧写到FLASH中,也就是还是0x100000,系统复位后从0地址执行

22、,还是FLASH的副本,此时执行B INIT,将跳到副本中的INIT位置执行,此处有对应的代码;但是如果执行LDR PC,=INIT,将向PC加载0x200000+offset,这将使得PC跳到RAM中,而此时由于代码没有复制,RAM中的指定位置并没有代码,程序无法运行. 二,处理器模式 ARM的处理器可工作于多种模式,不同模式有不同的堆栈 ,以下设置各模式及其堆栈. 预定义一些参数: MODUSR EQU 0x10 MODSYS EQU 0x1F MODSVC EQU 0x13 MODABT EQU 0x17 MODUDF EQU 0x1B MODIRQ EQU 0x12 MODFIQ EQ

23、U 0x11 IRQBIT EQU 0x80 FIQBIT EQU 0x40 RAMEND EQU 0x00204000 ; S64 : 16KB RAM VECTSIZE EQU 0x100 ; UsrStkSz EQU 8 ; size of USR stack SysStkSz EQU 128 ; size of SYS stack SvcStkSz EQU 8 ; size of SVC stack UdfStkSz EQU 8 ; size of UDF stack AbtStkSz EQU 8 ; size of ABT stack IrqStkSz EQU 128 ; size

24、of IRQ stack FiqStkSz EQU 16 ; size of FIQ stack 修改这些值即可修改相应模式堆栈的尺寸. 以下为各模式代码: SYSINIT ; MRS R0,CPSR BIC R0,R0,#0x1F MOV R2,#RAMEND ORR R1,R0,#(MODSVC :OR: IRQBIT :OR: FIQBIT) MSR cpsr_cxsf,R1 ; ENTER SVC MODE MOV sp,R2 SUB R2,R2,#SvcStkSz ORR R1,R0,#(MODFIQ :OR: IRQBIT :OR: FIQBIT) MSR CPSR_cxsf,R1

25、 ; ENTER FIQ MODE MOV sp,R2 SUB R2,R2,#FiqStkSz ORR R1,R0,#(MODIRQ :OR: IRQBIT :OR: FIQBIT) MSR CPSR_cxsf,R1 ; ENTER IRQ MODE MOV sp,R2 SUB R2,R2,#IrqStkSz ORR R1,R0,#(MODUDF :OR: IRQBIT :OR: FIQBIT) MSR CPSR_cxsf,R1 ; ENTER UDF MODE MOV sp,R2 SUB R2,R2,#UdfStkSz ORR R1,R0,#(MODABT :OR: IRQBIT :OR:

26、FIQBIT) MSR CPSR_cxsf,R1 ; ENTER ABT MODE MOV sp,R2 SUB R2,R2,#AbtStkSz ;ORR R1,R0,#(MODUSR :OR: IRQBIT :OR: FIQBIT) ;MSR CPSR_cxsf,R1 ; ENTER USR MODE ;MOV sp,R2 ;SUB R2,R2,#UsrStkSz ORR R1,R0,#(MODSYS :OR: IRQBIT :OR: FIQBIT) MSR CPSR_cxsf,R1 ; ENTER SYS MODE MOV sp,R2 ; 三,初始化变量 编译完成之后,连接器会生成三个基本的

27、段,分别是RO,RW,ZI,并会在image中顺序摆放.显然,RW,ZI在运行开始时并不位于指定的RW位置,因此必须初始化 LDR R0,=|Image$RO$Limit| LDR R1,=|Image$RW$Base| LDR R2,=|Image$ZI$Base| 1 CMP R1,R2 LDRLO R3,R0,#4 STRLO R3,R1,#4 BLO %B1 MOV R3,#0 LDR R1,=|Image$ZI$Limit| 2 CMP R2,R1 STRLO R3,R2,#4 BLO %B2 四,复制异常向量 由于代码于RAM运行时,有明显的速度优势,而且变量可以动态配置,因此可以

28、通过remap将RAM映射到0,使得出现异常时ARM从RAM中取得向量. IMPORT |Image$RO$Base| IMPORT |Image$RO$Limit| IMPORT |Image$RW$Base| IMPORT |Image$RW$Limit| IMPORT |Image$ZI$Base| IMPORT |Image$ZI$Limit| COPY_VECT_TO_RAM LDR R0,=|Image$RO$Base| LDR R1,=SYSINIT LDR R2,=0x200000 ; RAM START 0 CMP R0,R1 LDRLO R3,R0,#4 STRLO R3,R2,#4

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1