版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ARM处理器系统初始化过程 1 禁止MMUU,关闭中断断,禁止caache;2 根据硬件设设计配制好处处理器时钟、DDRAM时钟钟、定时器时时钟;3 根据系统中中所用的fllash和DDRAM芯片片容量和电气气参数设置它它们的起始地地址、容量、刷刷新频率等;4 将固化在fflash芯芯片中的程序序搬移到DRRAM内存中中;5 使能cacche,使能能MMU,跳跳转到DRAAM内存中运运行继续初始始化,包括根根据具体应用用以及系统中中的硬件配置置初始化各个个功能模块、安安装好异 常中断处理理程序、使能能中断等;6 进行操作系系统相关初始始化;禁止MMU,关关闭中断,禁禁止cachhe通过写系统控
2、制制协处理器的的寄存器1 的第0 位位可以允许和和禁止MMUU。在复位后后这位是0,MMMU 被禁禁止。关闭中断与打开开中断中断是一种高效效的对话机制制,但有时并并不想程序运运行的过程中中中断运行,比比如正在打印印东西,但程序突然中中断了,又让让另外一个程程序输出打印印内容,这样样在打印机上上就会乱得不不得了,同时有两份以上上的文件交错错地打印在一一张纸上。像像不可剥夺的的资源,就一一定要关闭中中断,让它占有这个资源源。在ARMM里,没有像像x86那样样有清除中断断指令CLII。那么在AARM里是怎怎么样实现关中断和开中断断的呢?下面面就来看看AARM的关中中断和开中断断实现。vooid Lo
3、ock(vooid)stmddbsp!, r00mrssr0, cpsrorr rr0,r0,#0 xC00msr cpsr_cxsf,r0lddmia ssp!,rr0上面这段程序序是通过设置置CPSR的的第6,7位位来实现的,因因为第6,77位是设置为为1时,就不不再响应中断。void UnnLock(void)stmddbsp!, r00mrssr0, cpsrbic rr0,r0,#0 xC00msr cpsr_cxsf,r0lddmia ssp!,rr0上面是重新新开中断的命命令,同样是是设置CPSSR的第6,77位,但它的的值是0,就就可接收中断断了。如果在多个任务务之间进行共共享
4、数据,一一般是需要使使用关中断和和开中断实现现数据同步的的,其实中这种关中断和和开中断,就就是进入临界界区和退出临临界区。如果果是像PC机机那样有多个个CPU的话话,关中断并并不能防止这这种情况。系统的在应用编编程(IAPP)以及在系系统编程功能能(ISP)等等。中断向量表ARRM要求中断断向量表必须须放置在从00地址开始,连连续8X4字字节的空间内内。每当一个个中断发生以以后,ARMM处理器便强强制把PC指指针置为向量量表中对应中中断类型的地地址值。因为为每个中断只只占据向量表表中1个字的的存储空间,只只能放置一条条ARM指令令,使程序跳跳转到存储器器的其他地方方,再执行中中断处理。中中断向
5、量表的的程序实现通通常如下表示示:AREAA Boott ,CODDE, REEADONLLYENTRRYB ReesetHaandlerrB UnddefHanndlerBB SWIHHandleerB PrreAborrtHanddlerB DataAAbortHHandleerBB IRQQHandllerB FFIQHanndler其其中关键字EENTRY是是指定编译器器保留这段代代码,因为编编译器可能会会认为这是一一段亢余代码码而加以优化化。链接的时时候要确保这这段代码被链链接在0地址址处,并且作作为整个程序序的入口。Q:为什么在在中断向量表表中不直接LLDR PCC,异常地地址.而
6、是是使用一个标标号,然有再再在后面使用用DCD定义义这个标号AA:因为LDDR指令只能能跳到当前PPC 4kBB范围内,而而B指令能跳跳转到32MMB范围,而而现在这样在在LDR PPC, xxxxx这这条指令不远远处用xxxxxDCCD定义一个个字,而这个个字里面存放放最终异常服服务程序的地地址,这样可可以实现4GGB全范围跳跳转.Q: LDR 不不是可以全空空间跳转的吗吗 ARMM微控制器基基础与实战程程序清单5.3.A: LDR伪指指令通过设置置指令缓冲池池才能实现全全范围跳转,而LDR指指令则只能实实现4KB范范围跳转.MEMMAP=0:开机默默认值,Booot装载模模式向量表(00
7、x000000000-0 x00000003cc)映射的是是BootBBlock中中的0 x7FFFFE0000-0 x77FFFF003c中的值值;芯片复位位时,启动bboot装载载程序,booot装载程程序检查P00.14口的的状态和用户户的异常向量量,判断是进进入ISP状状态还是启动动用户程序,若若启动用户程程序,则自动动设置MEMMMAP=11(片内fllash启动动)或3(片片外程序存储储器启动)。很奇怪的,我在在实验中,当当使用无片内内flashh的LPC22210时即即使设置P00.14为高高低都没关系系,芯片会跳跳过继而执行行片外flaash中的代代码. MEMMMAP=11:
8、中断向量量表就在片内内flashh中,地址就就是0 x0000000000-0 x000000003c,相当当于没有映射射;MEMMMAP=22:最为主要要的设置,即即是重映射的的关键之所在在,当设置MMEMMAPP=2 时,中断断向量表(00 x000000000-0 x00000003cc)映射的是是片内SRAAM中的0 xx400000000-00 x40000003c中中的值,而因因为是SRAAM,所以在在程序运行的的过程中是可可以改变的,这这样就可以达达到重映射的的目的啦(中中断向量表可可以随时修改改)。 MEMMMAP=33:中断向量量表就在片外外flashh中,中断向向量表(0
9、xx000000000-00 x00000003c)映射到是片片外flassh中的0 xx800000000-00 x80000003c中中的值;功能能上与MEMMMAP=11时的差不多多,因为一旦旦程序固化到到flashh中,即为只只读,只是数数值映射而已已!设置MEMMAAP; Memorry Mappping (whenn Inteerruptt Vecttors aare inn RAM)MEMMAAP EQU 0 xEE01FC0040 ; Memmory MMappinng Conntrol IF :DEF:REMAPP LDR R0, =MEMMMAP IF :DEF:EXTME
10、EM_MODDE MOV R1, #3 ELIFF :DEFF:RAM_MODE MOV R1, #2 ELSEE MOV R1, #1 ENDIIF STR R1, R0 ENDIIFMEMMMAP有两个个控制位 MMEMMAPP1:000 BOOTT装载程序模模式01 Userr FLASSH模式100 用户RAAM模式111 用户外部部存储器模式式10模式也也就是RAMM模式 我们们访问地址00X00是跟跟访问RAMM地址0X4400000000中的数数据是完全一一样的 向RRAM中写进进数据 然后后通过数据窗窗口观察0XX0地址的变变化 应该是是同步变化的的存储器类型和时时序配置 主要
11、是对对系统存储器器控制器(MMMU)的初初始化。由于于存储器控制制器并不是AARM架构的的一部分,不不同芯片的实实现方式各不不相同。由于于运算能力和和寻址能力的的强大,基于于ARM内核核的微处理器器系统一般都都需要外扩展展各种类型的的存储器。对对于存储器系系统的初始化化一般包括如如下几个方面面:存储器类型型、时序和总总线宽度的配配置存储器地址址的配置(1)存储器类类型 基于ARRM微处理系系统的存储器器一般有如下下几类:SAARM,DRRAM,Fllah,同时时,即使同类类存储器也有有访问速度上上的不同。其其中,SRAAM和Flaah属于静态态存储器,可可以共用存储储器端口,而而DRAM有有动
12、态刷新和和地址复用等等特征,需要要专门的存储储器端口。(2)时序 存储器端端口的接口时时序优化对系系统性能影响响非常大,因因为系统运行行的速度瓶颈颈一般都存在在于存储器的的访问,因此此希望存储器器的访问尽可可能快,但又又要考虑由此此带来的系统统稳定性问题题。(3)总线宽度度 ARM微微处理器架构构支持8/116/32位位的数据总线线宽度访问存存储器和外设设,对于特定定的存储器来来说,需要设设定数据总线线的宽度。(4)存储器地地址的配置 ARM微微处理器架构构理论上可以以支持4GBB的地址空间间,而对于一一个实际的系系统来说,配配置的物理地地址远没有这这么多,因此此,如何配置置存储器的地地址,也
13、是一一个重要的问问题。(5)存储器地地址重映射 存储器地地址重映射就就是可以通过过软件配置来来改变一块存存储器物理地地址的方法,是是当前许多先先进控制器所所具有的功能能。进行地址重映射射的原因:提提高系统的运运行效率。进行地址重映射射的注意:保保证程序流程程的连续性。有的ARM处理理器不具有地地址重映射的的功能,可以以采样代码搬搬移加跳转的的方式完成上上述功能。初初始化堆栈因因 为ARMM有7种执行行状态,每一一种状态的堆堆栈指针寄存存器(SP)都都是独立的。因因此,对程序序中需要用到到的每一种模模式都要给SSP定义一个个堆栈地址。方方法是改变状状 态寄存器器内的状态位位,使处理器器切换到不同
14、同的状态,让让后给SP赋赋值。注意:不要切换到到User模模式进行Usser模式的的堆栈设置,因因为进入Usser模式后后就不 能再再操作CPSSR回到别的的模式了,可可能会对接下下去的程序执执行造成影响响。这是一段段堆栈初始化化的代码示例例,其中只定定义了三种模模式的SP指指针:MRSS R0,CCPSRBIIC R0,R0,#MMODEMAASK 安全全起见,屏蔽蔽模式位以外外的其他位OORR R11,R0,#IRQMOODEMSRR CPSRR_cxfss,R1LDDR SP,=UndeefStacckORR R1,R00,#FIQQMODEMMSR CPPSR_cxxsf,R11LDR
15、 SSP,=FIIQStacckORR R1,R00,#SVCCMODEMSR CCPSR_ccxsf,RR1LDR SP,=SSVCStaack初始化化应用程序执执行环境如果果使用分散加加载描述文件件调整堆栈和和堆放置,则则链接器创建建 _usser_innitiall_stacckheapp() 函数数,并使用链链接器定义的的符号作为这这些区域的名名称。映像一开始总是是存储在ROOMFlaash里面的的,其RO部部分即可以在在ROMFFlash里里面执行,也也可以转移到到速度更快的的RAM中执执行;而RWW和 ZI这这两部分是必必须转移到可可写的RAMM里去。所谓谓应用程序执执行环境的初初
16、始化,就是是完成必要的的从ROM到到RAM的数数据传输和内内容清零。下下面是在ADDS下,一种种常用存储器器模型的直接接实现:LDDR r0,=|Imaage$RRO$Liimit| 得到RW数数据源的起始始地址LDRR r1,=|Imagge$RWW$Basse| RWW区在RAMM里的执行区区起始地址LLDR r22,=|Immage$ZI$BBase| ZI区在RRAM里面的的起始地址CCMP r00,r1 比比较它们是否否相等BEQQ %F100 CMP r1,r33LDRCCC r2,r0,#4STRCCC r2,r1,#4BCCC %B011 LDR r1,=|Imagee$ZI$
17、Limiit|MOVV r2,#02 CMMP r3,r1STRRCC r22,r3,#4BCCC %B22程序实现了了RW数据的的拷贝和ZII区域的清零零功能。其中中引用到的44个符号是由由链接器第一一输出的。|Imagee$RO$Limiit|:表示示RO区末地地址后面的地地址,即RWW数据源的起起始地址|IImage$RW$Base|:RW区在在RAM里的的执行区起始始地址,也就就是编译器选选项RW_BBase指定定的地址|IImage$ZI$Base|:ZI区在在RAM里面面的起始地址址|Imagge$ZII$Limmit|:ZZI区在RAAM里面的结结束地址后面面的一个地址址程 序先
18、把把ROM里|Imagee$RO$Limtt|开始的RRW初始数据据拷贝到RAAM里面|IImage$RW$Base|开始的地址址,当RAMM这边的目 标地址到达达|Imagge$ZII$Basse|后就表表示RW区的的结束和ZII区的开始,接接下去就对这这片ZI区进进行清零操作作,直到遇到到结束地 址址|Imagge$ZII$Limmit|改变变处理器模式式因为在初始始化过程中,许许多操作需要要在特权模式式下才能进行行(比如对CCPSR的修修改),所以以要特别注意意不能过早的的进入用户模模式。内核级级的中断使能能也可以考虑虑在这一步进进行。如果系系统中另外存存在一个专门门的中断控制制器,这么
19、做做总是安全的的。呼叫主应应用程序当所所有的系统初初始化工作完完成之后,就就需要把程序序流程转入主主应用程序。最最简单的一种种情况是:IIMPORTT mainnB maiin直接从启启动代码跳转转到应用程序序的主函数入入口,当然主主函数名字可可以由用户随随便定义。在在ARM AADS环境中中,还另外提提供了一套系系统级的呼叫叫机制。IMMPORT _maiinB _main_mainn()是编译译系统提供的的一个函数,负负责完成库函函数的初始化化和初始化应应用程序执行行环境,最后后自动跳转到到main()函数。ARM 介绍ARM微处理器器的工作状态态一般有两种种,并可在两两种状态之间间切换:
20、 第第一种为ARRM状态,此此时处理器执执行32位的的字对齐的AARM指令; 第二种为为Thumbb状态,此时时处理器执行行16位的、半半字对齐的TThumb指指令。 在程程序的执行过过程中,微处处理器可以随随时在两种工工作状态之间间切换,并且且,处理器工工作状态的转转变并不影响响处理器的工工作模式和相相应寄存器中中的内容。但但ARM微处处理器在开始始执行代码时时,应该处于于ARM状态态。 ARMM处理器状态态 进 入TThumb状状态:当操作作数寄存器的的状态位(位位0)为1时时,可以采用用执行BX指指令的方法,使使微处理器从从ARM状态态切换到Thhumb状态态。此外,当当处理器处 于Th
21、ummb状态时发发生异常(如如IRQ、FFIQ、Unndef、AAbort、SSWI等),则则异常处理返返回时,自动动切换到Thhumb状态态。 进入AARM状态:当操作数寄寄存器的状态态位为0时,执执行BX指令令时可以使微微处理器从TThumb状状态切换到AARM状态。此此外,在处理理器进行异常常处理时,把把PC指针放放入异常模式式链接寄存器器中,并从异异常向量地址址开始执行程程序,也可以以使处理器切切换到ARMM状态。ARM处理器模模式 ARMM微处理器支支持7种运行行模式,分别别为: 用户户模式(ussr):ARRM处理器正正常的程序执执行状态。 快速中断模模式(fiqq):用于高高速数
22、据传输输或通道处理理。 外部中中断模式(iirq):用用于通用的中中断处理。 管理模式(svc):操作系统使使用的保护模模式。 数据据访问终止模模式(abtt):当数据据或指令预取取终止时进入入该模式,可可用于虚拟存存储及存储保保护。 系统统模式(syys):运行行具有特权的的操作系统任任务。 定义义指令中止模模式(undd):当未定定义的指令执执行时进入该该模式,可用用于支持硬件件协处理器的的软件仿真。 ARM处理理器模式 AARM微处理理器的运行模模式可以通过过软件改变,也也可以通过外外部中断或异异常处理改变变。大多数的的应用程序运运行在用户模模式下,当处处理器运行在在用户模式下下时,某些
23、被被保护的系统统资源是不能能被访问的。 除用户模式式以外,其余余的所有6种种模式称之为为非用户模式式,或特权模模式;其中除除去用户模式式和系统模式式以外的5种种又称为异常常模式,常用用于处理中断断或异常,以以及需要访问问受保护的系系统资源等情情况。 ARRM寄存器 ARM处理理器共有377个寄存器。其其中包括:331个通用寄寄存器,包括括程序计数器器(PC)在在内。这些寄寄存器都是332位寄存器器。以及6个个32位状态态寄存器。 关于寄存器器这里就不详详细介绍了,有有兴趣的人可可以上网找找找,很多这方方面的资料。 异常处理 当 正常的的程序执行流流程发生暂时时的停止时,称称之为异常,例例如处理
24、一个个外部的中断断请求。在处处理异常之前前,当前处理理器的状态必必须保留,这这样当异常处处理完成之后后,当 前程程序可以继续续执行。处理理器允许多个个异常同时发发生,它们将将会按固定的的优先级进行行处理。当一一个异常出现现以后,ARRM微处理器器会执行以下下几步操作: 进入异常常处理的基本本步骤: 将将下一条指令令的地址存入入相应连接寄寄存器LR,以以便程序在处处理异常返回回时能从正确确的位置重新新开始执行。将将CPSR复复制到相应的的SPSR中中。根据异常常类型,强制制设置CPSSR的运行模模式位。 强强制PC从相相关的异常向向量地址取下下一条指令执执行,从而跳跳转到相应的的异常处理程程序处
25、。如果果异常发生时时,处理器处处于Thummb状态,则则当异常向量量地址加载入入PC时,处处理器自动切切换到ARMM状态。 AARM微处理理器对异常的的响应过程用用伪码可以描描述为: RR14_ = Retuurn Liink SPPSR_= CPSR CPSR4:0 = Excceptioon Modde Nummber CCPSR55 = 00 ;当运行行于 ARMM 工作状态态时 If = Reeset oor FIQQ thenn;当响应 FIQ 异异常时,禁止止新的 FIIQ 异常 CPSR6 = 1 PSRR7 = 1 PCC = Exxceptiion Veector Addre
26、ess 异常常处理完毕之之后,ARMM微处理器会会执行以下几几步操作从异异常返回: 将连接寄存存器LR的值值减去相应的的偏移量后送送到PC中。 将SPSRR复制回CPPSR中。 若在进入异异常处理时设设置了中断禁禁止位,要在在此清除每一种异常模式式拥有自己的的物理的R113。应用程程序初始化该该R13,使使其指向该异异常模式专用用的栈地址。当当进入异常模模式时,可以以将需要使用用的寄存器保保存在R133所指的栈中中;当退出异异常处理程序序时,将保存存在R13所所指的栈中的的寄存器值弹弹出。这样就就使异常处理理程序不会破破坏被其中断断程序的运行行现场。1。请问cacche和wrrite-bbuf
27、ferr的关系,在在WB和caache同时时打开的时候候,数据是如如何流动的呢呢?考虑到WWB的特性,是是不是较大段段的数据被写写入WB? WB的设计是为为了防止处理理器流水线被被写数据总线线操作(写主主存,写外围围设备寄存器器等)拉住。典典型写数据总总线时机有三三种:一是ccache处处于writte thrrough策策略下的写操操作;二是ccache处处于writte bacck策略下,ddirty数数据由于caache行替替换或者被程程序主动清空空而写回主存存,三是不经经过cachhe,直接对对数据总线的的写操作。有有了WB之后后,被写 回回数据总线的的内容在进入入WB之后,处处理器和
28、caache就可可以立刻继续续使用了。这这就是WB和和cachee的关系。22。还有就是是所谓“caachablle bitt”和“buufferaable bbit”的问问题,这个问问题来自于aarm-arrmparrtB 的55.4节,那那里有一张表表,我对这个个表死活不理理解。这个问问题以前也问问过,但是没没有人回答。ARM各系列的的处理器上的的cachee设计有所不不同,所以有有的cachhe只有wrrite tthrouggh策略,有有的cachhe只有wrrite bback策略略,还有的ccache是是writee backk策略但允许许一定的wrrite tthrouggh行为
29、,因因此C和B位位的四种组合合对这三种ccache而而言有不同的的含义。第一一列和第二列列分别针对wwrite throuugh型caache和wwrite back型型cachee进行解释,其其含义可以参参考我对第11个问题的回回答,第三列列针对wriite baack策略但但允许一定的的writee throough行为为的cachhe,第一行行好理解,第第二行之所以以在B位为00的情况下依依然是buffferabble,应该该是因为硬件件上的设计原原因(节省硬硬件资源 或或者由于目标标设计频率限限制),第三三行的含义是是,当C=1,B=0时,caache使用用writee throoug
30、h策略略,WB开启启,第四行的的含义是,当当C=1,B=1时时,cachhe使用wrrite bback策略略,WB开启启。 可以看看到,对第 三种类型的的cachee,C和B位位不再“严格格”是其本来来控制caccheablle和buffferabble的含义义,而是利用用这两位的“组组合”来控制制cachee和 WB的的表现行为,这这样做比另外外再增加一位位来选择caache的wwrite back策策略和wriite thhroughh策略硬件上上节约了资源源,效果上却却差不多,少少了cachhe和WB几几种意义不大大的组合,应应该说还是挺挺巧妙的。ARM启动代码码设计参考 HYPERL
31、INK JavaScript:d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(saveit=window.open(/storeit.aspx?t=+escape(d.title)+&u=+escape(d.location.href)+&c=+escape(t),saveit,scrollbars=no,width=590,height=300,left=75,top=20,status=no,re
32、sizable=yes);saveit.focus(); o 收藏到我的网摘中,并分享给我的朋友 收藏 基于ARM的芯芯片多数为复复杂的片上系系统,这种复复杂系统里的的多数硬件模模块都是可配配置的,需要要由软件来设设置其需要的的工作状态。因因此在用户的的应 用程序序之前,需要要由专门的一一段代码来完完成对系统的的初始化。由由于这类代码码直接面对处处理器内核和和硬件控制器器进行编程,一一般都是用汇汇编语言。一一般通用的内内容包 括: 中断向量量表 初始化化存储器系统统 初始化堆堆栈 初始化化有特殊要求求的断口,设设备 初始化化用户程序执执行环境 改改变处理器模模式 呼叫主主应用程序 1.中中断向
33、量表 ARM要求求中断向量表表必须放置在在从0地址开开始,连续88X4字节的的空间内。 每当一个中中断发生以后后,ARM处处理器便强制制把PC指针针置为向量表表中对应中断断类型的地址址值。因为每每个中断只占占据向量表中中1个字的存存储空间,只只能放置一条条ARM指令令,使程序跳跳转到存储器器的其他地方方,再执行中中断处理。 中断向量表表的程序实现现通常如下表表示: ARREABooot,CCODE,READOONLY EENTRY BResettHandller BUnndefHaandlerr BSWIHHandleer BPreeAborttHandller BDaataAboortHan
34、ndler B BIRQHHandleer BFIQQHandller 其中中关键字ENNTRY是指指定编译器保保留这段代码码,因为编译译器可能会认认为这是一段段亢余代码而而加以优化。链链接的时候要要确保这段代代码被链接在在0地址处,并并且作为整个个程序的入口口。 2.初始化存存储器系统 (1)存储储器类型和时时序配置 通通常Flassh和SRAAM同属于静静态存储器类类型,可以合合用同一个存存储器端口;而DRAMM因为有动态态刷新和地址址线复用等特特性,通常配配有专用的存存储器端口。 存储器端口口的接口时序序优化是非常常重要的,这这会影响到整整个系统的性性能。因为一一般系统运行行的速度瓶颈颈
35、都存在于存存储器访问,所所以存储器访访问时序应尽尽可能的快;而同时又要要考虑到由此此带来的稳定定性问题。 (2)存储储器地址分布布 一种典型型的情况是启启动ROM的的地址重映射射。3.初始化化堆栈 因为为ARM有77种执行状态态,每一种状状态的堆栈指指针寄存器(SSP)都是独独立的。因此此,对程序中中需要用到的的每一种模式式都要给SPP 定义一个个堆栈地址。方方法是改变状状态寄存器内内的状态位,使使处理器切换换到不同的状状态,让后给给SP赋值。注注意:不要切切换到Useer模式进行行User模模式的堆栈设设 置,因为为进入Useer模式后就就不能再操作作CPSR回回到别的模式式了,可能会会对接
36、下去的的程序执行造造成影响。 这是一段堆堆栈初始化的的代码示例,其其中只定义了了三种模式的的SP指针: MRSR0,CPSR BICR0,R0,#MMODEMAASK安安全起见,屏屏蔽模式位以以外的其他位位 ORRR1,R0,#IIRQMODDE MSRRCPPSR_cxxfs,R11 LDRSP,=UndeefStacck ORRRR11,R0,#FIQMOODE MSSRCCPSR_ccxsf,RR1 LDRRSPP,=FIQQStackk ORRR1,R0,#SSVCMODDE MSRRCPPSR_cxxsf,R11 LDRSP,=SVCSStack 4.初始始化有特殊要要求的端口,设设
37、备 5.初始化应用用程序执行环环境 映 像像一开始总是是存储在ROOMFlaash里面的的,其RO部部分即可以在在ROMFFlash里里面执行,也也可以转移到到速度更快的的RAM中执执行;而RWW和ZI这两两部 分是必必须转移到可可写的RAMM里去。所谓谓应用程序执执行环境的初初始化,就是是完成必要的的从ROM到到RAM的数数据传输和内内容清零。 下面是在AADS下,一一种常用存储储器模型的直直接实现: LDRr0,=|Imaage$RRO$Liimit|;得到RWW数据源的起起始地址 LLDRr1,=|Imagge$RWW$Basse|;RRW区在RAAM里的执行行区起始地址址 LDRr22
38、,=|Immage$ZI$BBase|;ZII区在RAMM里面的起始始地址 CMMPr0,r11;比较较它们是否相相等 BEEQ%F1 00CMPr1,r3 LLDRCCr2,r0,#4 STTRCCr2,rr1,#44 BCCC%B0 1LLDRr1,=|Imagge$ZII$Limmit| MOVr2,#0 2CMMPr3,r11 STRRCCrr2,r33,#4 BCC%BB2 程序实实现了RW数数据的拷贝和和ZI区域的的清零功能。其其中引用到的的4个符号是是由链接器第第一输出的。 |Imagge$ROO$Limmit|:表表示RO区末末地址后面的的地址,即RRW数据源的的起始地址 |I
39、magge$RWW$Basse|:RWW区在RAMM里的执行区区起始地址,也也就是编译器器选项RW_Base指指定的地址 |Imagge$ZII$Basse|:ZII区在RAMM里面的起始始地址 |IImage$ZI$Limitt|:ZI区区在RAM里里面的结束地地址后面的一一个地址 程程 序先把RROM里|IImage$RO$Limt|开始的RWW初始数据拷拷贝到RAMM里面|Immage$RW$BBase|开开始的地址,当当RAM这边边的目 标地地址到达|IImage$ZI$Base|后就表示RRW区的结束束和ZI区的的开始,接下下去就对这片片ZI区进行行清零操作,直直到遇到结束束地 址|
40、IImage$ZI$Limitt| 6.改变处理器器模式 因为为在初始化过过程中,许多多操作需要在在特权模式下下才能进行(比比如对CPSSR的修改),所所以要特别注注意不能过早早的进入用户户模式。 内内核级的中断断使能也可以以考虑在这一一步进行。如如果系统中另另外存在一个个专门的中断断控制器,这这么做总是安安全的。 77.呼叫主主应用程序 当所有的系系统初始化工工作完成之后后,就需要把把程序流程转转入主应用程程序。最简单单的一种情况况是: IMMPORTmain Bmaiin 直接从从启动代码跳跳转到应用程程序的主函数数入口,当然然主函数名字字可以由用户户随便定义。 在ARMADS环境境中,还
41、另外外提供了一套套系统级的呼呼叫机制。 IMPORRT_mmain BB_maiin _main()是编译系系统提供的一一个函数,负负责完成库函函数的初始化化和初始化应应用程序执行行环境,最后后自动跳转到到main()函数。ARM中B _Mainn和B Maain的区别别转第一种答案如下下: 在软件仿真的情情况下,执行行“B _main”指指令,能使程程序跳到C文文件的maiin函数,但但用硬件仿真真时,还没执执行到maiin函数时就就进入了异常常中断。 原因是执行“BB _maain”指令令后,程序先先跳到_mmain库函函数的入口,再再进行一些初初始化操作,最最后再跳入用用户的maiin函
42、数。但但在初始化过过程中,由于于堆栈或其它它原 因造成成程序出错。有有两种方法可可以解决这个个问题。第一一:将“B _maiin”指令直直接改成“BB mainn”,使程序序不进行初始始化而直接跳跳入用户的mmain()函数。第二二:合理初始始化堆栈。由由于考虑到刚刚接触ARMM和将问题简简单化,我选选择了第一种种方法。第二种答案如下下:IMPORT _maiin BL TargeetReseetInittB _maiin1、此后流程将将跳转到ADDS提供的启启动代码_main函函数处,负责责完成库函数数的初始化及及相关功能,并并最终引导处处理器入口用用户代码maain()函函数,其代码码流程
43、为:嵌入式系统在进进入应用主程程序之前必须须有一个初始始化的过程,该该过程完成系系统的启动和和初始化功能能,初始化过过程可以分成成两部分来看看: _mainn负责设置运运行映像存储储器映射; _rt_eentry负负责库函数的的初始化。_main完成成代码和数据据的复制,并并把ZI数据据区清零,这这一步当代码码和数据区在在存储和运行行时 处于不不同的存储器器位置时有意意义。接着_main跳跳进_rt_entryy,进行STTACK和HHEAP等的的初始化。最最后_rt_entryy跳进应用程程序的入口 main()。当应用用程序执行完完时,_rtt_entrry又将控制制权交还给CC库函数,函
44、函数mainn()在ADDS中有特殊殊的意义。当当一个程序工工程项目中存存在 maiin()时,连连接器会把_main和和_rt_eentry中中的初始化代代码连接进来来;如果没有有main()函数,初初始化过程就就不会被连接接,初始化过过程中一 些些标准的C库库函数失效。而而用户应用程程序初始化过过程并未显式式的完成这些些堆栈初始化化及数据拷贝贝操作,应用用程序将启动动不成功。2、_maiin()为编编译系统提供供的一个库函函数,使用_mainn标号引导系系统时必须将将应用程序的的入口数定义义为mainn();3、若希望系统统进入应用程程序前自动完完成系统调用用(如库函数数的初始化、RRW、
45、ZI数数据从 Fllash到RRAM的拷贝贝(加载映像像执执行映像)等等)的初始化化过程,必须须使用_mmain标号号以跳至ADDS提供的初初始化函数库库,这种情况况一般 需做做一些库函数数移植及重定定向问题解决决;这一点上上,应用程序序入口必须以以main函函数标识;4、若所有的初初始化步骤都都已显式的完完成(如堆栈栈初始化、加加载映像到执执行映像RWW、ZI数据据的 拷贝等等),应用程程序入口函数数XXXX()可以任意意定义(非mmain,这这样可以避免免自动链接上上_maiin,从而跳跳过_maain),初初始化完成后后直接 B XXXXX即可,这这一点上,mmain()函数并不具具有特
46、殊性;5、若必须的初初始化步骤都都未显示的完完成,一意孤孤行的B XXXXX,程程序运行的结结果将不可预预料。一个典典型的例子是是:若用户并并未显示完成成加载映像执行行映像的数据据初始化而直直接B XXXXX,则应应用程序中所所有的全局变变量并不会被被预期的初始始化,而所有有的ZI变量量也不会被预预期的清零;6、本人在调试试LPC22294 LCCD模块时才才认识到上述述第五点(55、)的重要要性:程序指指令流并没有有错,但LCCD上显示的的全部是乱码码。我用两种种方法解决了了这一bugg:(1)将所有的的字库数据定定义为connst常量,程程序运行正确确;(2)将B Main 修改成B _m
47、aain接着将将应用入口改改为int main(void) 而非innt Maiin(voiid),程序序也得到正确确的执行;Initiallizingg memoory reequireed by C coddeThe iniitial valuees forr any initiializeed varriablees (RWW) musst be copieed froom ROMM to RRAM.All othher ZII variiabless mustt be iinitiaalizedd to zzero. The llibrarry iniitialiizatioon co
48、dde callledat _maain peerformms thee copyying aand innitiallizatiion.Using tthe maain fuunctioonWhen thhe commpilerr comppiles a funnctionn callled maain(), it ggeneraates aa refeerencee to tthesymbol _maiin to forcee the linkeer to incluude thhe bassic C run-ttime ssystemm fromm the ANSIC libraary.
49、 (The ssymboll _maain iss markked ass an eentry pointt.)建议议和我一样的的初学者还是是乖乖的B _maiin接着将应应用入口设置置为mainn()函数的的好。ARM编程:SScatteer文件的编编写、分析scatterr基本点:11. 编译后后输出的映像像文件中各段段是首尾相连连的,中间没没有空闲的区区域,它们的的先后关系是是根据链接时时参数的先后后次序决定的的 armllinkerr -fille1.o file22.o 2. sccatterr用于将编译译后的映像文文件中的特定定段加载到多多个分散的指指定内存区域域3. 有22类域r
50、eggion:执执行域(exxecutiion reegion,一一般是ramm区域)和加加载域(looad reegion,一一般是romm区域)4. 加载域:就是编译之之后得到的二二进制文件烧烧写到romm中的这一段段区域,所有有的代码ROO、预定义变变量RW、堆堆栈之类清不不清空无关紧紧要的大片内内存区域ZII,都包括在在其中5. 执行域:就就是把加载域域进行解压压缩后的样样子。比如:RO没有变变动还是在RROM中,RRW被移到了了SRAM中中,而ZI被被放置在SDDRAM中66. scaatter本本身并不能对对映像实现解压缩,编编译器读入sscatteer文件之后后会根据其中中的各种
51、地址址生成启动代代码,实现对对映像的加载载,而这一段段代码就 是是* (InnRoot$Secttions)它是_mmain()的一部分。这这就是在汇编编启动代码的的最后跳转到到_maiin() 而而不是跳向mmain()的原因之一一。7. 起起始地址与加加载域重合的的执行域成为为root regioon,* (InRooot$Seectionns)必须放放在这个执行行域中,否则则链接的时候候会报错。*(+RO)包含了* (InRooot$SSectioons),所所以如果在rroot rregionn中用到了*(+RO)可以不再指指定* (IInRoott$Secctionss),scatt
52、err语法:ROOM_LOAAD 0 x0000000000 ROM 00 x000000000 0 x0033FFFFFF vectoors.o (+RO,+FIRSST) * (InRooot$SSectioons) ; Alll librrary ssectioons thhat muust bee in aa roott regiion *(+RO) SRRAM 0 xx004000000 00 x003FFFFFF * (+RW,+ZI) SDRRAM1 00 x410000000 UNINIIT stacck.o (+ZI) ; staack.s中中定义了toop_of_stack
53、k为长度为11的spacce,指定栈栈顶地址 SDRRAM2 +0 UNIINIT heap.o (+ZZI) 注解:1. RROM_LOOAD是加载载域。这里只只有一个,也也可以有多个个(rom地地址不连续的的情况)2. ROM、SSRAM、SSDRAM11、SDRAAM2是执行行域,有多个个。第一个执执行域必须和和加载域地址址重合,因为为ARM的复复位地址就是是加载域的起起始地址(有有bootsstrap的的话加载域址址就是boootstraap执行完后后的跳转地址址)3. vvectorrs.o (+RO, +FIRSST) 中断断向量表放在在最开头4. ROM 0 x000000000
54、0 0 x0003FFFFFF; 加载载域名 起始始地址 最大大允许长度;最大允许许长度也可可以省略,但但缺点是编译译器不会检查查段是否溢出出和别的段重重叠了。起起始地址= +0表示示紧接着上一一段开始的连连续地址。55. * (InRooot$Seectionns)是复制制代码的代码码6. UNNINT关键键字表示不进进行初始化清清零值得注意的是:在一个sccatterr文件中,同同一个.o文文件不能出现现2次,即使使是在2个不不同的加载域域中也不可以以,否则会报报错:Ambbiguouus sellectorrs fouund foor *.oo,错误的例例子:LOAD1 00 x0000
55、00000 EEXE1 Init.o LOAD2 00 xFFFFF0000 EEXE2 Init.o 想起了中学里哲哲学课上老师师让解释为什什么人不能两两次踏入同一一条河流,当当年稀里糊涂涂的写的答案案,老师批了了个大差,回回去有没有补补上,今天居居然在这里遇遇到了老问题题。推测测是编译器自自动生成的sscatteer载入代码码InRooot$Seectionns不支持把把同一objj搬移2次。这 就带来一个问题:如果希望把同一段代码(如中断跳转表)载入2份拷贝到不同的地址,咋整?一个笨办法是自己写一段代码搬移程序来代替编译器自动生成的搬移 代码,但前提是需要搞懂映像文件的组织,增加了工作量
56、。投机一点的方法是在makefile中把一个.o文件复制并重新起一个名字,然后把它们传递给 armlink。另外,猜测scatter语法可能包含诸如+duplicate之类的关键字来允许同一段的多个副本,懒得翻ARM手册,请哪位知情者留 言告知,谢过将程序执行到CC文件的maain函数我的第一个实实验 将将程序执行到到C文件的mmain函数数 实验目的 运用ADS编写写一个小程序序,使程序能能够从起始的的汇编代码运运行到C程序序的mainn()函数(这这也可称作非非常简单的起起动代码),并并通过仿真器器连接目标板板,最终能够够在AT911SAM7SS64里正确确运行。 实验程序和参参数设置 1
57、连接器的选选项设置 选项设置如图22-1所示。因因为在AT991SAM77S64中FFLASH存存储器的地址址是以0 x00开始,而SSRAM的地地址是以0 xx002000000开始始,所以我将将下图中的RRO Basse和RW Base分分别设置成了了0 x0和00 x002000000。其其它设置请参参考有关书籍籍。 图2-1. 选选项设置图 2启动代码 在ARM应用系系统中,芯片片复位后,在在进入C语言言的 maiin()函数数前,都要执执行一段启动动代码。该代代码一般都是是用汇编语言言编写,用来来完成系统运运行环境和应应用程序的初初始化,详情情请参考有关关书籍。由于于本实验的 目的很
58、简单单,就是想让让程序复位后后,进入maain()函函数,所以有有些初始化代代码尽量精简简,留下了下下述代码。另另外,_mmain是CC语言的内部部库函数,可可以在 进入入用户maiin()之前前完成内部RRAM的初始始化工作,类类似KeillC51中的的starttup.a551。当执行行完_maain这段代代码后,再跳跳转到 maain()函函数。 AREA innit,COODE,REEADONLLY CODE322 Mode_USSR EQQU 0 xx10 ;CCPSR中各各种处理器模模式对应的控控制位 I_Bit EQU 0 x800 ;CPSSR中的中断断禁止位 F_Bit EQ
59、U 0 x400 USR_Staack EEQU 00 x002003000 ;定义RAAM的最高地地址,无重映映射 ENTRY BB InittResett ; 0 x00 Resett handdler undefveec B unddefvecc ; 0 x04 Undeffined Instrructioon swivec B swiivec ; 0 x08 Softwware IInterrrupt pabtvecc B pabbtvec ; 0 x0CC Preffetch Abortt dabtvecc B dabbtvec ; 0 x100 Dataa Aborrt rsvdv
60、ecc B rsvvdvec ; 0 x144 reseerved irqvec B iirqvecc ; 0 x18 IRQ fiqvec B ffiqvecc ; 0 x1c FIQ InitResset MSR CPPSR_c,#Modee_USR | I_BBit | F_Bitt ;改成用用户模式且禁禁止IRQ和和FIQ中断断 LDR SPP,=USRR_Stacck IMPORTT _mmain b _mainn ;跳转转到_maain执行,它它位于C运行行时库中 END 3C语言主函函数 在C语言主函数数中做了一个个死循环,如如下述所示。 int maiin(voiid) whi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年区块链技术应用与安全指南
- 2025年企业财务报表编制与审核规范-2
- 财务人员岗位责任制与考核制度
- 办公室员工培训效果持续改进制度
- 办公室环境卫生维护制度
- 养老院环境清洁制度
- 2026年潍坊市教育局所属学校急需紧缺人才及部属公费师范生公开招聘备考题库附答案详解
- 2026年绵阳东风南方汽车销售有限公司招聘备考题库完整答案详解
- 2026年湖南省茶业集团股份有限公司招聘备考题库及一套答案详解
- 云南特殊教育职业学院2026年春季银龄教师招募备考题库及答案详解一套
- 2026年上海市松江区初三语文一模试卷(暂无答案)
- 清华大学教师教学档案袋制度
- 公租房完整租赁合同范本
- 东南大学附属中大医院2026年招聘备考题库及答案详解参考
- 2025新疆阿瓦提县招聘警务辅助人员120人参考笔试题库及答案解析
- 贵州国企招聘:2025贵州盐业(集团)有限责任公司贵阳分公司招聘考试题库附答案
- 2025-2026学年秋季学期教学副校长工作述职报告
- GB/T 3098.5-2025紧固件机械性能第5部分:自攻螺钉
- 2026年安徽国防科技职业学院单招职业适应性考试题库及完整答案详解1套
- 2026年服装电商直播转化技巧
- 2025秋粤教粤科版(新教材)小学科学二年级上册知识点及期末测试卷及答案
评论
0/150
提交评论