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

📄 os_cpu_a.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在LPC2104/LPC2105/LPC2106上的移植代码汇编语言部分
;**---------------------历史版本信息----------------------------------------------------------------------
;** 修改人: 陈明计
;** 版  本: V1.20.0
;** 日 期: 2003年8月17日
;** 描 述: 原始版本
;**---------------------当前版本修订-----------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;定义系统模式堆栈的大小
SVC_STACK_LEGTH     EQU         32

NoInt       EQU 0x80

USR32Mode   EQU 0x10
SVC32Mode   EQU 0x13
SYS32Mode   EQU 0x1f
IRQ32Mode   EQU 0x12
FIQ32Mode   EQU 0x11

;T_bit用于检测进入异常前cpu是否处于THUMB状态
T_bit               EQU         0x20

    CODE32

    AREA    |subr|, CODE, READONLY

            IMPORT  OSTaskID                    ;当前任务的优先级
            IMPORT  OSNextTaskID                ;将要运行的任务的优先级
            IMPORT  OSTsaksStack                ;堆栈指针

            IMPORT  Os_Enter_Sum                ;关中断计数器(关中断信号量)
            IMPORT  SWI_Exception               ;软中断异常处理程序
            
            EXPORT  OSIntCtxSw                  ;中断退出时的入口,参见startup.s中的IRQ_Handler
            EXPORT  SoftwareInterrupt           ;软中断入口


;/*********************************************************************************************************
;** 函数名称: SoftwareInterrupt
;** 功能描述: 软件中断,用于提供一些系统服务,功能参考os_cpu_c.c文件
;** 输 入:   依功能而定
;** 输 出 :  依功能而定
;** 全局变量: 无
;** 调用模块: SWI_Exception
;** 
;** 作 者: 陈明计
;** 日 期: 2003年8月17日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/

;软件中断
SoftwareInterrupt
        LDR     SP, StackSvc            ; 重新设置堆栈指针
        STMFD   SP!, {R0-R3, R12, LR}
        MOV     R1, SP                  ; R1指向参数存储位置

        MRS     R3, SPSR
        TST     R3, #T_bit              ; 中断前是否是Thumb状态
        LDRNEH  R0, [LR,#-2]            ; 是: 取得Thumb状态SWI号
        BICNE   R0, R0, #0xff00
        LDREQ   R0, [LR,#-4]            ; 否: 取得arm状态SWI号
        BICEQ   R0, R0, #0xFF000000
                                        ; r0 = SWI号,R1指向参数存储位置
        CMP     R0, #0
        LDREQ   PC, =OSIntCtxSw

        BL      SWI_Exception
        
        LDMFD   SP!, {R0-R3, R12, PC}^
        
StackSvc           DCD     (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)

;/*********************************************************************************************************
;** 函数名称: OSIntCtxSw
;** 功能描述: 中断退出时的入口
;** 输 入:   R3    :当前任务的状态寄存器CPSR(即SPSR的值)
;**           R4-R12:当前任务的R4-R11
;**           当前处理器模式的堆栈结构(出栈次序):R0-R3、R12、PC(当前任务的)
;** 输 出 :  无
;** 全局变量: OSPrioCur,OSPrioHighRdy,OSPrioCur,OSPrioHighRdy
;** 调用模块: 无
;** 
;** 作 者: 陈明计
;** 日 期: 2003年8月17日
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSIntCtxSw
                                                    ;下面为保存任务环境
        LDR     R2, [SP, #20]                       ;获取PC
        LDR     R12, [SP, #16]                      ;获取R12
        MRS     R0, CPSR

        MSR     CPSR_c, #(NoInt | SYS32Mode)
        MOV     R1, LR
        STMFD   SP!, {R1-R2}                        ;保存LR,PC
        STMFD   SP!, {R4-R12}                       ;保存R4-R12

        MSR     CPSR_c, R0
        LDMFD   SP!, {R4-R7}                        ;获取R0-R3
        ADD     SP, SP, #8                          ;出栈R12,PC
        
        MSR     CPSR_c, #(NoInt | SYS32Mode)
        STMFD   SP!, {R4-R7}                        ;保存R0-R3
        
        LDR     R1, =Os_Enter_Sum                   ;获取Os_Enter_Sum
        LDRB    R2, [R1]
        STMFD   SP!, {R2, R3}                       ;保存CPSR,Os_Enter_Sum

                                                    ;保存当前任务堆栈指针
        LDR     R1, =OSTsaksStack
        LDR     R2, =OSTaskID
        LDRB    R3, [R2]
        STR     SP, [R1, R3, LSL #2]

                                                    ;OSTaskID <= OSNextTaskID
        LDR     R3, =OSNextTaskID
        LDRB    R3, [R3]
        STRB    R3, [R2]
                                                    ;获取新任务堆栈指针
        LDR     R4, [R1, R3, LSL #2]
        ADD     SP, R4, #68                         ;17寄存器CPSR,Os_Enter_Sum,R0-R12,LR,SP
        LDR     LR, [SP, #-8]
        MSR     CPSR_c, #(NoInt | SVC32Mode)        ;进入管理模式
        MOV     SP, R4                              ;设置堆栈指针

        LDMFD   SP!, {R4, R5}                       ;CPSR,Os_Enter_Sum
                                                    ;恢复新任务的Os_Enter_Sum
        LDR     R3, =Os_Enter_Sum
        STRB    R4, [R3]
    
        MSR     SPSR_cxsf, R5                       ;恢复CPSR
        LDMFD   SP!, {R0-R12, LR, PC }^             ;运行新任务


        AREA    SWIStacks, DATA, NOINIT
;,ALIGN=2
SvcStackSpace      SPACE   SVC_STACK_LEGTH * 4  ;管理模式堆栈空间

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

⌨️ 快捷键说明

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