📄 q.c
字号:
#include <AT89X52.H>
#include "os_core.h"
#include "main.h"
#include "task_switch.h"
#include "sem.h"
#include "q.h"
#include "uart.h"
uint8 OS_Task_Q_List;
//////////////////////////////////发送消息//////////////////////////////////////////////////
uint8 OSSendMsg(void * msg) reentrant
{
uint8 i,tempPrio=255;
for(i=0;i<TASK_NUM;i++) //查找优先级最高的任务
{
if(OS_Task_Q_List&OSMapTbl[i]&&OS_TCB[i].Prio<tempPrio)
{
tempPrio=OS_TCB[i].Prio;
}
}
for(i=0;i<TASK_NUM;i++)
{
if(OS_Task_Q_List&OSMapTbl[i]&&OS_TCB[i].Prio==tempPrio)
{
break;
}
}
if(i < TASK_NUM) //如果有任务需要
{
OS_TCB[i].msg=msg; //传入地址
OS_Task_Q_List&= ~OSMapTbl[i];
OSSendSignal(i);
return Q_OK; //成功,返回
}
else
{
return NOT_OK; //没有任务需要,返回
}
}
//////////////////////////////////发送消息//////////////////////////////////////////////////
uint8 OSTaskSendMsg(void * msg,uint8 i) reentrant
{
if(i < TASK_NUM) //如果有任务需要
{
if((OS_Task_Q_List&OSMapTbl[i])) //判断该任务是否为等待任务
{
OS_TCB[i].msg=msg; //传入地址
OS_Task_Q_List&= ~OSMapTbl[i];
OSSendSignal(i);
return Q_OK; //成功,返回
}
}
return NOT_OK; //没有任务需要,返回
}
//////////////////////////////// 等待消息 /////////////////////////////////////////////////
void * OSTaskWaitMsg(uint8 * err,uint8 Timeout) reentrant
{
void *msg;
if(OS_TCB[OS_Current_ID].msg==0x0000) //指针为空,无消息
{
OS_Task_Q_List|=OSMapTbl[OS_Current_ID]; //加入消息的任务等待表
bb:
if(OSWait(K_TMO,Timeout)==TMO_EVENT) //超时唤醒
{
OS_ENTER_CRITICAL();
OS_Task_Q_List&= ~OSMapTbl[OS_Current_ID]; //从等待表中去除
OS_EXIT_CRITICAL();
*err=Q_TMO; //超时
}
if(OS_Task_Q_List&OSMapTbl[OS_Current_ID])
goto bb;
}
msg=OS_TCB[OS_Current_ID].msg;
OS_TCB[OS_Current_ID].msg=0;
*err=Q_OK;
return msg ;
//有消息
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -