📄 vectors.s
字号:
;/*
;*********************************************************************************************************
;* 文件: Vectors.s
;* 描述: 异常向量入口及部分与异常相关的函数.
;* 编写: 深思 (001-12345@sohu.com).
;*********************************************************************************************************
;*/
IMPORT __main
IMPORT PLLInit
IMPORT InitStack
IMPORT SoftwareInterrupt
;/*
;*********************************************************************************************************
;* 描述: 异常向量入口, 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
;/*
;*********************************************************************************************************
END
;*********************************************************************************************************
;*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -