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

📄 vectors.s

📁 单片机C语言参考程序
💻 S
字号:
;*********************************************************************************************************
;**                                            Small RTOS 51 
;**                                   The Real-Time Kernel For Keil c51
;**
;**                                  (c) Copyright 2002-2003, chenmingji
;**                                           All Rights Reserved
;**
;**                                                  V1.20.0
;**
;**
;**--------------------文件信息---------------------------------------------------------------------------
;**文   件   名: OS_CPU_A.ASM
;**创   建   人: 陈明计
;**版        本: V1.20.0
;**最后修改日期:  2003年8月17日
;**描       述:  Small RTOS与CPU(LPC2104/LPC2105/LPC2106)相关的汇编程序
;**---------------------历史版本信息----------------------------------------------------------------------
;** 修改人: 陈明计
;** 版  本: V1.20.0
;** 日 期: 2003年8月17日
;** 描 述: 原始版本
;**---------------------当前版本修订-----------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

;定义堆栈的大小,根据需要改变
USR_STACK_LEGTH     EQU         32
FIQ_STACK_LEGTH     EQU         0
IRQ_STACK_LEGTH     EQU         64
ABT_STACK_LEGTH     EQU         0
UND_STACK_LEGTH     EQU         0
NoInt       EQU 0x80


;引入的外部标号在这声明
        IMPORT  FIQ_Exception                   ;快速中断异常处理程序
        IMPORT  SoftwareInterrupt               ;软中断入口
        IMPORT  Reset                           ;复位向量入口
        IMPORT  OSIntCtxSw                      ;中断中任务切换函数
        IMPORT  OSIntExit                       ;中断退出函数
        IMPORT  OSTaskID                        ;当前任务的优先级
        IMPORT  OSNextTaskID                    ;将要运行的任务的优先级
  
        IMPORT  OSIntNesting                    ;中断嵌套计数器


;给外部使用的标号在这声明,InitStack是必须的
        EXPORT  InitStack                       
        EXPORT  Vectors


    CODE32

    AREA    StartUp,CODE,READONLY

    ENTRY
;中断向量表
Vectors
        LDR     PC, ResetAddr
        LDR     PC, UndefinedAddr
        LDR     PC, SWI_Addr
        LDR     PC, PrefetchAddr
        LDR     PC, DataAbortAddr
        DCD     0xb9205f80
        LDR     PC, [PC, #-0xff0]
        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


    MACRO
$IRQ_Label HANDLER $IRQ_Exception

        EXPORT  $IRQ_Label                      ; 输出的标号
        IMPORT  $IRQ_Exception                  ; 引用的外部标号

$IRQ_Label
        SUB     LR, LR, #4                      ; 计算返回地址
        STMFD   SP!, {R0-R3, R12, LR}           ; 保存任务环境
        MRS     R3, SPSR                        ; 保存状态
        STMFD   SP!, {R3}

        LDR     R2,  =OSIntNesting              ; OSIntNesting++
        LDRB    R1, [R2]
        ADD     R1, R1, #1
        STRB    R1, [R2]
        
        BL      $IRQ_Exception                  ; 调用c语言的中断处理程序

        BL      OSIntExit

        CMP     R0, #0
        
        LDMFD   SP!, {R3}
        MSR     SPSR_cxsf, R3

        LDMEQFD SP!, {R0-R3, R12, PC}^          ; 不进行任务切换
        LDR     PC, =OSIntCtxSw                 ; 进行任务切换
    MEND

;未定义指令
Undefined
        b       Undefined

;取指令中止
PrefetchAbort
        b       PrefetchAbort

;取数据中止
DataAbort
        b       DataAbort

;中断
IRQ_Handler	HANDLER IRQ_Exception

;快速中断
FIQ_Handler
        STMFD   SP!, {R0-R3, LR}
        BL      FIQ_Exception
        LDMFD   SP!, {R0-R3, LR}
        SUBS    PC,  LR,  #4

;定时器0中断
Timer0_Handler  HANDLER Timer0

;/*********************************************************************************************************
;** 函数名称: InitStack
;** 功能描述: 初始化堆栈
;** 输 入:   无
;** 输 出 :  无
;** 全局变量: 无
;** 调用模块: 无
;** 
;** 作 者: 陈明计
;** 日 期: 2003年8月17日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 
;** 日 期: 
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
InitStack    
        MOV     R0, LR
;设置中断模式堆栈
        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, #0x9f
        LDR     SP, StackUsr
        MOV     PC, R0


StackUsr           DCD     (UsrStackSpace + USR_STACK_LEGTH * 4 - 4)
StackIrq           DCD     (IrqStackSpace + IRQ_STACK_LEGTH * 4 - 4)
StackFiq           DCD     (FiqStackSpace + FIQ_STACK_LEGTH * 4 - 4)
StackAbt           DCD     (AbtStackSpace + ABT_STACK_LEGTH * 4 - 4)
StackUnd           DCD     (UndtStackSpace + UND_STACK_LEGTH * 4 - 4)

;/* 分配堆栈空间 */
        AREA    MyStacks, DATA, NOINIT
UsrStackSpace      SPACE   USR_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  ;未定义模式堆栈




    END
;/*********************************************************************************************************
;**                            End Of File
;********************************************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -