在ARM7系统开发中,这个boot文件都是用汇编写的,用ARM标准汇编指令集,是最底层的硬件相关的东西,编写这个文件之前,要对板上的硬件资源相当了解,特别是CPU的datasheet,还要了解需要你需要哪些功能,再按需设置硬件的初始化。譬如,要用COM口监视程序的运行情况,那么肯定要先配置好COM口的初始化。
系统加电或复位后,所有的 CPU 通常都从某个由 CPU 制造商预先安排的地址上取指令。基于 ARM7TDMI core 的CPU在复位时通常都从地址 0x00000000 取它的第一条指令。而基于 CPU 构建的嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被映射到这个预先安排的地址上。因此在系统加电后,CPU 将首先执行 Boot程序。 LPC2142处理器内集成了一个64k大小的FLASH,用来放置程序。
本人参考了别人的一些boot程序,自己写了一个boot loader,并在自己的LPC2142的板子上成功的跑了uC/OS-II操作系统,如下:
;LPC2142 BOOT LOADER
;定义堆栈的大小
FIQ_STACK_LEGTH EQU 0 ;屏蔽快速中断;
IRQ_STACK_LEGTH EQU 9*8 ;每层嵌套需要9个字堆栈,允许8层嵌套;
ABT_STACK_LEGTH EQU 0 ;异常中断屏蔽;
UND_STACK_LEGTH EQU 0 ;为定义指令中断屏蔽;
NoInt EQU 0x80 ;中断禁止宏定义,被用在CPU的CSPR寄存器,即CPU程序状态寄存器;
USR32Mode EQU 0x10 ;ARM中的用户模式;
SVC32Mode EQU 0x13 ;管理模式
SYS32Mode EQU 0x1f ;系统模式
IRQ32Mode EQU 0x12 ;中断模式;
FIQ32Mode EQU 0x11 ;快速中断模式;ARM7共7种模式,但是我只用到这几种.
IMPORT __use_no_semihosting_swi ;编译器相关的函数或者变量的导入,必须这样做,否则编译器不认识;
;The imported labels
;引入的外部标号在这声明
IMPORT FIQ_Exception ; 快速中断异常处理程序
IMPORT __main ;C语言主程序入口;当boot运行完后,再进入main,开始导入操作
;系统和用户任务程序;
IMPORT TargetResetInit ;目标板基本初始化;把所有的硬件初始化封装在这个函数中;
IMPORT SoftwareInterrupt ;软中断;因为必须为操作系统提供一个软中断函数,便于任务切换;
;The emported labels
;给外部使用的标号在这声明
EXPORT bottom_of_heap
EXPORT StackUsr
EXPORT Reset
EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY
ENTRY
;interrupt vectors
;中断向量表
Reset
LDR PC, ResetAddr ;中断向量表从地址0x00000000开始放,因为CPU复位就会从此地址开始执行
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
;未定义指令
Undefined
B Undefined
;取指令中止
PrefetchAbort
B PrefetchAbort
;取数据中止
DataAbort
B DataAbort
;快速中断
FIQ_Handler
STMFD SP!, {R0-R3, LR}
BL FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
;/*********************************************************************************************************
;** unction name 函数名称: InitStack
;** Descriptions 功能描述: Initialize the stacks 初始化堆栈
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack
MOV R0, LR
;Build the IRQ stack
;设置中断模式堆栈
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;Build the FIQ stack
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;Build the DATAABORT stack
;设置中止模式堆栈
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;Build the UDF stack
;设置未定义模式堆栈
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;Build the SYS stack
;设置系统模式堆栈
MSR CPSR_c, #0xdf
LDR SP, =StackUsr
MOV PC, R0
;/*********************************************************************************************************
;** unction name 函数名称: ResetInit
;** Descriptions 功能描述: RESET 复位入口
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ResetInit
BL InitStack ; Initialize the stack 初始化堆栈
BL TargetResetInit ; Initialize the target board 目标板基本初始化
; Jump to the entry point of C program 跳转到c语言入口
B __main
;/*********************************************************************************************************
;** unction name 函数名称: __user_initial_stackheap
;** Descriptions 功能描述: Initial the function library stacks and heaps, can not deleted! 库函数初始化堆和栈,不能删除
;** input parameters 输 入: reference by function library 参考库函数手册
;** Returned value 输 出 : reference by function library 参考库函数手册
;** Used global variables 全局变量: None 无
;** Calling modules 调用模块: None 无
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
; LDR r1,=StackUsr
MOV pc,lr
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4
;/*********************************************************************************************************
;** unction name 函数名称: CrpData
;** Descriptions 功能描述: encrypt the chip
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
IF :DEF: EN_CRP
IF . >= 0x1fc
INFO 1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."
ENDIF
CrpData
WHILE . < 0x1fc
NOP
WEND
CrpData1
DCD 0x87654321 ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */
ENDIF
;/* 分配堆栈空间 */
AREA MyStacks, DATA, NOINIT, ALIGN="2"
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中断模式堆栈空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中断模式堆栈空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止义模式堆栈空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定义模式堆栈
AREA Heap, DATA, NOINIT
bottom_of_heap SPACE 1
AREA Stacks, DATA, NOINIT
StackUsr
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
文章评论(0条评论)
登录后参与讨论