📄 os_core.c
字号:
// os_core.c
// 名称:mpOS ; 版本:ver 1.1
// 功能: 微动力公司开发的操作系统,面向PIC18F系列单片机
// 其它: 通过低级中断服务程序进行任务调度
// 这个版本是协作型的调度方式,带有延时功能
// 每个用户任务占用7个字节内存
#include "os_core.h"
void interrupt HI_ISR(void)
{
unsigned char ibyte,itemp;
if (RCIE&&RCIF) // 异步通信接收,数据放入二级缓冲
{
ibyte=RCREG;
if (FERR||OERR)
{
}
else
{
itemp=osCommBuff.SavePosit;
osCommBuff. buff[itemp]=ibyte;
if (++itemp >=osCommBuffSize)
{
itemp=0; // 二级缓冲是FIFO的存储方式
}
if (itemp==osCommBuff.GetPosit)
{
bCommBuffFull=1; // 缓冲区满
}
osCommBuff.SavePosit=itemp;
if (ibyte==0x7e) // 如果接收同步码,激活协议解释任务
{
;
}
}
}
}
void interrupt low_priority LOW_ISR(void)
{
static unsigned char state,id;
if(!bOSSCH&&TMR1H==0)
{
if (TMR1IE&&TMR1IF) // 操作系统时钟基 10ms
{
for (id=0;id<OS_TASKS;id++)
{
if (TCB[id].osWaitTick)
{
TCB[id].osWaitTick --;
if (TCB[id].osWaitTick==0)
{
TCB[id].osTaskState=osTaskSta_Ready ;
}
}
}
}
}
// 任务调度
TMR1IF=0;
bOSSCH=0;
//保存当前正在运行的任务指针
TCB[osRunningTask].osTaskStackTop=(unsigned int)(TOSH<<8)+TOSL;
osRunningTask=OS_TASKS;
for (id=0;id<OS_TASKS;id++)
{
state=TCB[id].osTaskState;
if (state==osTaskSta_Ready) //就绪的任务,优先级高的先运行
{
// 要运行的任务指针入栈顶
osRunningTask=id;
break;
}
}
osEnterOsFunction();
TOSH=TCB[osRunningTask].osTaskStackTop>>8;
TOSL=TCB[osRunningTask].osTaskStackTop;
osExitOsFunction();
}
void osDelay(unsigned int ticks)
{
TCB[osRunningTask].osWaitTick=ticks;
TCB[osRunningTask].osTaskState =osTaskSta_Delay;
}
void osExitTask(void)
{
TCB[osRunningTask].osWaitTick=0;
TCB[osRunningTask].osTaskState =osTaskSta_Stop;
TCB[osRunningTask].osTaskStackTop=TCB[osRunningTask].osTaskPtr;
}
void osInit(void)
{
IPEN=1;
TMR1IP=0;
TMR1ON=1;
TMR1IE=1;
GIEL=1;
GIEH=1;
osRunningTask=OS_TASKS;
}
void osCreateTask(void *taskPtr, unsigned char TaskID)
{
TCB[TaskID].osTaskPtr=(unsigned int)taskPtr;
TCB[TaskID].osTaskStackTop=TCB[TaskID].osTaskPtr;
TCB[TaskID].osTaskID=TaskID;
}
void osTaskIdle(void)
{
while (1)
{
GIEL=1;
GIE=1;
GIEH=1;
clrwdt();
osSch();
}
}
unsigned char OpenComm(unsigned char RxTx )
{
if (RxTx==0x01) // 只发送
{
return 1;
}
else if (RxTx==0x10) //只接收
{
return 1;
}
else if (RxTx==0x11) // 发送和接收
{
return 1;
}
else // 参数错误
{
return 0;
}
}
void CloseComm(void)
{
}
unsigned char
osGetCommBuff(unsigned char bytes,unsigned char *ptr)
{
unsigned char i,j;
if (bytes==0) return 0;
if (osCommBuff.SavePosit==osCommBuff.GetPosit) return 0;
if (osCommBuff.SavePosit>osCommBuff.GetPosit)
{
bytes= osCommBuff.SavePosit-osCommBuff.GetPosit;
}
else
{
bytes= osCommBuffSize-osCommBuff.GetPosit+osCommBuff.SavePosit;
}
i=bytes;
do{
j=osCommBuff.GetPosit;
*ptr=osCommBuff.buff[j];
osCommBuff.GetPosit ++;
if (osCommBuff.GetPosit>=osCommBuffSize) osCommBuff.GetPosit=0;
}while(--i);
return bytes;
}
unsigned char osChkCommBuff(void)
{
unsigned char bytes;
if (osCommBuff.SavePosit>=osCommBuff.GetPosit)
{
bytes= osCommBuff.SavePosit>=osCommBuff.GetPosit;
}
else
{
bytes= osCommBuffSize-osCommBuff.GetPosit+osCommBuff.SavePosit;
}
return bytes;
}
unsigned char
Wr45DB041(unsigned char *addr,unsigned char *buff,unsigned char cnt)
{
return 1;
}
unsigned char
Rd45DB041(unsigned char *addr,unsigned char *buff,unsigned char cnt)
{
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -