- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
BootLoader简介 BOOT的一般步骤为: 设置中断向量表 初始化存储设备 初始化堆栈 初始化用户执行环境 呼叫主应用程序 设置中断向量表 ARM要求中断向量表必须放置在从0地址开始,连续8X4字节的空间内。 每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中1个字的存储空间,只能放置一条ARM指令,使程序跳转到存储器的其他地方,再执行中断处理。 设置中断向量表 中断向量表的程序实现通常如下表示: AREA Boot ,CODE, READONLY ENTRY B??? ResetHandler B??? UndefHandler B??? SWIHandler B??? PreAbortHandler B??? DataAbortHandler B B?? ?IRQHandler B??? FIQHandler 其中关键字ENTRY是指定编译器保留这段代码,因为编译器可能会认为这是一段亢余代码而加以优化。链接的时候要确保这段代码被链接在0地址处,并且作为整个程序的入口。? 初始化存储设备 存储器端口的接口时序优化是非常重要的,这会影响到整个系统的性能。因为一般系统运行的速度瓶颈都存在于存储器访问,所以存储器访问时序应尽可能的快;而同时又要考虑到由此带来的稳定性问题。 在不同的板子上处理芯片、存储设备以及其接口差异很大,应根据不同的情况来配置。 初始化堆栈 因为ARM有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的。因此,对程序中需要用到的每一种模式都要给SP定义一个堆栈地址。方法是改变状态寄存器内的状态位,使处理器切换到不同的状态,然后给SP赋值。注意:不要切换到User模式进行User模式的堆栈设置,因为进入User模式后就不能再操作CPSR回到别的模式了,可能会对接下去的程序执行造成影响。 初始化堆栈 这是一段堆栈初始化的代码示例: mrs r0,cpsr ;读取cpsr寄存器的值 bic r0,r0,#MODEMASK ;把模式位清零 orr r1,r0,#UNDEFMODE|NOINT msr cpsr_cxsf,r1 ;UndefMode ldr sp,=UndefStack 其他模式的堆栈的初始化也类似。 初始化堆栈 堆栈地址的定义一般如下: ^ (_ISR_STARTADDRESS-0x1400) UserStack # 1024 ;#=field,定义一个数据域,长度为1024 SVCStack # 1024 UndefStack # 1024 AbortStack # 1024 IRQStack # 1024 FIQStack # 0 初始化用户执行环境 一个ARM映像文件由RO,RW和ZI三个段组成,其中RO为代码段,RW是已初始化的全局变量,ZI是未初始化的全局变量。 映像一开始总是存储在ROM/Flash里面的,其RO部分即可以在ROM/Flash里面执行,也可以转移到速度更快的RAM中执行;而RW和ZI这两部分是必须转移到可写的RAM里去。所谓应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零。 初始化用户执行环境 编译器使用下列符号来记录各段的起始和结束地址: |Image$$RO$$Base| :RO段起始地址 |Image$$RO$$Limit| :RO段结束地址加1 |Image$$RW$$Base| :RW段起始地址 |Image$$RW$$Limit| :ZI段结束地址加1 |Image$$ZI$$Base| :ZI段起始地址 |Image$$ZI$$Limit| :ZI段结束地址加1 这些标号的值是根据链接器中设置的中ro-base和rw-base的设置来计算的。 初始化用户执行环境 初始化用户执行环境主要是把RO、RW、ZI三段拷贝到指定的位置。 具体的程序 LDR??? r0,=|Image$$RO$$Limit| ???? ;得到RW数据源的起始地址LDR??? r1,=|Image$$RW$$Base| ???? ;RW区在RAM里的执行区起始地址LDR??? r2,=|Image$$ZI$$Base|? ????? ;ZI区在RAM里面的起始地址CMP??? r0,r1???????????????? ???? ;比较它们是否相等????? BEQ??? %F10???? CMP??? r1,r3????? LDRCC? r2,[r0],#4????? STRCC? r2,[r1],#4????? BCC??? %B01???? LDR??? r1,=|Image$$ZI
文档评论(0)