ARM7TDMI-S在嵌入式系统中的Bootloader代码设计
的嵌入式系
统软件中需要使用CPU芯片上的哪些资源。Bootloader代码的一般流程(即Bootloader代码应该进行的操作)如图1所示。
2.3基于LPC2104和μC/OS-II是多任务的实时操作系统。针对该款芯片和多任务实时操作系统的Bootloader程序的流程如图2所示。
2.3.2关键代码分析
;中断向量表,给出了CPU芯片出现异常时应该转去执行的程序地址
Vectors
LDRPC,ResetAddr
LDRPC,UndefinedAddr
LDRPC,SWI_Addr
LDRPC,SWI_Addr
LDRPC,PrefetchAddr
LDRPC,DataAbortAddr
DCD0xb9205f80
LDRPC,[PC,#-0xff0]
LDRPC,FIQ_Addr
ResetAddrDCDReset
UndefinedAddrDCDUndefined
SWI_AddrDCDSoftwareInterrupt
PrefetchAddrDCDPrefetchAbort
DataAbortAddrDCDDataAbort
NouseDCD0
IRQ_AddrDCD0
FIQ_AddrDCDFIQ_Handler
;InitStack函数,其功能是初始化CPU各种模式的堆栈
InitSatck
MOVR0,LR;因芯片模式切换,故将程序返回地址保存至R0,同时在初始化堆栈完成后使用R0返回
MSRCPSR_c,#0xd3;设置管理模式堆栈
LDRSP,StackSvc
MSRCPSR_c,#0xd2;设置中断模式堆栈
LDRSP,StackIrq
MSRCPSR_c,#0xd1;设置快速中断模式堆栈
LDRSP,StackFiq
MSRPSR_c,#0xd7;设置中止模式堆栈
LDRSP,StackAbt
MSRCPSR_c,#0xdb;设置未定义模式堆栈
LDRSP,StackUnd
MSRCPSR_c,#0xdf;设置系统模式堆栈
LDRSP,StackUsr
MOVPC,R0
StackUsrDCDUsrStackSpace+(USR_STACK_LEGTH-1)*4
StackRvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4
StackIrqDCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4
StackFiqDCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4
StackAbtDCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4
StackUndDCDUndtStackSpace+(UND_STACK_LEGTH-1)*4
;系统初始化代码
Reset
BLInitStack;调用InitStack函数初始化芯片各种模式的堆栈
BLTargetResetInit;调用TargetResetInit函数对系统进行基本初始化
>
B_main;跳转到ADS提供的启动代码_main函数处,它初始化函数库并最终引导CPU进入操作系统的main()函数
上面的程序代码只包含了流程图中的几个主机步骤。这些步骤都是必不可少的,其余的步骤都在TargetResetInit函数中加以实现。本例中的TargerResetInit函数如下:
voidTargetResetInit(void)
{/*设置系统各部分时钟*/
PLLCON=1;
#if((Fcclk/4)/Fpclk==1
《ARM7TDMI-S在嵌入式系统中的Bootloader代码设计(第2页)》
本文链接地址:http://www.oyaya.net/fanwen/view/143340.html
统软件中需要使用CPU芯片上的哪些资源。Bootloader代码的一般流程(即Bootloader代码应该进行的操作)如图1所示。
2.3基于LPC2104和μC/OS-II是多任务的实时操作系统。针对该款芯片和多任务实时操作系统的Bootloader程序的流程如图2所示。
2.3.2关键代码分析
;中断向量表,给出了CPU芯片出现异常时应该转去执行的程序地址
Vectors
LDRPC,ResetAddr
LDRPC,UndefinedAddr
LDRPC,SWI_Addr
LDRPC,SWI_Addr
LDRPC,PrefetchAddr
LDRPC,DataAbortAddr
DCD0xb9205f80
LDRPC,[PC,#-0xff0]
LDRPC,FIQ_Addr
ResetAddrDCDReset
UndefinedAddrDCDUndefined
SWI_AddrDCDSoftwareInterrupt
PrefetchAddrDCDPrefetchAbort
DataAbortAddrDCDDataAbort
NouseDCD0
IRQ_AddrDCD0
FIQ_AddrDCDFIQ_Handler
;InitStack函数,其功能是初始化CPU各种模式的堆栈
InitSatck
MOVR0,LR;因芯片模式切换,故将程序返回地址保存至R0,同时在初始化堆栈完成后使用R0返回
MSRCPSR_c,#0xd3;设置管理模式堆栈
LDRSP,StackSvc
MSRCPSR_c,#0xd2;设置中断模式堆栈
LDRSP,StackIrq
MSRCPSR_c,#0xd1;设置快速中断模式堆栈
LDRSP,StackFiq
MSRPSR_c,#0xd7;设置中止模式堆栈
LDRSP,StackAbt
MSRCPSR_c,#0xdb;设置未定义模式堆栈
LDRSP,StackUnd
MSRCPSR_c,#0xdf;设置系统模式堆栈
LDRSP,StackUsr
MOVPC,R0
StackUsrDCDUsrStackSpace+(USR_STACK_LEGTH-1)*4
StackRvcDCDSvcStackSpace+(SVC_STACK_LEGTH-1)*4
StackIrqDCDIrqStackSpace+(IRQ_STACK_LEGTH-1)*4
StackFiqDCDFiqStackSpace+(FIQ_STACK_LEGTH-1)*4
StackAbtDCDAbtStackSpace+(ABT_STACK_LEGTH-1)*4
StackUndDCDUndtStackSpace+(UND_STACK_LEGTH-1)*4
;系统初始化代码
Reset
BLInitStack;调用InitStack函数初始化芯片各种模式的堆栈
BLTargetResetInit;调用TargetResetInit函数对系统进行基本初始化
>
B_main;跳转到ADS提供的启动代码_main函数处,它初始化函数库并最终引导CPU进入操作系统的main()函数
上面的程序代码只包含了流程图中的几个主机步骤。这些步骤都是必不可少的,其余的步骤都在TargetResetInit函数中加以实现。本例中的TargerResetInit函数如下:
voidTargetResetInit(void)
{/*设置系统各部分时钟*/
PLLCON=1;
#if((Fcclk/4)/Fpclk==1
《ARM7TDMI-S在嵌入式系统中的Bootloader代码设计(第2页)》