📄 emnetrtos.c
字号:
#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 + -