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

📄 os_cpu_a.asm

📁 个人移植的陈明计先生的small_rtos_MSP430版
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*********************************************************************************************************
;**				                               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 + -