📄 vectors.s
字号:
;/*
;*********************************************************************************************************
;* 文件: Vectors.s
;* 描述: 异常向量入口及部分与异常相关的函数.
;* 编写: 深思 (001-12345@sohu.com).
;*********************************************************************************************************
;*/
IMPORT __main
IMPORT PLLInit
IMPORT SoftwareInterrupt
EXPORT __user_initial_stackheap
;/*
;*********************************************************************************************************
;* 描述: 异常向量入口, Section = startup.
;*********************************************************************************************************
;*/
AREA startup,CODE,READONLY
CODE32
ENTRY
Startup
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb8a06f58
LDR PC, IRQ_Addr
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 IRQ_Handler
FIQ_Addr DCD FIQ_Handler
;/*
;*********************************************************************************************************
;* 描述: 完成最底成的系统初始化,并切换到主函数 __main.
;*********************************************************************************************************
;*/
Reset
BL REMAPS ; 异常向量入口映射,实现 RAM 异常调试.
BL InitStack ; 初始化堆栈.
BL PLLInit ; 设置 PLL. VPB. MAM. 等功能器件.
B __main ; 完成 main 函数前的其它系统初始化.
;/*
;*********************************************************************************************************
;* 描述: 未定义指令, 证明程序中有错误存在.
;*********************************************************************************************************
;*/
Undefined
B .
;/*
;*********************************************************************************************************
;* 描述: 取指令中止.
;*********************************************************************************************************
;*/
PrefetchAbort
B .
;/*
;*********************************************************************************************************
;* 描述: 取数据中止.
;*********************************************************************************************************
;*/
DataAbort
B .
;/*
;*********************************************************************************************************
;* 函数: IRQ_Handler.
;* 描述: IRQ 中断入口函数, 具体 IRQ 中断服务功能函数在相应服务函数中实现(参考 OSTickISR 函数).
;*********************************************************************************************************
;*/
IMPORT OSTCBCur ; 指向当前任务TCB的指针
IMPORT OSTCBHighRdy ; 指向将要运行的任务TCB的指针
IMPORT OSIntCtxSw2 ; 中断级任务切换函数.
VICVectAddr EQU 0xFFFFF030 ; IRQ 中断向量地址.
IRQ_Handler
SUB LR, LR, #4 ; 计算返回地址.
STMFD SP!, {R0-R12, LR}
LDR LR, =IRQ_Handler01 ; 设置服务程序返回地址.
LDR R0, =VICVectAddr
LDR PC, [R0] ; IRQ 中断矢量跳转至服务程序.
IRQ_Handler01
LDR R0, =OSTCBHighRdy ; 判断是否需要切换任务.
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
LDMEQFD SP!, {R0-R12, PC}^ ; 不进行任务切换.
LDMFD SP!, {R0-R12, LR}
LDR PC, =OSIntCtxSw2 ; 进行中断级任务切换.
;/*
;*********************************************************************************************************
;* 函数: FIQ_Handler.
;* 描述: FIQ 中断入口函数, 具体 FIQ 中断服务功能函数在 FIQ.C 中实现.
;* 主意: FIQ 中断不受系统控制,所以不能调用系统服务函数.
;*********************************************************************************************************
;*/
IMPORT FIQ_ISR ; 快速中断异常处理程序
FIQ_Handler
SUB LR, LR, #4 ; 计算返回地址.
STMFD SP!, {R0-R7, LR}
BL FIQ_ISR
LDMFD SP!, {R0-R7, PC}^
;/*
;*********************************************************************************************************
;* 函数: REMAPS.
;* 描述: 异常向量地址映射到 RAM 的 0x4000 0000 处.
;*********************************************************************************************************
;*/
MEMMAP EQU 0xE01FC040 ; REMAP控制寄存器.
REMAPS
MOV R2, #0x40000000 ; 复制中断向量代码,设置目标地址.
LDR R1, =Startup ; 设置源地址.
LDMIA R1!, {R3-R10} ; 共复制16个字(64字节).
STMIA R2!, {R3-R10}
LDMIA R1!, {R3-R10}
STMIA R2!, {R3-R10}
LDR R2, =MEMMAP ; REMAP操作.
MOV R1, #0x02
STR R1, [R2]
MOV PC, LR
;/*
;*********************************************************************************************************
;* 描述: 认真分配各种模式的堆栈大小,避免溢出.
;*********************************************************************************************************
;*/
FIQ_Stack_Legth EQU 0 ; 快速中断模式堆栈空间.
IRQ_Stack_Legth EQU 100 ; 中断模式堆栈空间.
ABT_Stack_Legth EQU 0 ; 中止义模式堆栈空间.
UND_Stack_Legth EQU 0 ; 未定义模式堆栈
SVC_Stack_Legth EQU 100 ; 系统模式堆栈的大小.
USR_Stack_Legth EQU 64 ; 用户模式堆栈的大小(可以与其它模式堆栈共用).
;/*
;*********************************************************************************************************
;* 描述: 申请 RAM 空间.
;*********************************************************************************************************
;*/
AREA MyStacks, DATA, NOINIT, ALIGN=2
FiqStackSpace SPACE FIQ_Stack_Legth*4
IrqStackSpace SPACE IRQ_Stack_Legth*4
AbtStackSpace SPACE ABT_Stack_Legth*4
UndStackSpace SPACE UND_Stack_Legth*4
SvcStackSpace SPACE SVC_Stack_Legth*4
UsrStackSpace SPACE USR_Stack_Legth*4
bottom_of_heap SPACE 256 ; 库函数的堆空间
;/*
;**********************************************************************************************************
;* 函数: InitStack.
;* 功能: 初始化堆栈, 退出后将在 User 模式.
;**********************************************************************************************************
;*/
AREA InitStack1,CODE,READONLY
CODE32
InitStack
MOV R0, LR
LDR SP, SvcStack ; 设置管理模式堆栈.
MSR CPSR_c, #0x0d2 ; 设置中断模式堆栈.
LDR SP, IrqStack
MSR CPSR_c, #0x0d1 ; 设置快速中断模式堆栈.
LDR SP, FiqStack
MSR CPSR_c, #0x0d7 ; 设置中止模式堆栈.
LDR SP, AbtStack
MSR CPSR_c, #0x0db ; 设置未定义模式堆栈.
LDR SP, UndStack
MSR CPSR_c, #0x0d0 ; 设置用户/系统模式堆栈.
LDR SP, UsrStack
MOV PC, R0
;/*
;*******************************************************************************************************
;* 函数: __user_initial_stackheap.
;* 功能: 库函数初始化堆和栈,不能删除.
;*******************************************************************************************************
;*/
__user_initial_stackheap
LDR R0, =bottom_of_heap
MOV PC, LR
;/*
;*******************************************************************************************************
;* 功能: 文字池.
;*******************************************************************************************************
;*/
FiqStack DCD FiqStackSpace + FIQ_Stack_Legth*4-4
IrqStack DCD IrqStackSpace + IRQ_Stack_Legth*4-4
AbtStack DCD AbtStackSpace + ABT_Stack_Legth*4-4
UndStack DCD UndStackSpace + UND_Stack_Legth*4-4
SvcStack DCD SvcStackSpace + SVC_Stack_Legth*4-4
UsrStack DCD UsrStackSpace + USR_Stack_Legth*4-4
;/*
;*********************************************************************************************************
END
;*********************************************************************************************************
;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -