⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kernal.c

📁 适合于单片机
💻 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 + -