|
楼主 |
发表于 2010-1-29 13:54:08
|
显示全部楼层
2.2 Bootload(启动代码board_cstartup_iar.s)
一般而言,一个ARM的bootload必须要完成以下部分的初始化:定义入口点、设置中断/异常向量、初始化存储系统(如果需要,进行代码的搬移)、初始化堆栈、初始化I/O设备、初始化中断中用到的变量、开中断、必要时改变处理器的模式和处理器的状态、初始化C程序中用到的存储区、引导处理器进入C程序。
事实上在IAR的例程中已经有了bootload的简单过程,完全可以满足单片机开发的要求,至于像uboot、at91bootstrap等专门的bootloader程序,可能是针对嵌入式开发、用于引导一个操作系统的,会更复杂一些。
例程中的bootloader(board_cstartup_iar.s)主要就是如下代码:
SECTION .cstartup:CODE:NOROOT(2)
PUBLIC resetHandler
EXTERN LowLevelInit
EXTERN ?main
REQUIRE resetVector
ARM
//程序入口,上电后CPU检测到norflash起始处有合法中断向量表后从这里开始运行
resetHandler:
/* Set pc to actual code location (i.e. not in remap zone) */
LDR pc, =label
/* Perform low-level initialization of the chip using LowLevelInit() */
label:
//跳转到LowLevelInit()函数,进行底层初始化。
LDR r0, =LowLevelInit
LDR r4, =SFE(CSTACK)
MOV sp, r4
MOV lr, pc
BX r0
//初始化堆栈
/* Set up the interrupt stack pointer. */
MSR cpsr_c, #ARM_MODE_IRQ | I_BIT | F_BIT ; Change the mode
LDR sp, =SFE(IRQ_STACK)
/* Set up the SVC stack pointer. */
MSR cpsr_c, #ARM_MODE_SVC | F_BIT ; Change the mode
LDR sp, =SFE(CSTACK)
//bootload完成,跳转到主函数
/* Branch to main() */
LDR r0, =?main
MOV lr, pc
BX r0
/* Loop indefinitely when program is finished */
loop4:
B loop4
END
这段汇编语言不用修改, 这里面的容易出问题的地方在LowLevelInit,而且启动代码基本不能用断点调试(仿真器容易出错,而且可能干扰程序执行),所以详细讲一下。
LowLevelInit主要实现底层初始化,包括: |
|