<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
启动代码是芯片复位后进入C语言的main()函数前执行的一段代码,主要为运行C语言程序提供基本运行环境。启动代码可划分为四个文件:startup.s、stack.s、heap.s、target.c。其中startup.s包含异常向量表和系统初始化代码,stack.s和heap.s保存C语言使用的堆和栈的开始位置,target.c包括异常处理程序和目标板特殊的代码。
1、异常向量表(代码位于startup.s中,无需修改)
异常是有内部或外部源产生的,以引起处理器处理的一个事件,异常出现后,CPU强制从异常类型对应的固定存储地址开始执行程序。这个固定的地址称为异常向量。如当IRQ中断产生后,CPU强制跳转到0x00000018处执行代码,我们要做的就是在这个代码地址处编写相应的指令,让它顺利执行IRQ中断程序.通常我们会在这里放置一条转移指令,因为0x00000018只给你一个字的编程空间.
异常向量表代码如下:
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />9205f80
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
2、系统初始化代码(代码位于startup.s中,无需修改)
ResetInit
BL InitStack ;初始化堆栈
BL TargetResetInit ;目标板基本初始化
B __main ;跳转到c语言入口
当系统复位后,程序跳转到0x00000000处执行指令,那么就执行 LDR PC, ResetAddr,及执行ResetInit地址处的代码,这里放置了BL InitStack指令,负责初始化各种模式的堆栈,接着执行BL TargetResetInit ,完成目标板基本初始化,最后跳转到ADS提供的启动代码__main,它初始化库并最终引导CPU进入main函数.
3、初始化CPU堆栈(代码位于startup.s中,一般不需要修改)
InitStack
MOV R0, LR
;设置管理模式堆栈
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;设置中断模式堆栈
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;设置快速中断模式堆栈
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;设置中止模式堆栈
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;设置未定义模式堆栈
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;设置系统模式堆栈
MSR CPSR_c, #0xdf
LDR SP, =StackUsr
MOV PC, R0
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
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
AREA MyStacks, DATA, NOINIT, ALIGN="2"
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆栈空间
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ; 中断模式堆栈空间
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ; 快速中断模式堆栈空间
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ; 中止义模式堆栈空间
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ; 未定义模式堆栈
因为程序需要切换模式,而且程序退出时CPU的模式已经不再是管理模式而是系统模式,LR已经不再保存返回程序地址,所以程序首先把返回地址保持到R0中,同时使用R0返回。然后程序把处理器模式转化为管理模式,并设置管理模式的堆栈指针。其中变量StackSvc保存着管理模式的堆栈指针的初始值,SvcStackSpace是分配给管理模式的堆栈空间的开始地址,而SVC_STACK_LEGTH是用户定义的常量,用于设置管理模式的堆栈空间的大小,其代码在文件startup.s的开始处,用户可以根据需要改变它。程序使用同样的方法对其他模式进行设置。
4、系统基本的初始化工作(代码位于target.c中,用户根据需要修改)
为了使系统能够工作,必须在进入main()函数前进行一些基本的初始化工作,如地址重映射,PLL时钟初始化,存储器加速模块初始化,VIC中断初始化等,这些工作由函数TargetResetInit()完成。
用户35824 2008-3-26 10:08
用户944075 2008-3-24 21:42
用户17735 2008-3-24 17:39
用户944075 2008-3-10 19:26
用户1370329 2008-3-10 13:17