⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vectors.s

📁 嵌入式操作系统 arm-ucos2041
💻 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 + -