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