📄 kernal.c
字号:
/******************************************
Name:kernal.c
Descript:系统内核(运行机制请见
设计文档)
By:Lms
Date:02-12-19 18:39
*******************************************/
#include "kernal.h"
// Public Function
uchar Sys_GetEventID(void)
{
uchar tmp;
int i;
tmp=NOEVENT;
for(i=0;i<3;i++)
{
if(EventQue[i].Sta!=EMPTY)
{
tmp=EventQue[i].elements[EventQue[i].Rp];
EventQue[i].Rp++;
EventQue[i].Rp%=EventQue[i].Len;
if(EventQue[i].Rp==EventQue[i].Wp)
EventQue[i].Sta=EMPTY;
break;
}
}
return(tmp);
}
uchar Sys_PutEvent(uchar EventID,uchar Privior)
{
if(EventQue[Privior].Sta==FULL)
return(ERROR);
EventQue[Privior].elements[EventQue[Privior].Wp]=EventID;
EventQue[Privior].Wp++;
EventQue[Privior].Wp%=EventQue[Privior].Len;
if(EventQue[Privior].Wp==EventQue[Privior].Rp)
EventQue[Privior].Sta=FULL;
else
EventQue[Privior].Sta=NORMAL;
return(OK);
}
void Sys_ClearEventQue()
{
int i;
for(i=0;i<3;i++)
{
EventQue[i].Rp=0;
EventQue[i].Wp=0;
EventQue[i].Sta=EMPTY;
}
}
void *Sys_GetEventPro(uchar EventID)
{
return((void*)Sys_RD_EventPro[EventID]);
}
void Sys_ClearEventPro(void)
{
int i;
for(i=0;i<EventTaskMaskLen;i++)
Sys_RD_EventPro[i]=NULL;
}
void Sys_SetEventPro(const struct Message_Struct *pAddr,int length)
{
int i;
for(i=0;i<length;i++)
Sys_RD_EventPro[pAddr[i].EventID]=pAddr[i].CallAddr;
}
uchar Sys_Init(int len1,int len2,int len3)
{
int i;
ST=0;
EventQue[0].Len=len1;
EventQue[1].Len=len2;
EventQue[2].Len=len3;
for(i=0;i<3;i++)
{
EventQue[i].Rp=0;
EventQue[i].Wp=0;
EventQue[i].Sta=EMPTY;
EventQue[i].elements=(uchar *)malloc(EventQue[i].Len);
if(EventQue[i].elements==NULL)
return(ERROR);
}
for(i=0;i<EventTaskMaskLen;i++)
Sys_RD_EventPro[i]=NULL;
Sys_SetEventPro(Sys_Rd_Arrry,EventTaskNormalLen);
SysTimer_Init();
if(Phy_Init(64,32,32)!=OK)
return(ERROR);
if(OLnk_Rp_Init(8,8,8,8)!=OK)
return(ERROR);
if(Encrypt_Init(300,300)!=OK)
return(ERROR);
if(AppSendInit()!=OK)
return(ERROR);
if(CmdAppInit(3)!=OK)
return(ERROR);
for(i=0;i<2;i++)
{
if(SerialPortOpen(i,512,512,19200)!=OK)
return(ERROR);
}
SysTimer_Require(ZtscEvent,10,RELOAD,LOW);
SysTimer_Require(WATCHDOG,5,RELOAD,LOW);
EncrypLnkFlashJudge();
ST|=0x2400;
return(OK);
}
void Sys_Go()
{
uchar (*temp_CallAddr)(uchar message);
uchar tmp_message;
while(TRUE)
{
tmp_message=Sys_GetEventID();
if((tmp_message==NOEVENT)||(tmp_message>EventTaskMaskLen))
{
asm(" LOPOWER "); // 降低主频
asm(" IDLE "); // 系统空闲,则IDLE
asm(" MAXSPEED "); // 全速运行
Sys_PutEvent(SpyEvent,LOW);
}
else
{
temp_CallAddr=Sys_RD_EventPro[tmp_message];
if(temp_CallAddr!=NULL)
(*temp_CallAddr)(tmp_message);
}
}
}
void main(void)
{
if(Sys_Init(10,10,50)!=OK) //系统初始化
return;
Sys_Go(); //启动内核
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -