arm启动代码开发

上传人:第*** 文档编号:34611524 上传时间:2018-02-26 格式:DOC 页数:3 大小:76.50KB
返回 下载 相关 举报
arm启动代码开发_第1页
第1页 / 共3页
arm启动代码开发_第2页
第2页 / 共3页
arm启动代码开发_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《arm启动代码开发》由会员分享,可在线阅读,更多相关《arm启动代码开发(3页珍藏版)》请在金锄头文库上搜索。

1、ARM 启动代码开发ARM 体系结构目前,ARM 系列的通用 32 位 RISC 微处理器有 ARM、ARM、ARM、ARM等多个产品,这些处理器可以工作于 7 种模式下。除 User 模式以外的其它模式都叫做特权模式,除 User 和 System 以外的其它 5 种模式叫做异常模式。大部分应用程序都在 User 模式下运行,当处理器处于 User 模式下时,执行的程序无法访问一些被保护的系统资源,以利于操作系统控制系统资源的使用,也不能改变模式,否则就会导致一次异常。对于 System 模式,任何异常都不会导致进入这一模式,而且它使用的寄存器和 User 模式下基本相同,主要是用于有访问系

2、统资源请求而又避免使用额外的寄存器的操作系统任务。在特权模式下,它们可以完全访问系统资源,可以自由地改变模式。在处理特定的异常时,系统进入对应的异常模式下。这 5 种异常模式都有各自额外的寄存器,用于避免在发生异常的时候与用户模式下的程序发生冲突。在任意一种处理器模式中,都使用同一个寄存器来标识当前处理器的工作模式,这个寄存器叫做 CPSR(当前程序状态寄存器),它的 04 位用来表示 CPU 模式,而且在每一种处理器异常模式下,都有一个对应的 SPSR(缓存程序状态寄存器),用来保存进入异常模式前的CPSR 的值。SPSR 的作用就是当 CPU 从异常模式退出时,通过一条简单的汇编指令就能够

3、恢复进入异常模式前的 CPSR,该值保存在当前异常模式的 SPSR 中。 启动代码的设计启动代码类似于电脑中的 BIOS,它从系统上电开始接管 CPU,依次需要负责初始化 CPU在各种模式下的堆栈空间、设定 CPU 的内存映射、对系统的各种控制寄存器做初始化、对CPU 的外部存储器进行初始化、设定各外围设备的基地址、创建正确的中断向量表、为 C代码执行创建 ZI(零创建)区,然后进入到 C 代码。 在 C 代码中继续对时钟、RS232 端口进行初始化,然后打开系统中断允许位。最后进入到应用代码中执行,执行期间响应各种不同的中断信号并调用预先设置好的中断服务程序处理这些中断。整个过程的流程图如图

4、1 所示。图 1 启动代码流程图堆栈初始化堆栈的初始化要处理的事情是为处理器的 7 个处理器模式分配堆栈空间。以下以 FIQ 模式下的堆栈设置为例说明: ORR r1, r0, #LOCKOUT | FIQ_MODE;把模式放在 r1 中,LOCKOUT 用来屏蔽中断位;MSR cpsr, r1 ;改变 CPU 的 CPSR 寄存器,进入到指定的 FIQ 模式;MSR spsr, r2 ;保存前一模式;LDR sp, =FIQ_STACK ;把 FIQ 模式下的堆栈起始值赋给当前的 SP,FIQ_STACK 是分配给 FIQ 模式堆栈空间(比如说 1K 字节)的起始地址。按这种方式设置其它模式

5、下的堆栈。DRAM 的初始化根据系统配置信息来决定,因为系统不一定会用到 DRAM,但是一定要做SDRAM 的初始化。主要的处理内容是 ROM 和 RAM 基址的设定、数据总线的宽度、SDRAM 的刷新时间等等,这些可以参照 S3C4510B 芯片的用户手册。特殊寄存器的设置主要是针对I/O 口,比方说设定几个 I/O 位用做系统状态指示灯 LED。寄存器的设定主要根据硬件的配置情况而定,值得注意的是由于这段启动代码是烧录到 ROM 中的,而中断向量必须位于零地址,所以在存储单元没有重新映射之前 ROM 基址的设定应该为零地址。拷贝(image)主要是为了提高运行速度,编译生成的映像文件代码从

6、 ROM 内拷贝到 RAM 中去,而程序的执行也就在 RAM 中。当然,启动代码对运行速度的要求不是很严格,所以这个拷贝动作可以不用做,让代码存放在 ROM 中,代码的执行也在 ROM 中,而运行中所需要的数据在 RAM 中。内存的初始化是为 C 代码的运行开辟内存区,代码编译后会分为三个区:只读区、可读可写区,零初始化区。内存的初始化处理的内容是:当只读区截止地址等于可读可写区基址时,把零初始化区各字节清零;当只读区截止地址不等于可读可写区基址时,如果可读可写区基址小于零初始化基址,就从只读区截止地址处开始把数据拷贝到可读可写区基址处,直到到达零初始化基址,然后把零初始化区各字节清零,否则也

7、只用把零初始化区各字节清零。中断向量表是用于处理异常情况的,当发生异常时,首先要保存当前程序的返回地址和CPSR 寄存器的值,然后进入到相应的异常向量地址,一般来说在异常向量地址是一个跳转指令,使程序进入相应的异常处理过程。由于中断向量表要位于系统的零地址,当把启动代码烧录到 EEPROM 中运行时就需要把 ROM 的地址定义到零地址,所以程序的入口处如下:系统重新映射当你为了提高运行速度而把 ROM 的 Image 拷贝到 RAM 后,中断向量表就不是在零地址处,因此要重新映射存储单元,把 RAM 的地址重新设定为零地址。映射就是把启动代码从 ROM(EEPROM 或者 Flash)拷贝到

8、SDRAM 运行,同时再拷贝完毕以后进行内存的重新映射,把 SDRAM 映射到原来的 ROM 地址(0x0000)中,这样就可以用 SDRAM 中的代码写Flash,使得程序代码得以更新。但是需要注意的是,如果程序进行了映射,这样就对在线调试带来了困难,使得在线调试不可以在 RAM 中进行(如果写入 EEPROM 的代码是映射了的,则在调试器启动的时候必然也会对程序进行映射,使得程序在调试器中不可以定位到原来的地方,使得调试失败)。一个折中的方法是,不进行映射,就是说在调试的代码中不可以使用下载,这样就可以像普通的代码一样进行调试了。 结 语做完这些初始化后,让 CPU 切换到用户模式下,并把堆栈指针 SP 指定到用户堆栈区,就可以进入到 C 代码区运行。在 C 代码中继续对时钟、RS232 端口进行初始化,然后打开系统中断允许位,进入到应用代码中执行。此程序加载到处 S3C4510B 中经过调试,CPU 可以正常启动,能够对中断请求做出及时的响应,上层应用的主代码可以加载到 Flash 中,移植实时操作系统 RTXC 后对多任务的调度控制正常。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号