📄 os_cpu_a.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 + -