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

📄 emnetrtos.c

📁 This code is used to TCP/IP connection It is developed by PIC18F452 and all this code is successfull
💻 C
📖 第 1 页 / 共 2 页
字号:

#include "emNETRTOS.H"

#include "p18f452.h"

#define MCUF452
#define MCU8722

unsigned char RunID,vpc,stemp,tbsr,twag;
unsigned char tol_bmem=0;
extern unsigned char a,Rx_buf[100];

#ifndef MAXTASK 
#define  MAX_TASK 16
#endif	

#define  MAX_MESSAGE 16
#define  MAX_TIMER 16


struct HardTimer pHt[MAX_TIMER];
emInt8 Htimer1,Htimer0;
//#ifdef MCU452

#pragma udata DATABANK=0x100
unsigned char mainbuf2[128];//mail memory
struct emMessage mesg[MAX_MESSAGE];
struct emTimer tim[MAX_TIMER];
struct emSem1 Sem[4];
#pragma udata

volatile unsigned long  mSeconds=0;
//struct emFlag	eflg[4];


/*关于RAM的分配,仔细考虑基本上可以不用管他,所以后面的内存分配函数也可以去除
#pragma udata myDATABANK=0x300
unsigned char mainbuf0[256];//alloc RAM
#pragma udata*/
//#pragma udata myDATABANK=0x300
struct tcb pTcb[MAX_TASK];

//struct emMem G_msg;
//#pragma udata myDATABANK=0x200
//unsigned char mainbuf1[256];//TCP/IP recieve buffer
//#pragma udata

char tempRunID;
//#pragma udata

/* some Macro must be define as asm again */

#define emDintl INTCONbits.GIEL=0 /* disable low priority int*/
#define emEintl INTCONbits.GIEL=1
#define emDinth INTCONbits.GIEH=0 /* when low inttrupt disable high priority int*/
#define emEinth INTCONbits.GIEH=1
#define emEtmr0 INTCONbits.TMR0IF=0 /*enable TMR0 intrrupt again*/
#define emStmr0 T0CONbits.TMR0ON=1

#define emHtm0 INTCONbits.TMR0IF=1;

//#define emWpth(nRunID) TOSH=pTcb[nRunID].byRpch	/* write branch high pc valuePCLATH*/
//#define emWptl(nRunID) TOSL=pTcb[nRunID].byRpcl	/* write branch low pc valuePCL*/

//#define emWpth1(nRunID) TOSH=pTcb[nRunID].bySpch	/* PCLATHwrite branch high pc value*/
//#define emWptl1(nRunID) TOSL=pTcb[nRunID].bySpcl	/* PCLwrite branch low pc value*/

//#define emSpch(nRunID) pTcb[nRunID].byRpch=TOSH	/* Save current task high pc value*/
//#define emSpcl(nRunID) pTcb[nRunID].byRpcl=TOSL	/* Save current task low pc value*/

//#define emSfsrh(nRunID) pTcb[nRunID].bySavf=FSR0H	/* Save current task high pc value*/
//#define emSfsrl(nRunID) pTcb[nRunID].bySavb=FSR0L	/* Save current task low pc value*/

//#define emWfsrh(nRunID) FSR0H=pTcb[nRunID].bySavf	/* Save current task high pc value*/
//#define emWfsrl(nRunID) FSR0L=pTcb[nRunID].bySavb	/* Save current task low pc value*/

//#define emSTKP(nRunID) STKPTR=pTcb[nRunID].bySavw	/* Save current task high pc value*/
//#define emWSTKP(nRunID) pTcb[nRunID].bySavw=STKPTR	/* Save current task low pc value*/

//#define emKeepSTKP 	vpc=STKPTR
//#define emSaveSTKP 	STKPTR=vpc

//#define emRpch(nRunID) pTcb[nRunID].bySpch=pTcb[nRunID].byRpch	/* 当执行的任务是自己时,存储当前的PC指针*/
//#define emRpcl(nRunID) pTcb[nRunID].bySpcl=pTcb[nRunID].byRpcl	/* Save current task low pc value*/

/* use Marco keep stack unchangeg as TMR0 intrrupt*/
#define emKstk _asm POP _endasm
#define emPstk _asm PUSH _endasm

void emStar(void);
void emCreatTask( void (* taskname)(),unsigned char taskID,unsigned char taskpro);

void emSched(void);
void emSerTask(void);
void emSysini(void);

void emHint(void);
void emLint(void);



unsigned char *emGetMem(unsigned char mnum);//get memory from RAM
char emCreatMal(unsigned char nid,unsigned char nsi);//create mailbox
//unsigned char *emGetMal(unsigned char nid);//get the address of mailbox in buffer memory
unsigned char *emGetSmal(unsigned char nid);//get the start address of mailbox in buffer memory
char emSendMal(unsigned char miD,unsigned char *pMesg,unsigned char nByte);//send  mailbox
unsigned char *emRecMal(unsigned char miD);//recieve mailbox,ok return the length of mailbox*/



/*#pragma code HighVector=0x08
void atHighVector ( )
{
	_asm goto emHint  _endasm
}
#pragma code
//#pragma interrupt emHint save=PROD


#pragma code LowVector=0x018
void atLowVector ( )
{
	_asm goto emLint  _endasm
}
#pragma code                                          
//#pragma interruptlow emLint save=PROD

void emHint( )
{
	stemp=STATUS;
	tbsr=BSR;
	twag=WREG;
	if(PIR1bits.TMR1IF==1)//允许定时器1中断处理,以启动硬件定时器
	{
		PIR1bits.TMR1IF=0;
		TMR1H=Htimer1;
		TMR1L=0;
		mSeconds++;
		emEinth;
	}
	if(INTCONbits.TMR0IF==1)
	{
		emSpch(RunID);
		emSpcl(RunID);
		tempRunID=RunID;
	
		emSerTask();
		TMR0H=Htimer0;
		TMR0L=0;
		emEtmr0;
		emEinth;
		emEintl;
		if(tempRunID!=RunID)
		{
			STKPTR=3;
			emWpth1(RunID);
			emWptl1(RunID);		
			FSR1L=0x30;
		}

	}
	BSR=tbsr;
	WREG=twag;
	STATUS=stemp;		
}

void emLint( )
{

	Nop();
}*/

void emSetTimer1(void)
{
	T1CON=0b10000000;
	switch(CPU_CLOCK)
	{
	case 8:
		Htimer1=217;//39;
		break;
	case 10:
		Htimer1=207;//49;
		break;
	case 16:
		Htimer1=178;//78;
		break;
	case 20:
		Htimer1=158;//98;
		break;
	case 32:
		Htimer1=100;//156;
		break;
	case 40:
		Htimer1=61;//195;
		break;
	}
}
char emSetTice(void)
{
	switch(CPU_CLOCK)
	{
	case 8:
		Htimer0=207;//12500,49
		break;
	case 10:
		Htimer0=195;//15625,61
		break;
	case 16:
		Htimer0=158;//25000,98
		break;
	case 20:
		Htimer0=12;//134;//31250,122
		break;
	case 32:
		Htimer0=60;//50000,196
		break;
	case 40:
		Htimer0=12;//62500,244
		break;
	}
}


void emSysini(void)
{
	char j;	
	
	PIE1bits.TMR1IE=1;
	IPR1bits.TMR1IP=1;
	RCONbits.IPEN=1;	/*enable interrupt pro */

	T0CON=0b00000001;//16 bits  prescaler is 4 inter clock f/4
	INTCONbits.RBIE=0;
	INTCONbits.INT0IE=0;
	INTCONbits.TMR0IE=1;
	emSetTice();
	emSetTimer1();
	
	TMR0L=0;	/*set timr0 ini value*/
	TMR0H=Htimer0;
	TMR1L=0;
	TMR1H=Htimer1;
	for(j=0;j<MAX_TASK;j++)
	{
	
	pTcb[j].status.bits.statu=TASKNULL; //先将所有任务设为空,以备后面应用
   
              
   pTcb[j].status.bits.prio=15;
   //Tcb[j].status.bits.statu=0;
	}
	mesg[15].Mesg=NULLMESG;//将系统消息先设为空
	INTCONbits.GIEH=1;
}

void emCreatTask( void (* taskname)(),unsigned char taskID,unsigned char taskpro)
{
	
	unsigned int i;
	unsigned char ju;
	unsigned char j;

	if(taskID>MAX_TASK)
		return;
	i=(unsigned int)taskname;
	j=(unsigned char)i;
	ju=i>>8;
	pTcb[taskID].bySpch=ju;
	
	pTcb[taskID].bySpcl=j;
//	if(taskpro<0||taskpro>15)
//		return E_PRO;
	pTcb[taskID].status.bits.prio=taskpro&0x0f;
	pTcb[taskID].status.bits.statu=READY;

/*when run task the start pointer is byRpc, so as a task run only one, the finish function
will do the following lines again.*/
	pTcb[taskID].byRpch=pTcb[taskID].bySpch;
	pTcb[taskID].byRpcl=pTcb[taskID].bySpcl;
}

void emChpTask(unsigned char taskpro)
{
	emDinth;
	emDintl;
	pTcb[RunID].status.bits.prio=taskpro;
	emEinth;
	emEintl;
	return;
}

void emDeyTask(unsigned char dtim)
{
//	unsigned char j;
	emDinth;
	emDintl;
	pTcb[RunID].status.bits.statu=DELAY;
	pTcb[RunID].delaytime=dtim;
	emEinth;
	emEintl;
	return;
}


/*first find READY task,and then compare task priority,get the next run taskID
  current run taskID is RunID */

void emSerTask(void)
{
	 char j,k,m;
	if(pTcb[RunID].status.bits.statu==WAIT)
		k=16;
	else
		k=pTcb[RunID].status.bits.prio;
	m=RunID;
	for(j=0;j<MAX_TASK;j++)
	{
		if(pTcb[j].status.bits.statu==DELAY)				//when wait status,dec the Delay value 
		{	
			if((pTcb[j].delaytime==0))
			{
				pTcb[j].status.bits.statu=READY;
			}
			else
				pTcb[j].delaytime--;
		}
		if(pTcb[j].status.bits.statu==READY)
		{
			if(k>pTcb[j].status.bits.prio)
			{
				RunID=j;
				k=pTcb[j].status.bits.prio;
			}
			else if(k==pTcb[j].status.bits.prio)
			{
				if(m!=j)	//if next task is himself
					RunID=j;
			}
		}
	}
/*	if(m==RunID)//当连续执行同一个任务时,可保证任务连续执行。相当于RUNING状态
	{
//		if((pTcb[m].delaytime!=0))//增加的超时处理,用了两行程序。
//			pTcb[m].delaytime--;
		emRpch(RunID);
		emRpcl(RunID);
	}*/
}
/*first save current pc value,then run the search run id function,last load 
  the next task pc*/
void emSched(void)
{
	TMR0L=LTM0;
	TMR0H=HTM0;
	emHtm0;
//	emKeepSTKP;
	for(;;)
	Nop();
}
void emSched1(void)
{

	 overlay unsigned char i,j,k,m;
	
	INTCONbits.GIEH=0;
	m=RunID;
	if(pTcb[RunID].status.bits.statu==WAIT)
		k=16;
	else
		k=pTcb[RunID].status.bits.prio;
	for(j=0;j<MAX_TASK;j++)
	{
		i=pTcb[j].status.bits.statu;
		if(i==READY)
		{
			if(k>=pTcb[j].status.bits.prio)
			{
				RunID=j;
				k=pTcb[j].status.bits.prio;
			}
			else if(k==pTcb[j].status.bits.prio)
			{
				if(m!=j)	//if next task is himself
					RunID=j;
			}
		}
	}
	STKPTR=16;
	emWpth1(RunID);
	emWptl1(RunID);
	INTCONbits.GIEH=1;
}


void emStar(void)
{
	INTCONbits.GIEH=1;
	emEintl;
//	emStmr0;
	T1CONbits.TMR1ON=1;
	RunID=0;
}


//allocate ram for a mailbox,ram length isn't fixed
char emCreatMal(unsigned char nid,unsigned char nsi)
{
	unsigned char *curPmail;
	unsigned char i;
	union  mailFirst fir;
	union mailtask tsk;
	curPmail=&mainbuf2[0];
	i=nid;
	if(i!=0)
	{
		do
		{
			curPmail++;
			curPmail++;
			curPmail+=*curPmail;
			i--;
		}
		while(i!=0);
	}
	if((curPmail+nsi)>(126+&mainbuf2[0]))
		return -1;
	else
	{
		fir.atr.mailID=nid;
		fir.atr.mailAttribute=malNULL;
		*curPmail=fir.Firstb;
		tsk.tID.txMesgtaskID=RunID;
		curPmail++;
		*curPmail=tsk.Seconeb;
		curPmail++;
		*curPmail=nsi;
	}
	return 0;
}

unsigned char *emGetSmal(unsigned char nid)//返回的指针是邮箱的其始地址。
{
	unsigned char *ptr;
	ptr=&mainbuf2[0];
	if(nid==0)
		return ptr;
	do
	{
		ptr++;
		ptr++;//find the size byte address
		ptr=ptr+*ptr;
		nid--;
	}
	while(nid!=0);
	return ptr;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -