《ARM处理器系统初始化过程.docx》由会员分享,可在线阅读,更多相关《ARM处理器系统初始化过程.docx(50页珍藏版)》请在优知文库上搜索。
1、ARM处理器系统初始化过程1禁止MMU,关闭中断,禁止CaChe:2根据硬件设计配制好处理器时钟、DRAM时钟、定时器时钟;3根据系统中所用的f1.ash和DRAM芯片容量和电气参数设置它们的起始地址、容量、刷新频率等:4将固化在门ash芯片中的程序搬移到DRAM内存中:5使能CaChe,使能MM3跳转到DRAM内存中运行继续初始化,包括根据具体应用以及系统中的硬件配置初始化各个功能模块、安装好异常中断处理程序、使能中断等:6进行操作系统相关初始化;禁止MMU,关闭中断,禁止CaChe通过。系统控制协处理器的存放器1的第O位可以允许和禁止在4位后这位是o.被禁止。关闭中断与翻开中断中断是一种高
2、笠的对话机制,但有时并不想程序运行的过程中中断运行,比方正在打卬东西,但程序突然中断了,又让另外个程序输出打印内容,这样在打印机上就会乱得不得了.问时有两份以上的文件交错地打印在一张纸上像不可剥夺的资源.就一定要关闭中断.让它占有这个资源.在ARN里.没有像86那样有去除中断指令C1.I.那么在ARM里是怎么样实现关中断和开中断的呢?下面就来看看ARM的美中断和开中断实现。void1.ock(void)stmdbsp!,IrO)nrsr.cpsrorrr.H),SOxCOtsrCPSr-CXSf,r。Idminsp!1(r)上面这段程序是通过设置CPSR的第6,,位来实现的,因为第6,7位是设
3、置为1时,就不再叫应中断.voidUn1.ock(void)Stindbsp!,h-0)nrsr,cpsrbicr.r.SOxCOnsrcpsr_cxsf,rIdmiasp!,(r)上而是臾新开中断的命令,同样是设置CPSR的第6.7位.但它的值是O.就可接收中断了.如果在多个任务之间进行共享数据,一般是需瞿使用关中断和开中断实现数据同步的,其实中这种关中断和开中.收是进入临界区和退出临界区.如果是像PC机那样为多个CPt的话,关中断并不能防止这种情况.系统的在应用编程(IAP)以及在系统编程功能(ISP)等“中断向盘表RM要求中断向量表必须放置在从O地址开始,连续8X4字节的空间内。每当个中
4、断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向身表中1个字的存储空间,只能放理条AKM指令,使程序跳转到存储淞的其他地方,再执行中断处理。中断向量表的程序实现通常如卜.表示:AREABoot,CODE,READoN1.YENTRYBReset1.1.and1.erBUndefHand1.erBSWIHand1.erBPreAbortHand1.erBDataAbortHand1.erBBIRQHand1.erBFIQHand1.er其中关键字ENTRY是指定编译器保存这段代码,因为编译器可能会认为这是一段云余代码而加以优化。链接的时候要确保这段代
5、码被链接在。地址处,并且作为整个程序的入口。MHMMI0:开机默认值,Boot袋栽模式向盘表(OX(KKK)OOOoOXoooOOO3c)映射的是BootB1.oCk中的Ox7HEOOO-Ox7FH03c中的ft:芯片复位时.启动boot袋段程序.boot装我程序检住PO.14口的状态和用户的异常向量,判断是迸入ISP状态还是启动用户程序,若后动用户程序,则自动设双MEWtAP=I(片内f1.ash启动)或3(片外程序存储寄启动.很奇怪的,我在实验中,当使用无片内f1.ash的1.pC221。时即使设置PO.14为上下都没关系,芯片会跳过域而执行片外f1.ash中的代吗.MBwAI,=h中断向
6、显龙就在片内f1.ash中,地址就是OXOoO(Xx)OO-OXOoOoOO3c,相当于汉仃映射:MEMMAP=2:G为主要的设置.即是JR唉射的关键之所在,当设置NEw1.AP=2时,中断向此表(OXOoOOQ(KK)-CIXoI)DC1.oo30映射的是片内SRAM中的(MQ(KK)O(KH)EOoOocI%中的俯,而因为是SRAV,所以在程序运行的过程中是可以改变的.这样所可以到达成映射的目的啦(中断向盘表可以防时脩改).MEMMAP=3:中断向员表就在片外f1.ash中.中断向显&9x00000000-0x0000003C)映射到足片外f1.ash中的0x800000000x80000
7、03c中的曲;功能上与MEMUAP=I时的差不多,因为旦程序固化到门ash中,即为只读,只是数假映则而己!设置ME三P:MemoryMapping(whenInterniptVectorsareinRAM)MEMMAPEQ1.OxEOIFCO1.O;IkxnoryMappingContro1.IF:DEF:REMAP1.DRRO,MEMMAPIF:DEF:EXTMEMMODEMOVR1.,#3E1.IF:DEF:RAMMODEMOTR1.#2B1.SEMOVR1.tnENDIFSTRR1.,R0BDIFMI三IM两个控制位MEMMAPU:000BOOT装毂程序模式01UserF1.ASH模式1
8、0 用户RAM模式11 用户外部存体满根式10模式也就是RAM梭式我的访问地址OXOo是跟访问KAMOXWWOOOO中的数据是完全一样的向RAM中写进数据然后通过数据窗口观察0X0地址的变化应该是I可步变化的存储器类型和时序配置主要是对系统存储器控制寄(MD的初始化,由于存储!潺控制器并不是ARM架构的一局部,不同芯片的实现方式各不相同.由于运口能力和寺址能力的强大.葩于ARM内核的微处理器系统般都需要外扩展各种类型的存铭器.对干存储器系统的初始化一般包括如下儿个方面;一一存储潺类型、时序和总处宽度的配Bt一一存储寄地址的限置(1)存储网类型星rARN微处理系统的存储器般有如下几类:SARM.
9、DRAM1F1.ahJn1.W,即使同类存储器也行访问速度上的不同.其中,SRAM和F1.ahJa于静态存储器,可以共用存储器端口,而DRAM有动态刷新和地址复用等格征,需要门的存储器端1.1.(2)时序存储器端口的接口时序优化对系统性能影响非常火,因为系统运行的速度瓶颈搬都存在于存储器的访问,因此希望在健等的访问尽可能快,但乂要考虑由此带来的系统程定性问题.(3)总线宽度ARM微处理器架构支持8/16/32位的数据总线宽度访问存储器和外设,对于特定的存赭器说,霜要设定数据总践的宽度.(4)存储涔地址的配置ARM点处理器架构理论卜.可以支持IGB的地址空间,而对于个实际的系统来说,配置的物理地
10、址远没有这么多.因此,如何配置存储寄的地址,也是一个里要的问即.(5)存储器地址乐映射存储器地址重映射就是可以通过枕件配置来改变块存储腓物理地址的方法,是当前许多先进控制牌所具有的功能,进行地址重映射的原因:提高系统的运行效率.进行地址血映射的注意:保证程序流程的连续性。有的ARM处理腓不具有地址水映射的功能,可以采样代码搬移加跳收的方式完成上述功能.初始化堆栈因为ARM有7种执行状态,每种状态的堆栈指针存放器(SP)都是独立的。因此,对程序中需要用到的每一种模苴都要给SP定义一个堆栈地址.方法是改变状态存放器内的状态位,使处理器切换到不同的状态,让后给SP赋值。注意:不要切换到USer模式进
11、行USer模式的堆栈设置,因为进入USer模式后就不能再操作CPSR回到别的模式了,可能会对接卜.去的程序执行造成影响。这是段堆栈初始化的代码例如,其中只定义了三种模式的SP指针:MRSRO,CPSRB1.CRO,RO,三)DEMSK平安起见,屏蔽模式位以外的我他位ORRR1.R0,IRQMODEMSRCPSR_cxfs,R1.1.DRSP,=UndefStackORRri,rokfiqmodeMSRCPSI1.CXSf,R1.1.DRSP,=FIQStackORRR1.R0,#SyCMoDEMSRCPSR_cxsf,R1.1.DRSP,=SVCStack初始化应用程序执行环境如果使用分散加载
12、描述文件调整堆栈和堆放置,则链接器创立一userinitia1.stackheap()函数,并使用链接器定义的符号作为这些区域的名称。映像一开始总是存储在ROM/E1.ash里面的,其RO局部即可以在RoM/F1.ash里面执行,也可以转移到速度更快的RAN中执行;而RW和Z1.这两局部是必须转移到可写的RAM里去。所谓应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零。下面是在ADS下,一种常用存储器模型的直接实现:1.DRr,=Iinage$SRO$S1.iini1.得到牌数据源的起始地址1.DRr1I1.nage$RW$BaSeRW区在RAM里的执行区起始地址1
13、.DRr2,=ImagcJSZUSBaseZI区在RAM里面的起始地址CMPr,r1.比较它们是否相等BEQ%F10CMPr1.,r31.DRCCr2,10,#4STRCCr2,r1.,if4BCC%B01 1.DRr1.,=IImagesJZISS1.imitIMOVr2,W)2 CMPr3,r1.STRCCr2,(r3,#4BCC%B2程序实现了RW数据的拷贝和ZI区域的清零功能。其中引用到的4个符号是由链接罂第输出的.IinageSSROSS1.imitI:表示Ro区木地址后面的地址,即RW数据源的起始地址IinageSSRWSSBHse:1湛区在RAY里.的执行区起始地址,也就是编译器
14、选项RWBaSe指定的地址ImageJSZIJSBase:Z1.区在RAM里面的起始地址Image$ZI$1.imitI:Z1.区在RAM里面的结束地址后面的个地址程序先把R(W里hnagc$6RO$61.imt开始的演初始数据拷贝到RAM里面I1.mage$1JRWSSBaseI开始的地址,当RAM这边的目标地址到达Image$ZI$BaSe1.后就表示RW区的结束和Z1.区的开始,接下去就对这片Z1.区进行清零操作,直到遇到结束地址IEage1.imit1.改变处理器模式因为在初始化过程中,许多操作需要在特权模式下才能进行(比方对CPSR的修改),所以要特别注意不能过早的进入用户模式。内核
15、级的中断使能也可以考虑在这一步进行。如果系统中另外存在一个专门的中断控制器,这么做总是平安的。呼叫主应用程序当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序。最简雌的一种情况是:IMPORTmainBmain直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。在ARVADS环境中,还另外提供了套系统级的呼叫机制。IMPORT_mainB_mainMin()是编译系统提供的个函数,负费完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到Inaino函数。ARM介绍ARM很处理器的工作状态一般有两种.并可在两种状态之间切换:第一种为ARM壮态.此时处理器执行32位的字对齐的ARM指令:第二种为ThUmb状态,比时处理需执行16位的、半字对齐的ThuMh指令.在程序的执行过程中,微处理器可以拔时在两种工作状态之间切换,并R,处理器工作状态的转变并不影响处理器的工作模式和相应存放潺中的内容.但ARM微处理票在开始执行代码时,应该处于