ARM7驱动分析
0赞1 启动代码的一般步骤
在ARM7微处理器中,要先运行启动代码,完成系统的初始化功能,才能进入主程序当中。启动代码是用汇编语言和C语言编写的一段程序,完成堆栈初始化、系统变量初始化、中断系统初始化、地址重映射、I/O初始化以及外围初始化等操作,为主程序提供运行环境,并引导程序进入C语言编写的主程序。设计时可以根据需要进行适当的删减。启动代码的大致流程如下:
1)系统变量的初始化;
2)中断向量表;
3)初始化各模式栈指针
4)系统板的初始化;
5)转到c入口地址。
2启动代码设计方案
一般来说,启动代码在startup.s,target.c,target.h 源文件中。
startup.s是系统上电后运行的第一段程序,并最终引导系统进入主程序中运行,对系统的正确引导起到重要作用,类似于PC中的BIOS。target.c源文件中是对系统板的初始化。而target.h则是配合汇编代码实现软中断。
在启动代码中,要对系统板进行初始化,而对系统板进行初始化非常复杂,要考虑到配置信息,系统板的调试状态等等,这样在汇编代码中就难以实现。所以在设计过程中汇编代码只实现了对LPC2292芯片内部系统变量的初始化,各个模式下的堆栈的初始化。其他外围的初始化函数则放在了C语言中进行编写。即target.c源文件中的TargetResetInit()函数。这样最大限度的保证了代码的可重用性;并且外围电路改变时,只需改变外围电路的初始化函数或者只改变配置文件就可以了。如果系统板上的晶振频率改变的话,可以仅仅改变配置文件config.h中的晶振频率Fosc的值,target.c文件中的TargetResetInit()函数会自动根据晶振频率Fosc和系统其它频率(如系统频率Fpclk)的比值改变对PLL锁相环的设置。
3 在LPC2292上启动代码的步骤
在本设计中,startup.s最重要,它是系统上电后运行的第一段程序,完成堆栈的初始化,内部变量的的初始化,并且调用target.c中TargetResetInit()函数进行系统板的初始化,并最终引导系统进入主程序中运行。
startup.s代码分为几个部分:
代码前32行是对堆栈大小,运行模式,以及引入外部标号,引出供外部使用的标号的定义;
CODE32
PRESERVE8
AREA RESET,CODE,READONLY
ARM
这一串代码是必须的,CODE32伪指令通知编译器,其后的指令序列是32位的ARM指令;如果是CODE16,则说明后面的指令序列是16位的Thumb指令。PRESERVE8指定汇编程序数据是8字节对齐的。AREA RESET,CODE,READONLY指定下面的代码是代码段,段名为RESET,并且只读,这里指定了程序的入口地址。再后面的ARM是指定编译器。

