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 + -
显示快捷键?