欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    ARM处理器系统初始化过程.docx

    • 资源ID:1677763       资源大小:155.71KB        全文页数:50页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    ARM处理器系统初始化过程.docx

    ARM处理器系统初始化过程1禁止MMU,关闭中断,禁止CaChe:2根据硬件设计配制好处理器时钟、DRAM时钟、定时器时钟;3根据系统中所用的f1.ash和DRAM芯片容量和电气参数设置它们的起始地址、容量、刷新频率等:4将固化在门ash芯片中的程序搬移到DRAM内存中:5使能CaChe,使能MM3跳转到DRAM内存中运行继续初始化,包括根据具体应用以及系统中的硬件配置初始化各个功能模块、安装好异常中断处理程序、使能中断等:6进行操作系统相关初始化;禁止MMU,关闭中断,禁止CaChe通过。系统控制协处理器的存放器1的第O位可以允许和禁止在4位后这位是o.被禁止。关闭中断与翻开中断中断是一种高笠的对话机制,但有时并不想程序运行的过程中中断运行,比方正在打卬东西,但程序突然中断了,又让另外个程序输出打印内容,这样在打印机上就会乱得不得了.问时有两份以上的文件交错地打印在一张纸上像不可剥夺的资源.就一定要关闭中断.让它占有这个资源.在ARN里.没有像86那样有去除中断指令C1.I.那么在ARM里是怎么样实现关中断和开中断的呢?下面就来看看ARM的美中断和开中断实现。void1.ock(void)stmdbsp!,IrO)nrsr.cpsrorrr.H),SOxCOtsrCPSr-CXSf,r。Idminsp!1(r)上面这段程序是通过设置CPSR的第6,,位来实现的,因为第6,7位是设置为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字节的空间内。每当个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向身表中1个字的存储空间,只能放理条AKM指令,使程序跳转到存储淞的其他地方,再执行中断处理。中断向量表的程序实现通常如卜.表示:AREABoot,CODE,READoN1.YENTRYBReset1.1.and1.erBUndefHand1.erBSWIHand1.erBPreAbortHand1.erBDataAbortHand1.erBBIRQHand1.erBFIQHand1.er其中关键字ENTRY是指定编译器保存这段代码,因为编译器可能会认为这是一段云余代码而加以优化。链接的时候要确保这段代码被链接在。地址处,并且作为整个程序的入口。MHMMI'0:开机默认值,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中断向显龙就在片内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中的0x800000000x8000003c中的曲;功能上与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三I'M两个控制位MEMMAPU:000BOOT装毂程序模式01UserF1.ASH模式10 用户RAM模式11 用户外部存体满根式10模式也就是RAM梭式我的访问地址OXOo是跟访问KAM½OXWWOOOO中的数据是完全一样的向RAM中写进数据然后通过数据窗口观察0X0地址的变化应该是I可步变化的存储器类型和时序配置主要是对系统存储器控制寄(MD的初始化,由于存储!潺控制器并不是ARM架构的一局部,不同芯片的实现方式各不相同.由于运口能力和寺址能力的强大.葩于ARM内核的微处理器系统般都需要外扩展各种类型的存铭器.对干存储器系统的初始化一般包括如下儿个方面;一一存储潺类型、时序和总处宽度的配Bt一一存储寄地址的限置(1)存储网类型星rARN微处理系统的存储器般有如下几类:SARM.DRAM1F1.ahJn1.W,即使同类存储器也行访问速度上的不同.其中,SRAM和F1.ahJa于静态存储器,可以共用存储器端口,而DRAM有动态刷新和地址复用等格征,需要门的存储器端1.1.(2)时序存储器端口的接口时序优化对系统性能影响非常火,因为系统运行的速度瓶颈搬都存在于存储器的访问,因此希望在健等的访问尽可能快,但乂要考虑由此带来的系统程定性问题.(3)总线宽度ARM微处理器架构支持8/16/32位的数据总线宽度访问存储器和外设,对于特定的存赭器说,霜要设定数据总践的宽度.(4)存储涔地址的配置ARM点处理器架构理论卜.可以支持IGB的地址空间,而对于个实际的系统来说,配置的物理地址远没有这么多.因此,如何配置存储寄的地址,也是一个里要的问即.(5)存储器地址乐映射存储器地址重映射就是可以通过枕件配置来改变块存储腓物理地址的方法,是当前许多先进控制牌所具有的功能,进行地址重映射的原因:提高系统的运行效率.进行地址血映射的注意:保证程序流程的连续性。有的ARM处理腓不具有地址水映射的功能,可以采样代码搬移加跳收的方式完成上述功能.初始化堆栈因为ARM有7种执行状态,每种状态的堆栈指针存放器(SP)都是独立的。因此,对程序中需要用到的每一种模苴都要给SP定义一个堆栈地址.方法是改变状态存放器内的状态位,使处理器切换到不同的状态,让后给SP赋值。注意:不要切换到USer模式进行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初始化应用程序执行环境如果使用分散加载描述文件调整堆栈和堆放置,则链接器创立一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.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里.的执行区起始地址,也就是编译器选项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的修改),所以要特别注意不能过早的进入用户模式。内核级的中断使能也可以考虑在这一步进行。如果系统中另外存在一个专门的中断控制器,这么做总是平安的。呼叫主应用程序当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序。最简雌的一种情况是:IMPORTmainBmain直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。在ARVADS环境中,还另外提供了套系统级的呼叫机制。IMPORT_mainB_mainMin()是编译系统提供的个函数,负费完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到Inaino函数。ARM介绍ARM很处理器的工作状态一般有两种.并可在两种状态之间切换:第一种为ARM壮态.此时处理器执行32位的字对齐的ARM指令:第二种为ThUmb状态,比时处理需执行16位的、半字对齐的ThuMh指令.在程序的执行过程中,微处理器可以拔时在两种工作状态之间切换,并R,处理器工作状态的转变并不影响处理器的工作模式和相应存放潺中的内容.但ARM微处理票在开始执行代码时,应该处于ARM状态.ARM处理器状态进入ThUMb状态:当操作数存放器的状态位(位0)为I时,可以来川执行BX指令的方法,使微处理器从ARN状态切换到ThUnb*火态.此外.当处理器处于ThUmb状态时发生异常(如IRQ.FIQ.Undef.Abort.SW1.等).则异常处理返回时.自动切换到ThUnb状态.进入ARM状态:当操作数存放器的状态位为0时,执行BX指令时可以使微处理器从Thumb状态切换到ARM状态.此外.在处理器进行异常处理时,把PC指针放入异常模式燧接存放器中,并从异常向盘地址开始执行程序,也可以使处理腓切换到ARM状态.ARM处理潺根式ARM微处理器支持7种运行模式,分别为:用户模式(USr):RM处理器正常的程序执行状态.快速中断模式(fiq):用于高速数据传输或通道处理,外部中断模式(irq)用于通用的中断处理.管理模式(SVC):操作系统使用的保护模式.数据访问终止模式Gbt):当数据或指令预取终止时进入该模式,可用于起拟存储及存储保护.系统模式($ys):运行具有特权的操作系统任务,定义指令中止模式(Undh当未定义的指令执行时进入该模式,可用于支林饿件协处理零的软件仿女ARM处理器模式ARM微处理器的运行模式可以通过软件改变,也可以通过外制中断或异常处理改变,大多数的应用程序运行在用户模式下,当处理腓运行在用户模式下时,某些被保护的系统坡双是不能被访问的,除用户模式以外.其余的所有6种模式称之为非用户模式,或特权模式:其中除去用户模式和系统模式以外的5种又称为井常模式,常用于处理中断或弁行,以及需要访向受保护的系统货源等情况.ARM存放器ARM处理共有37个存放器.其中包括:31个通用存放寄,包恬程序计数落(PC)在内.这些存放网都是32位存放器.以及6个32位状态存放器.关于存放器这里.就不详细介绍了,有兴趣的人可以上网找找,很多这方面的资料.异常处理当正常的程序执行流程发生为时的停止时,称之为弁常,例如处理个外部的中断请求,在处理弁常之前.当前处理港的状态必很保存,这样当异常处理完成之后,当前程序可以继续执行。处理器允泞多个异常.同时发生,它们将会按固定的优先级进行处理,当一个异常出现以后,ARY也处理牌公执行以下几步操作I进入界常处理的根本步躲:将下一条指令的地址存入相应连接存放涔1.R,以便程序在处理异常返回时能从正确的位W近新开始执行,将CPSRU制到相应的SPSR中,根据异常类型,强制设KtCPSR的运行模式位。强制PC从相关的异常向fit地址取下一条指令执行.从而跳转到相应的异常处埋程序处.加果异常发生时.处理器处于ThU曲状态,则当界常向量施址加我入PC时,处理器自动切换到ARM状态.ARM微处理器对异常的响应过程用伪码可以描述为:R14Return1.inkSPSR一=CPSRCPSR4:0=ExceptionModeNumberCPSR5=0i当运行于ARM工作状态时IfResetorFIQthen:当响应FIQ异常时.禁止新的FIQ异常CPSR6=1PSR7=1PC=ExceptionVectorAddress异常处理完毕之后.AM微处理器会执行以下几步操作从弁常返回:将连接存放器I.R的值减去相应的偏移fit后送到PC中.将SPSR复制回CpSR中.若在进入异常处理时设置了中断禁止位.要在此去除式专用的栈地址-JUiATTrtSIRAIijJVAVfIfu女H311'JIruX侑怵什什NI,HTHTITJ1.请问cache和write-buffer的关系,在IB和cache同时翻开的时候,数据是如何流动的呢?考虑到WB的特性,是不是较大段的数据被写入WB?RB的设计是为了防止处理涔流水线被写数据总线操作(写主存,写外困设备存放器等)拉住。典型写数据总线时机有三种:是cache处于Writethrough策略下的写操作;二是cache处于Writeback策略下,dirty数据由于CaChe行替换或者被程序主动清空而写回主存,-:是不经过CaChe,直接对数据总线的写操作。有了"B之后,被写回数据总线的内容在进入MB之后,处理器和CaChe就可以立刻继续使用了。这就是WB和CaChe的关系。2。还有就是所谓mcachab1.ebit*f11wbufferab1.ebit"的问题,这个问题来自于CamrarmBpartB的5.4节,那里有一张表,我对这个表死活不理解。这个问题以前也问过,但是没有人答复。ARM各系歹IJ的处理器上的CaChe设汁有所不同,所以有的CUChe只有writeIhrOUgh策略,有的CaChe只有writeback策略,还有的cache是writeback策略但允许一定的Writethrough行为,因此C和B位的四种组合对这三种cache而言有不同的含义。第列和第二列分别针对writethrough型CaChQ和Writeback型CaChe进行解释,其含义可以参考我对第1个问眶的答复,第三列针对UTiIebaCk策略但允许一定的Wri1.eIhroUgh行为的CaChe,第一行好理解,第二行之所以在B位为。的情况卜依然是bufferab1.e,应该是因为硬件上的设计原因(节省硬件资源或者由于目标设计频率限制),第三行的含义是,当C=I,B=O时,CaChe使用Writethrough策略,WB开启,第四行的含义是,当C=1.B=I时,CaChe使用Wrisback策略,WB开启。可以看到,对第三种类型的CaChe,C和B位不再“严格”是其本来控制CaCheabIe和bufTerab1.e的含义,而是利用这两位的“组合”来控制CaChe和WB的表现行为,这样做比另外再增加一位来选择CaChe的WritebaCk策略和Writethrough策略硬件上节约了资源,效果上却差不多,少了cache和WB几种意义不大的组合,应该说还是挺巧妙的.ARM启动代码设计参考收藏囱迪基丁ARM的芯片多数为攵杂的片上系统,这种发杂系统里的多数硬件模块都是可配置的,需要由软件来设设其需要的工作状态。因此在用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。股通用的内容包括:中断向量:表初始化存储器系统初始化堆栈初始化有特殊要求的断口,设备初始化用户程序执行环境改变处理器模式呼叫主应用程序1 .中断向员表ARM要求中断向址表必须放置在从O地址开始,连续8X4字节的空间内。每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中1个字的存储空间,只能放置一条ARM指令,使程序跳转到存储器的其他地方,再执行中断处理。中断向量表的程序实现通常如下表示:REBooi,CODE,READON1.YBBBBBBBBENTRYResetHand1.erUndefHand1.erIRQHarxI1.erFIQHand1.erSWIHand1.erPreAbortHand1.erDataAbortHand1.er其中关键字EvrRY是指定编译器保存这段代码,因为编洋器可能会认为这是段亢余代码而加以优化.链接的时候要确保这段代码被链接在。地址处,并且作为整个程序的入口2 .初始化存储器系统(1)存储那类型和时序配置通常FIaSh和SRAM同属于静态存储器类型,可以合用同个存储器端口:而DRAM因为仃动态刷新和地址线曳用等特性,通常配有专用的存储器端口.存储器端口的接口时序优化是非常延要的,这会影响到皴个系统的性能。因为一般系统运行的速度瓶颈都存在于存储涔访问,所以存储器访问时序应尽可能的快:而同时又要考虑到由此带来的稳定性问题。(2)存储器地址分布一种典型的情况是启动ROM的地址近映射.3 .初始化堆栈因为ARM有7种执行状态,每一种状态的堆栈指针存放器(SP)都是独立的。因此,对程序中需要用到的每一种模式都要给SP定义一个堆栈地址。方法是改变状态存放器内的状态位,使处理器切换到不同的状态,让后绐SP赋值。注意:不要切换到USCr模式进行I;Ser模式的堆栈设置,因为进入User模式后就不能再操作CPSR回到别的模式了,可能会对接下去的程序执行造成影响。这是一段堆栈初始化的代码例如,其中只定义了三种模式的SP指针:MRSRO1CPSRBICRO,RO,#MODEMASK平安起见,扉蔽模式位以外的其他位ORRR1.,RO,#1RQM0DEMSRCPSR_cxfs,R1.1.DRSP.=UndefStackORRR1.,R0,树nQMODEMSRCPSR_cxsf,R1.1.DRSP1=FIQStackORRR1.,RO,#SVCMoDEMSRCPS1.1.CXSf,R1.1.DRSP1=SVCStack4 .初始化有特殊要求的端口,设备5 .初始化应用程序执行环境映像一开始总是存储在ROY/F1.ash里面的,其RO局部即可以在ROM/F1.ash里面执行,也可以转移到速度更快的RAM中执行:而RW和Z1.这两部分是必须转移到可写的RAM里去。所谓应用程序执行环境的初始化,就是完成必要的从KOM到RAM的数据传输和内容清零.下面是在ADS下,一种常用存储器模型的直接实现:1.DRr,=;Image$R0$1.imiti;得到RR'数据源的起始地址1.DRr1.,=Image$RR'$BaSe1.:RW区在RAM里的执行区起始地址I.DRr2,=|ImagC$2I$BaSo1.;Z1.区在RAM里面的起始地址CMPr,r1.;比较它们是否相等BEQCMP1.DRCCSTRCCBCC1.DRMOVCMP%F1r1.,r3r2,rO1.#4r2,r1.,4%B0r2,#()-3,r1.STRCCBCC2,r3,S4%B2r1.,=ImageSJZISJ1.imitI程序实现fKW数据的拷贝和ZI区域的消零功能。其中引用到的4个符号是由链接器第一输出的.1.n<geSSR0SS1.ini1.I:表示R0区末地址后面的地址,即RW数据源的起始地址1.mage$RW$Base:RR'区在RAY里的执行区起始地址,也就是编译器选项RIBaSe指定的地址ImageSSZISSBase:Z1.区在RAM里面的起始地址InuigejsziSS1.iinitI:ZI区在KAM里面的结束地址后面的一个地址程序先把RoM里IImage$R0$1.im1.开始的RR'初始数据拷贝到RAM里面I1.mage$RW$BaSe1.开始的地址,当RAM这边的目标地址到达Image$SZI$3BaSe后就表示RW区的结束和Z1.区的开始,接下去就对这片Z1.区进行清零操作,直到遇到结束地址IImageS$ZIS$1.imit1.6 .改变处理器模式因为在初始化过程中,许多操作需要在特权模式下才能进行(比方对CPSR的修改),所以要特别注意不能过早的进入用户模式。内核级的中断使能也可以考虑在这一步进行。如果系统中另外存在一个专门的中断控制器,这么做总是平安的。7 .呼叫主应用程序当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序。最简单的一种情况是:IMPORTmain8 main直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。在ARMADS环境中,还另外提供了一套系统级的呼叫机制.IMPORT_mainB_mainmain。是编译系统提供的一个函数,负而完成肉函数的初始化和初始化应用程序执行环境,最后自动跳转到main()函数。ARM中B_Main和BMain的区别转第种答案如下:在软件仿真的情况3执行“B_main"指令,能使程序跳到C文件的main函数,但用硬件仿真时,还没执行到Inain函数时就进入了异常中断。原因是执行“Bmain"指令后,程序先跳到_main库函数的入口,再进行一些初始化操作,最后再跳入用户的main函数.但在初始化过程中,由于堆栈或其它原因造成程序出错.有两种方法可以解决这个问题.,第一:将“B_main”指令直接改成“Bmain",使程序不进行初始化而直接跳入用户的main。函数。第二:合理初始化堆栈。由于考虑到刚接触ARM和将问题简单化,我选择了第种方法。第二种答案如卜丁IMPORTmainB1.TargetResetInitB_main1、此后流程将跳转到ADS提供的启动代码_main函数处,负费完成库函数的初始化及相关功能,并最终引导处理器人口用户代码main。函数,其代码潦程为:嵌入式系统在进入应用主程序之前必须有个初始化的过程,该过程完成系统的启动和初始化功能,初始化过程可以分成两局部来看:Jnain负责设置运行映像存储器映射;JJjentry负货库函数的初始化。Jnain完成代码和数据的复制,并把Z1.数据区清零,这一步当代码和数据区在存储和运行时处于不向的存储潜位置时为意义。接着Jnain跳进.rtcn"y,进行STACK和HEAP等的初始化。最后JJentry跳进应用程序的入口main().当应面程序执行完时,Jentry又将控制权交还给C库函数,函数main。在ADS中有特殊的意义。当一个程序工程工程中存在Inaino时,连接器会把Inain和_rtentry中的初始化代码连接进来:如果没有main。函数,初始化过程就不会被连接,初始化过程市些标准的C库函数失效。而用户应用程序初始化过程并未显式的完成这些堆栈初始化及数据拷贝操作,应用程序将启动不成功.2、main。为编译系统提供的个库函数,使用.main标号引导系统时必须将应用程序的入口数定义为main。;3、若希望系统进入应用程序前自动完成系统调用(如库函数的初始化、飕、ZI数据从FIaSh到RAM的拷贝(加载映像执行映像)等)的初始化过程,必须使用_main标号以跳至ADS提供的初始化函数库,这种情况般需做些库函数移植及重定向问题解决:这点上,应用程序人口必须以main函数标识:4、若所有的初始化步骤都已显式的完成(如堆栈初始化、加载映像到执行映像RW、ZI数据的拷贝等),应用程序入口函数XXXXO可以任意定义GEmain,这样可以防止自动链接上_main,从而跳过_main),初始化完成后直接BXXXX即可,这一点上,main。函数并不具有特殊性:5、若必须的初始化步骤都未显示的完成,一意孤行的BXXXX,程序运行的结果将不可预料。一个典里的例子是:若用户并未显示完成加载映像-执行映像的数据初始化而直接BXXXX,则应用程序中所有的全局变量并不会被预期的初始化,而所仃的Z1.变量也不会被预期的清零;6、本人在调试1.PC22941.CD模块时才认识到上述第五点(5、)的重要性:程序指令潦并没有错,但1.CD上显示的全部是乱码。我用两种方法解决了这bug:(1)将所有的字库数据定义为ConSt常量,程序运行正确:(2)将BMain修改成BInain接着将应用入口改为inimain(VOid)而非iniMain(VOid),程序也得到正确的执行;Initia1.izingmemoryrequiredbyCcodeTheinitia1.va1.uesforanyinitia1.izedvariab1.es(RW)mustbecopiedfromROMtoRAM.A1.1otherZIvariab1.esmustbeinitia1.izedtozero.The1ibraryinitia1.izationcodeca1.1.edatmainPerfOnnSthecopyingandinitia1.ization.UsingthemainfunctionWhentheco<npiIercompi1.esafunctionca1.1.edmain(),itgeneratesareferencetothesymbo1._maintoforcethe1inkertoinc1.udethebasicCrun-timesystemfromtheANSIC1ibrary.(Thesymbo1.mainismarkedasanentrypoint.)建议和我一样的初学者还是乖乖的B_main接着将应用入口设置为main。函数的好。ARM编程:SCatter文件的编写、分析转SCatter根本点:1 .编译后输出的映像文件中各段是苜尾相连的,中间没有空闲的区域,它们的先后关系是根据链接时参数的先后次序决定的arm1.inker-2 .SCattCr用于将编译后的映像文件中的特定段加载到多个分散的指定内存区域3 .有2类域region:执行域(executionregion,一般是ram区域)和加栽域UOadregion,般是rom区域)4 .加我域:就是编洋之后得到的二进制文件烧写到rotn中的这段区域,所有的代码R0、预定义变量Rk堆栈之类清不清空无关紧要的大片内存区域Z1.,都包括在其中5 .执行域:就是把加我域进行解压缩后的样子。比方:Ro没有变动还是在Rm(中,黑被移到了SRAM中,而Z1.被放置在SDRAM中6 .SCatter本身并不能对映像实现解压缩,编译器读入SCatter文件之后会根据其中的各种地址生成启动代码,实现对映像的加载,而这一段代码就是*(InROot$SeCtionS)它是_main0的一局部。这就是在汇编启动代码的最后跳转到_mainO而不是跳向Inain()的原因之一。7 .起始地址与加我域重合的执行域成为rootregion,*(InRoOt$SeCtiOnS)必须放在这个执行域中,否则链接的时候会报错。*(+R0)包含了*(InROot$SeCtionS),所以如果在rootregion中用到了*(+R0)可以不再指定*(InRootSSSections),SCatter语法:ROM1.OAD0x00000000(ROM0x00000000Ox003FFFFF(vectors,o(+R0,+FIRST)*(InRootJSSections):A1.1.1ibrarysectionsthatmustbeinarootregion*(+R0)SRAM0x00400000OXoo3FFFFF(*(+RW,+ZI)SDRAM1.0x41000000UNINIT(stack,o(+ZI);SIaCk.s中定义了topofSCaCk为长度为1的即ace,指定栈顶地址)SDRAM2+0UNIN1.Theap,o(+ZI)注解:1. ROM1.OAD是加载域.这里只有一个,也可以有多个(ro<n地址不连续的情况)2. ROMsSRAM.SDRAMkSDRAM2是执行域,有多个。第个执行域必须和加载域地址重合,因为ARM的空位地址就是加教域的起始地址(有bootstrap的话加载域址就是bootstrap执行完后的跳转地址)3. vectors,o(+R0,+FIRST)中断向量表放在最开头4. ROM0x000000000x003FFFFF:加载域名起始地址最大允许长度:'最大允许长度也可以省略,但缺点是编译潘不会检查段是否溢出和别的段揖福J"起始地址'=+0表示紧接者上一段开始的连续地址。5. *(InROOt$SeCtiOnS)是复制代码的代码6. UNINT关键字表示不进行初始化清零值得注意的是:在一个SCatter文件中,同一个.。文件不能出现2次,即使是在2个不同的加载域中也不可以,否则会报错:Ambiguousse1.ectorsfoundfor.o.错误的例子:1.OAD1.0x00000000(EXE1.(Init.o)1.0AD2OX1.TFFoOoO(EXE2Init.o)想起了中学里哲学课上老师让解释为什么人不能两次揩入同条河流,当年稀里糊涂的写的答案,老师批r个大差,回去有没有补上,今天居然在这里遇到r老问题.。.推测是编译器自动生成的SCa1.1.er载入代码InROO【$SeCIionS不支持把同一obj搬移2次。这就带来一个问题:如果希望把同一段代码(如中断跳转表载入2份拷贝到不同的地址,咋整?个笨方法是自己写段代码搬移程序来代替编译胧自动生成的搬移代码,但前提是需要搞懂映像文件的组织,增加工作量“投机一点的方法是在makefi1.e中把一个.o文件组制并重新起一个名字,然后把它们传递给arm1.ink。另外,猜想SCa1.Ier语法可能包含诸如+dup1.ica1.e之类的关键字来允许同一段的多个副本,懒得翻ARM手册,谙哪位知情者留言告知,谢过将程序执行到C文件的main函数我的第一个实验一一将程序执行到C文件的三in函数实验目的运用ADS编写个小程序,使程序能够从起始的汇编代码运行到C程序的main。函数(这也可称作非常简单的起动代码),并通过仿真器连接目标板,最终能够在AT91SAM7S64里.正确运行。.实验程序和参数设置1连接器的选项设设选项设置如图2-1所示。因为在AT91SAM7S64中F1.ASH存储器的地址是以OxO开始,而SRAM的地址是以OXOO200000开始,所以我将以下图中的ROBase和RWBase分别设置成了OXO和OXoo200000。其它设置请参考有关书籍。S2-1.选项设置图2启动代码在ARM应用系统中,芯片复位后,在进入C语言的main。函数前,都要执行一段启动代码。该代码一般都是用汇编册言编写,用来完成系统运行环境和应用程序的初始化,详情请参考有关书籍.由于本实验的目的很简单,就是想让程序密位后,进入main。函数,所以有些初始化代科尽量精简,留下了下述代码。另外,main是C语言的内部库函数,可以在进入用户main。之前完成内部RN1.的初始化工作,类似Kei1.C51中的StartUP.a51.当执行完一main这段代码后,再跳转到Inaino函数。AREAinit,CODE.READON1.YCODI32ModeUSREQUOx1.O;CpSR中各种处理器模式对应的控制位1BitEQU0x80;CpSR中的中断禁止位F_BitEQU0x40USR_StackEQU0x00203000;定义RM的最高地址,无重映射ENTRYOxOOResethand1.erBInitReset.(undefvec1.ndefinedInstructionBundefvec:0x04swivecSOftWareInterruptBswivec:0x08pabtvecPrefetchAbortBpabtvcc:OxOCdabtvecDataAbortB

    注意事项

    本文(ARM处理器系统初始化过程.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开