os_cpu_a.c

来自「uCOS 嵌入式操作系统的改进版,增加了网络通讯.」· C语言 代码 · 共 386 行

C
386
字号
//=======================================================================================================
/*
*                                               uC/OS-II
*                                         The Real-Time Kernel
*
*                         (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
*                                          All Rights Reserved
*
*
*                                         80x51  Specific code
*                                          LARGE MEMORY MODEL
*
*                                           Keil C51  V7.06a
*
* File         : OS_CPU_a.C
* By           : Lin FengGe
*/
//=======================================================================================================

//=======================================================================================================
//#Lin@保护堆栈
/*
用户仿真堆栈:

                    -------------
					| High Addr |    <--使用xdata空间
					-------------
					|           |
			 ---->  | Stick     |    <--保护堆栈内容
			|		|           |
			|		-------------
			|		| Count     |    <--用户仿真堆栈基地址,存放堆栈使用计数<-----
			|		-------------                                                 |
            |                                                                     |
*/
//==========|=====================================================================|======================
/*          |                                                                     |
系统堆栈:   |                                                                     |
            |       -------------                                                 |
            |       | High Addr |    <--idata                                     |
			|		-------------                                      ----------------------
			|   	|           |    <--当前任务SP             ---->--| SP - UserSysSP_Start |
			|       |           |                                     |                      |
             <----  | Stick     |    <--当前任务堆栈                   ----------------------
					|           |                                                 |
					|           |                                                 |
					-------------                                                 |
                    |           |    <--UserSysSP_Start        ---->-------->-----
					|           |
					| System    |    <--系统使用
                    |           |
					-------------

*/
//=======================================================================================================
//#Lin@恢复堆栈
/*
用户仿真堆栈:

                    -------------
					| High Addr |    <--使用xdata空间
					-------------
					|           |
			 <----  | Stick     |    <--保护堆栈内容
			|		|           |
			|		-------------
			|		| Count     |    <--用户仿真堆栈基地址,存放堆栈使用计数 ---->
			|		-------------                                                 |
            |                                                                     |
*/
//==========|=====================================================================|======================
/*          |                                                                     |
系统堆栈:   |                                                                     |
            |       -------------                                                 |
            |       | High Addr |    <--idata                                     |
			|		-------------                                         -----------------
			|   	|           |    <--高优任务SP             <---<---- | UserSysSP_Start |
			|       |           |                                        |  + Count        |
             ---->  | Stick     |    <--高优任务堆栈                      -----------------
					|           |                                                 |
					|           |                                                 |
					-------------                                                 |
                    |           |    <--UserSysSP_Start        ---->-------->-----
					|           |
					| System    |    <--系统使用
                    |           |
					-------------

*/
//=======================================================================================================



//#define  OS_CPU_GLOBALS
#include "includes.h"
		
//=======================================================================================================
//=======================================================================================================
#pragma	asm

//#Lin@仿真keil c51中断生成入栈代码,参看.src文件

USERPUSHALL	MACRO

	PUSH 	ACC
	PUSH 	B
	PUSH 	DPH
	PUSH 	DPL
	PUSH 	PSW
	MOV  	PSW,#00H
	PUSH 	AR0
	PUSH 	AR1
	PUSH 	AR2
	PUSH 	AR3
	PUSH 	AR4
	PUSH 	AR5
	PUSH 	AR6
	PUSH 	AR7

ENDM
#pragma	endasm

#pragma	asm

//#Lin@仿真keil c51中断生成出栈代码,参看.src文件

USERPOPALL	MACRO

	POP  	AR7
	POP  	AR6
	POP  	AR5
	POP  	AR4
	POP  	AR3
	POP  	AR2
	POP  	AR1
	POP  	AR0
	POP  	PSW
	POP  	DPL
	POP  	DPH
	POP  	B
	POP  	ACC

ENDM
#pragma endasm
	
//=======================================================================================================
//=======================================================================================================
//=======================================================================================================

//#Lin@任务级切换
//#Lin@其他子程序参看此处注释

void          OSCtxSw(void) //using 3
{

    OS_STK	idata	*UserSysStkSP;			//#Lin@系统堆栈指针
    OS_STK	*UserUsrStkSP;					//#Lin@用户仿真堆栈指针
	INT8U	UserStkCount;					//#Lin@堆栈使用计数

	
#pragma	asm

	USERPUSHALL
	
#pragma	endasm
	
//	OSTCBCur ->OSTCBStkPtr = UsrStkSP;
//#Lin@指针操作,用户仿真堆栈填入内容

	UserSysStkSP = UserSysSP_Start;					//#Lin@获取系统堆栈基地址
	UserStkCount = SP - UserSysSP_Start;			//#Lin@获取堆栈使用范围
	UserUsrStkSP = OSTCBCur ->OSTCBStkPtr;			//#Lin@获取用户仿真堆栈基地址
	
//	SP = UserSysSP_Start;//?
	
//	UserUsrStkSP += UserStkCount;
	*UserUsrStkSP = UserStkCount;					//#Lin@存储计数
	
//	OSTCBCur ->OSTCBStkPtr = UserUsrStkSP;
//#Lin@数据传输	

	do
		{
		UserUsrStkSP ++;
		UserSysStkSP ++;
		*UserUsrStkSP = *UserSysStkSP;
		UserStkCount --;
		}
	while(UserStkCount != 0);

		
	OSTaskSwHook();
	
	OSTCBCur = OSTCBHighRdy;
	OSPrioCur = OSPrioHighRdy;
	
//	UsrStkSP = OSTCBHighRdy ->OSTCBStkPtr;
//#Lin@恢复仿真堆栈内容到系统堆栈

	UserStkCount = *OSTCBHighRdy ->OSTCBStkPtr;		//#Lin@获取堆栈使用长度
	UserSysStkSP = UserSysSP_Start;					//#Lin@获取系统堆栈基地址
	UserUsrStkSP = OSTCBHighRdy ->OSTCBStkPtr;		//#Lin@获取用户仿真堆栈基地址
	
//	UserUsrStkSP -= UserStkCount;
	
	SP = UserSysSP_Start + UserStkCount;			//#Lin@系统堆栈定位

//#Lin@数据传输

	do
		{
		UserUsrStkSP ++;
		UserSysStkSP ++;
		*UserSysStkSP = *UserUsrStkSP;
		UserStkCount --;
		}
	while(UserStkCount != 0);

	
#pragma	asm

	USERPOPALL
	RETI											//#Lin@仿真中断返回
	
#pragma	endasm
}
//
//=======================================================================================================

//=======================================================================================================
//
//#Lin@中断服务

void          OSTickISR(void) interrupt	1 //using 3
{

//	EA = 0;
//    OS_STK	idata	*UsrStkSP;

//	*UsrStkSP = SP;
    OS_STK	idata	*UserSysStkSP;
    OS_STK	*UserUsrStkSP;
	INT8U	UserStkCount;
	
	TR0 = 0;
	TH0 = 0x70;
	TL0 = 0x0;
	TR0 = 1;
	
	P1 ^= 0x80;
	
	OSIntEnter();
	if (OSIntNesting == 1){
		
		//	OSTCBCur ->OSTCBStkPtr = UsrStkSP;
			UserSysStkSP = UserSysSP_Start;
			UserStkCount = SP - UserSysSP_Start;
			UserUsrStkSP = OSTCBCur ->OSTCBStkPtr;
			
		//	SP = UserSysSP_Start;//?
			
		//	UserUsrStkSP += UserStkCount;
			*UserUsrStkSP = UserStkCount;
			
		//	OSTCBCur ->OSTCBStkPtr = UserUsrStkSP;
			
			do
				{
				UserUsrStkSP ++;
				UserSysStkSP ++;
				*UserUsrStkSP = *UserSysStkSP;
				UserStkCount --;
				}
			while(UserStkCount != 0);
		}
	
	OSTimeTick();
	OSIntExit();
	
//	EA = 1;
}
//
//=======================================================================================================

//=======================================================================================================
//
//#Lin@在ISR中执行任务切换

void          OSIntCtxSw(void) //using 3
{

//    OS_STK	idata	*UsrStkSP;

//	*UsrStkSP = SP;

    OS_STK	idata	*UserSysStkSP;
    OS_STK	*UserUsrStkSP;
	INT8U	UserStkCount;

	OSTaskSwHook();
	
	
	OSTCBCur = OSTCBHighRdy;
	OSPrioCur = OSPrioHighRdy;
	
//	UsrStkSP = OSTCBHighRdy ->OSTCBStkPtr;
	UserStkCount = *OSTCBHighRdy ->OSTCBStkPtr;
	UserSysStkSP = UserSysSP_Start;
	UserUsrStkSP = OSTCBHighRdy ->OSTCBStkPtr;
	
//	UserUsrStkSP -= UserStkCount;
	
	SP = UserSysSP_Start + UserStkCount;

	do
		{
		UserUsrStkSP ++;
		UserSysStkSP ++;
		*UserSysStkSP = *UserUsrStkSP;
		UserStkCount --;
		}
	while(UserStkCount != 0);

	

#pragma	asm

	USERPOPALL
	RETI
	
#pragma	endasm
}
//
//=======================================================================================================

//=======================================================================================================
//#Lin@起始

void          OSStartHighRdy(void) //using 3
{
//    OS_STK	idata	*UsrStkSP;

//	*UsrStkSP = SP;
    OS_STK	idata	*UserSysStkSP;
    OS_STK	*UserUsrStkSP;
	INT8U	UserStkCount;

//	UserSysSP_Start = SP;

	OSTaskSwHook();
	
	OSRunning = TRUE;
	
//	UsrStkSP = OSTCBHighRdy ->OSTCBStkPtr;
	UserStkCount = *OSTCBHighRdy ->OSTCBStkPtr;
	UserSysStkSP = UserSysSP_Start;
	UserUsrStkSP = OSTCBHighRdy ->OSTCBStkPtr;
	
//	UserUsrStkSP -= UserStkCount;
	
	SP = UserSysSP_Start + UserStkCount;

	do
		{
		UserUsrStkSP ++;
		UserSysStkSP ++;
		*UserSysStkSP = *UserUsrStkSP;
		UserStkCount --;
		}
	while(UserStkCount != 0);

	
	
#pragma	asm

	USERPOPALL
	RETI
	
#pragma	endasm

}

//
//=======================================================================================================

⌨️ 快捷键说明

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