📄 os_cpu_a.asm
字号:
;*********************************************************************************************************
;** Small RTOS 51
;** The Real-Time Kernel For Keil c51
;**
;** (c) Copyright 2002-2003, chenmingji
;** All Rights Reserved
;**
;** V1.12.1
;**
;**
;**--------------------文件信息---------------------------------------------------------------------------
;**文 件 名: OS_CPU_A.ASM
;**创 建 人: 陈明计
;**版 本: V1.12.1
;**最后修改日期: 2002年2月5日
;**描 述: Small RTOS 51 与CPU(8051系列)相关的汇编程序
;**---------------------历史版本信息----------------------------------------------------------------------
;** 创建人: 陈明计
;** 版 本:V0.50
;** 日 期: 2002年2月22日
;** 描 述: 原始版本
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.00
;** 日 期: 2002年6月10日
;** 描 述: 支持软的非屏蔽中断
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.10.3
;** 日 期: 2002年9月16日
;** 描 述: 修改了LoadCtx代码使之执行更快,代码更小
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.10.4
;** 日 期: 2002年10月5日
;** 描 述: 将OS_CPU_A.ASM和OS_CPU_A_task16.ASM合并
;**
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.11.0
;** 日 期: 2002年12月2日
;** 描 述: 根据新版本要求使任务堆栈包含Os_Enter_Sum,使优先级最低
;** 的任务只保存少量寄存器;增加注释
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.12.0
;** 日 期: 2002年12月30日
;** 描 述: 根据新版本要求更改少量代码
;**------------------------------------------------------------------------------------------------------
;** 修改人: 陈明计
;** 版 本: V1.12.1
;** 日 期: 2002年2月5日
;** 描 述: 更正LoadCtx中OS_MAX_TASKS为8或16的bug
;**---------------------当前版本修订-----------------------------------------------------------------------
;** 修改人:
;** 日 期:
;** 描 述:
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
#include "OS_CPU.H"
#include "OS_CFG.H"
#include <msp430x42x.h>
;********************************************************************************************************
; MACRO
;********************************************************************************************************
MACRO PUSHALL
PUSH R4
PUSH R5
PUSH R6
PUSH R7
PUSH R8
PUSH R9
PUSH R10
PUSH R11
PUSH R12
PUSH R13
PUSH R14
PUSH R15
ENDM
MACRO POPALL
POP R15
POP R14
POP R13
POP R12
POP R11
POP R10
POP R9
POP R8
POP R7
POP R6
POP R5
POP R4
ENDM
EXTERN OSMapTbl
EXTERN OSTaskID
EXTERN OSNextTaskID
EXTERN OSTaskStackBottom
EXTERN Os_Enter_Sum
EXTERN OSTimeTick
EXTERN OSIntExit
PUBLIC LoadCtx
PUBLIC OSIntCtxSw
PUBLIC OSCtxSw
PUBLIC GetSP
PUBLIC PutSP
RSEG CODE
GetSP:
MOV SP,R12
ADD.W #2,R12
RET
PutSP:
MOV @SP,R14
MOV R12,SP
SUB.W #2,SP
MOV R14,0(SP)
RET
;****************************************************************************************
;/*********************************************************************************************************
;** 函数名称: OSCtxSw
;** 功能描述: 任务主动放弃CPU环境保存函数
;** 输 入: OSTaskID
;** 输 出 : 无
;** 全局变量: OSFastSwap
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2002年2月22日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
OSCtxSw:
// 保存现场
PUSH SR ; emulate interrupt by also saving the SR
PUSHALL ; push all registers
JMP C_OSCtxSw
;****************************************************************************************
;/*********************************************************************************************************
;** 函数名称: LoadCtx
;** 功能描述: 任务环境恢复函数
;** 输 入: OSTaskID,OSFastSwap
;** 输 出 : 无
;** 全局变量: 无
;** 调用模块: 无
;**
;** 作 者: 陈明计
;** 日 期: 2002年2月22日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2002年12月2日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2003年2月5日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
LoadCtx:
POPALL
RETI
//}
;****************************************************************************************
;/*********************************************************************************************************
;** 函数名称: C_OSCtxSw
;** 功能描述: 堆栈处理函数
;** 输 入: 无
;** 输 出 : 无
;** 全局变量: OSTaskID,OSTaskStackBottom,SP
;** 调用模块: LoadCtx
;**
;** 作 者: 陈明计
;** 日 期: 2002年2月22日
;**-------------------------------------------------------------------------------------------------------
;** 修 改: 陈明计
;** 日 期: 2002年12月2日
;**-------------------------------------------------------------------------------------------------------
;** 修 改:
;** 日 期:
;**-------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
// void C_OSCtxSw(void)
//{
C_OSCtxSw:
// uint16 *cp1, *cp2;
// uint16 temp, i;
; R12 = cp1, R13 = cp2, R14 = temp, R15 = i
// cp1 = GetSP() - 2; // cp1保存当前任务堆栈指针的下一个空闲位置
MOV.W SP, R12
SUB.W #0x2, R12
// temp = (uint16)OSTaskStackBottom[OSNextTaskID+1]; // temp保存再下一个栈底
MOV.W &OSNextTaskID, R15
RLA.W R15
MOV.W OSTaskStackBottom + 2(R15), R14
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -