tskman.c
来自「MCS51的实现无线接收发送(315M或433M)源程序代码。」· C语言 代码 · 共 91 行
C
91 行
/**********************************************************
* TskMan.c *
**********************************************************/
#define TSKMAN_GLOBALS
//=========================================================
#include "Sm5964.h"
#include "Struct.h"
#include "Tools.h"
#include "Uart.h"
#include "Error.h"
#include "Hardware.h"
#include "Tmr2.h"
#include "OS.h"
#include "TskMan.h"
//=========================================================
#define DEBUG_TSKMAN 0
//=========================================================
#define MAXTSK 8
#define MAXMSG 8
//=========================================================
static INT16UI TskTcb[MAXTSK];
static TskMsgStruct idata MsgTcb[MAXMSG];
static INT8UI NumMsg,ReadMsg,WriteMsg;
//=========================================================
void InitTskMan(void)
{
InitError();
NumMsg=0;
ReadMsg=0;
WriteMsg=0;
TmrIntNum=0;
InitMemBuf((INT8UI *)TskTcb,NULL,sizeof(TskTcb));
InitMemBuf((INT8UI *)MsgTcb,0,sizeof(MsgTcb));
}
//=========================================================
void CreateTsk(INT16UX InitAddr,INT16UX ExecAddr,INT8U TskId)
{
#if DEBUG_TSKMAN
MDebugPara("CreateTsk():",TskId);
#endif
if((TskId<MAXTSK)&&(TskTcb[TskId]==NULL)) TskTcb[TskId]=ExecAddr;
else ErrExit(ERR_CREATETSK);
ExecFunc(InitAddr);
}
//=========================================================
void SendTskMsg(INT8U TskId,INT8U MsgId,INT16U Para)
{
if((TskId>=MAXTSK)||(TskId==TMRTSKID)||(TskTcb[TskId]==NULL)) ErrExit(ERR_SENDTSKMSG);
else
{
MsgTcb[WriteMsg].TskId=TskId;
MsgTcb[WriteMsg].MsgId=MsgId;
MsgTcb[WriteMsg].Para=Para;
if(++WriteMsg>=MAXMSG) WriteMsg=0;
if(++NumMsg>MAXMSG) ErrExit(ERR_MSGNUM);
}
}
//=========================================================
void Scheduler(void)
{
INT16U ExecProc;
while(1)
{
ClrWatchDog();
if(TmrIntNum)
{
ExecFunc(TskTcb[TMRTSKID]);
EA=0;
TmrIntNum--;
EA=1;
}
else
{
if(NumMsg)
{
TskMsg.MsgId=MsgTcb[ReadMsg].MsgId;
TskMsg.Para=MsgTcb[ReadMsg].Para;
ExecProc=TskTcb[MsgTcb[ReadMsg].TskId];
if(ExecProc==NULL) ErrExit(ERR_SCHEDULER);
else ExecFunc(ExecProc);
if(++ReadMsg>=MAXMSG) ReadMsg=0;
NumMsg--;
}
else CpuTurnIntoIdle();
}
ErrProc();
}
}
//=========================================================
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?