- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
基于ARM内核微处理器的系统一般为复杂的片上系统,这种复杂系统的多数硬件模块都是可配置的,需要软件设置为特定的工作状态,因此在用户的应用程序之前,需要有一些专门的代码完成对系统的初始化。由于这类代码直接面对ARM处理器内核和硬件控制器,一般都使用汇编语言完成。初始化代码完成的操作与具有的硬件平台相关,但一般包括一下的内容:
--初始化异常向量表(中断向量表)
--初始化存储器系统
--初始化堆栈
--初始化有特殊要求的端口和设备
--初始化应用程序的运行环境
--调用主应用程序
1、初始化异常向量表(中断向量表)
??? ARM微处理器结构要求中断向量表必须放置在从0x00地址开始的连续8×4字节的空间内,每当一个中断(异常)发生以后,ARM微处理器便强制把PC置为对应的中断向量。由于每个中断只占用向量表中一个字(4个字节)的存储空间,只能放一条ARM指令,所以通常为跳转指令,使程序从向量表跳转到存储器的其他位置,执行真正的中断处理。
具体代码实现如下:
AREA Init,CODE,READONLY
ENTRY
B?? Reset_Handler????? //异常复位
B?? Undef_Handler????? 未定义指令异常
B?? SWI_Handler??????? 软件中断
B?? PreAbort_Handler?? 指令预取中止
B?? DataAbord_Handler 数据中止
B?? .????????????????? 系统保留
B?? IRQ_Handler??????? 普通外部中断
B?? FIQ_Handler??????? 快速外部中断
..........
2、初始化存储器系统
??? 主要是对系统存储器控制器(MMU)的初始化。由于存储器控制器并不是ARM架构的一部分,不同芯片的实现方式各不相同。由于运算能力和寻址能力的强大,基于ARM内核的微处理器系统一般都需要外扩展各种类型的存储器。对于存储器系统的初始化一般包括如下几个方面:
--存储器类型、时序和总线宽度的配置
--存储器地址的配置
(1)存储器类型
??? 基于ARM微处理系统的存储器一般有如下几类:SARM,DRAM,Flah,同时,即使同类存储器也有访问速度上的不同。其中,SRAM和Flah属于静态存储器,可以共用存储器端口,而DRAM有动态刷新和地址复用等特征,需要专门的存储器端口。
(2)时序
??? 存储器端口的接口时序优化对系统性能影响非常大,因为系统运行的速度瓶颈一般都存在于存储器的访问,因此希望存储器的访问尽可能快,但又要考虑由此带来的系统稳定性问题。
(3)总线宽度
??? ARM微处理器架构支持8/16/32位的数据总线宽度访问存储器和外设,对于特定的存储器来说,需要设定数据总线的宽度。
(4)存储器地址的配置
??? ARM微处理器架构理论上可以支持4GB的地址空间,而对于一个实际的系统来说,配置的物理地址远没有这么多,因此,如何配置存储器的地址,也是一个重要的问题。
(5)存储器地址重映射
??? 存储器地址重映射就是可以通过软件配置来改变一块存储器物理地址的方法,是当前许多先进控制器所具有的功能。
进行地址重映射的原因:提高系统的运行效率。
进行地址重映射的注意:保证程序流程的连续性。
有的ARM处理器不具有地址重映射的功能,可以采样代码搬移加跳转的方式完成上述功能。
3、初始化堆栈
??? 由于ARM微处理器有7中运行模式,每一种模式的堆栈指针(SP)都是独立的(其中系统模式和用户模式使用相同的SP)。因此,需要对每一种模式的SP进行初始化。
??? 采用的方法是:改变当前程序状态寄存器(CPSR)内的状态位,使处理器切换到不同的状态,然后初始化SP。但是对用户模式下SP的初始化应该放在最后,因为ARM微处理器进入用户模式之后就无法再切换到其他模式。
??? 设置堆栈应该注意的问题是:堆栈的大小根据需要确定,要尽可能给堆栈分配高速存储器(例如片内的SRAM)。堆栈性能的提高对提高系统整体性能的影响非常显著。
初始化堆栈的代码如下:
MRS?? R0, CPSR
BIC?? R0, R0, #MODEMASK
ORR?? R1, R0, #IRQMODE
MSR?? CPSR_c, R1
LDR?? SP, =IRQStack
BIC?? R0, R0, #MODEMASK
ORR?? R1, R0, #FIQMODE
MSR?? CPSR_c, R1
LDR?? SP, =FIQStack
.........
4、初始化应用程序和有特殊要求的端口和设备
??? 该部分的初始化由具体的系统和用户需求决定,一般的外设初始化可以放在系统初始化以后进行。比较典型的应用是驱动一些简单的输出设备,例如LED等,
文档评论(0)