|
启动代码的设计
启动代码类似于电脑中的BIOS,它从系统上电开始接管CPU,依次需要负责初始化 CPU在各种模式下的堆栈空间、设定CPU的内存映射、对系统的各种控制寄存器做初始化、对CPU的外部存储器进行初始化、设定各外围设备的基地址、创建正确的中断向量表、为C代码执行创建ZI(零创建)区,然后进入到C代码。 在C代码中继续对时钟、RS232端口进行初始化,然后打开系统中断允许位。进入到应用代码中执行,执行期间响应各种不同的中断信号并调用预先设置好的中断服务程序处理这些中断。整个过程的流程图如图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字节)的起始地址。按这种方式设置其它模式下的堆栈。
DRAM的初始化根据系统配置信息来决定,因为系统不一定会用到DRAM,但是一定要做SDRAM的初始化。主要的处理内容是ROM和RAM基址的设定、数据总线的宽度、SDRAM的刷新时间等等,这些可以参照S3C4510B芯片的用户手册。特殊寄存器的设置主要是针对I/O口,比方说设定几个I/O位用做系统状态指示灯LED。寄存器的设定主要根据硬件的配置情况而定,值得注意的是由于这段启动代码是烧录到ROM中的,而中断向量必须位于零地址,所以在存储单元没有重新映射之前ROM基址的设定应该为零地址。
拷贝(image)主要是为了提高运行速度,编译生成的映像文件代码从ROM内拷贝到RAM中去,而程序的执行也就在RAM中。当然,启动代码对运行速度的要求不是很严格,所以这个拷贝动作可以不用做,让代码存放在ROM中,代码的执行也在ROM中,而运行中所需要的数据在RAM中。
内存的初始化是为C代码的运行开辟内存区,代码编译后会分为三个区:只读区、可读可写区,
|
系统重新映射当你为了提高运行速度而把ROM的Image拷贝到RAM后,中断向量表就不是在零地址处,因此要重新映射存储单元,把RAM的地址重新设定为零地址。映射就是把启动代码从ROM(EEPROM或者Flash)拷贝到SDRAM运行,同时再拷贝完毕以后进行内存的重新映射,把SDRAM映射到原来的ROM地址(0x0000)中,这样就可以用SDRAM中的代码写Flash,使得程序代码得以更新。但是需要注意的是,如果程序进行了映射,这样就对在线调试带来了困难,使得在线调试不可以在RAM中进行(如果写入EEPROM的代码是映射了的,则在调试器启动的时候必然也会对程序进行映射,使得程序在调试器中不可以定位到原来的地方,使得调试失败)。一个折中的方法是,不进行映射,就是说在调试的代码中不可以使用,这样就可以像普通的代码一样进行调试了。
结 语
做完这些初始化后,让CPU切换到用户模式下,并把堆栈指针SP指定到用户堆栈区,就可以进入到C代码区运行。在C代码中继续对时钟、RS232端口进行初始化,然后打开系统中断允许位,进入到应用代码中执行。此程序加载到处S3C4510B中经过调试,CPU可以正常启动,能够对中断请求做出及时的响应,上层应用的主代码可以加载到Flash中,移植实时操作系统RTXC后对多任务的调度控制正常。
参考文献:
1. Steve Furber, ‘ARMSoC体系结构’.北京航空航天大学出版社,2002.
2. 马忠梅, ‘ARM嵌入式处理器结构与应用基础’, 北京航空航天大学出版社,2003.
3. 李驹光, ‘ARM应用系统开发详解—基于S3C4510B的系统设计’, 清华大学出版社,2003.
4. RISC datasheet https://www.dzsc.com/datasheet/RISC_1189725.html.
5. RS232 datasheet https://www.dzsc.com/datasheet/RS232_585128.html.
6. ROM datasheet https://www.dzsc.com/datasheet/ROM_1188413.html.
7. S3C4510B datasheet https://www.dzsc.com/datasheet/S3C4510B_589499.html.
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。