这是我自己写的AT91RF40162的启动代码,望高手们看看有没有什么问题啊,头文件at91m40800_include.h 是我自己定义的一个寄存器声明的文件!
文件init.s :
EXPORT InitStack
CODE32
AREA Init_Stack,CODE,READONLY
;初始化堆栈
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
;定义堆栈的大小
USR_STACK_LEGTH EQU 64
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 16
IRQ_STACK_LEGTH EQU 64
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
StackUsr DCD UsrStackSpace+(USR_STACK_LEGTH-1)*4
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
UsrStackSpace SPACE USR_STACK_LEGTH*4 ;用户(系统)模式堆栈空间
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 ;未定义模式堆栈
;分配堆空间
AREA Myheap, DATA, NOINIT, ALIGN=2
bottom_of_heap SPACE 256 ;库函数的堆空间
END
文件 target.c :
#include "at91m40800_include.h"
extern int main(void);
//TargetInit,目标板初始化代码,在需要的地方调用,根据需要改变
void TargetInit(void)
{
//添加自己的代码
}
//TargetResetInit,调用main函数前目标板初始化代码,根据需要改变,不能删除
void TargetResetInit(void)
{
//添加自己的代码
}
//Reset,复位异常处理程序,用户根据需要自己改变程序
void Reset_Int(void)
{
//添加自己的代码
EBI_RCR |= 0x00000001;
TargetInit ();
TargetResetInit ();
main ();
}
//FIQ,快速中断异常处理程序,用户根据需要自己改变程序
void FIQ_Int(void)
{
//添加自己的代码
}
//未定义指令异常处理程序
void Undefined_Int(void)
{
//添加自己的代码
}
//软中断异常处理程序
void Software_Int(void)
{
//添加自己的代码
}
//预取指令中断异常处理程序
void PrefetchAbort_Int(void)
{
//添加自己的代码
}
//取数据中止异常处理程序
void DataAbort_Int(void)
{
//添加自己的代码
}
文件 vectors.s :
IMPORT FIQ_Int ;快速中断异常处理程序
IMPORT Reset_Int ;复位异常处理程序
IMPORT Undefined_Int ;未定义指令异常处理程序
IMPORT Software_Int ;软中断异常处理程序
IMPORT PrefetchAbort_Int ;预取指令中断异常处理程序
IMPORT DataAbort_Int ;取数据中止异常处理程序
EXPORT Vectors
CODE32
AREA Intrupt,CODE,READONLY
;中断向量表
Vectors
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC,#-&f20]
LDR PC, FIQ_Addr
ResetAddr DCD Reset
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
;复位中断
Reset
BL Reset_Int
;未定义指令
Undefined
BL Undefined_Int
;软中断
SoftwareInterrupt
BL Software_Int
;预取指令中断
PrefetchAbort
BL PrefetchAbort_Int
;取数据中止
DataAbort
BL DataAbort_Int
;快速中断
FIQ_Handler
STMFD SP!, {R0-R3, LR}
BL FIQ_Int
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
END
关键词:
大家
帮帮忙
代码
堆栈
中断
模式
STACK