os_q.c
来自「cs5460a做功率表用 cs5460a做功率表用 cs5460a做功率表」· C语言 代码 · 共 150 行
C
150 行
/********************************************
公司名称:
文 件 名:
版 本 号:
程序设计:
说 明:
完成日期:
修改日期:
功能摘要:
**********************************************/
#define _OS_Q
#include "includes.h"
OS_Q *OSQCreat(OS_Q *pEvent,uint8 *start,uint8 size);
uint8 OSQPost (OS_Q *pEvent,uint8 msg);
uint8 OSQAccept (OS_Q *pEvent,uint8 *const msg);
uint8 OSQQuery(OS_Q *pEvent);
//-----------------------------------------------
OS_Q *OSQCreat(OS_Q *pEvent,uint8 *start,uint8 size) //创建一个消息队列
{
pEvent->OSQStart = start;
pEvent->OSQEnd = &start[size];
pEvent->OSQIn = start;
pEvent->OSQOut = start;
pEvent->OSQSize = size;
pEvent->OSQCnt = 0;
return (pEvent);
}
//------------------------------------------------
uint8 OSQPost (OS_Q *pEvent,uint8 msg) //向消息队列发送一则消息
{
if (pEvent == (OS_Q *)0) //无效事件
{
return (OS_ERR_PEVENT_NULL);
}
OS_CLOSE_INT();
if (pEvent->OSQCnt >= pEvent->OSQSize) //时件长度超过所给长度,已满
{
OS_OPEN_INT();
return (OS_Q_FULL);
}
*pEvent->OSQIn++ = msg; //OSQIn++ = msg
pEvent->OSQCnt++;
if (pEvent->OSQIn == pEvent->OSQEnd) //如果已满则重新开始
{
pEvent->OSQIn = pEvent->OSQStart;
}
OS_OPEN_INT();
return (OS_Q_OK);
}
//------------------------------------------------
uint8 OSQAccept (OS_Q *pEvent,uint8 * const msg) //从消息队列中取出消息
{
if (pEvent == (OS_Q *)0)
{
return (OS_ERR_PEVENT_NULL);
}
OS_CLOSE_INT();
if (pEvent->OSQCnt > 0)
{
*msg = *pEvent->OSQOut;
pEvent->OSQOut++;
pEvent->OSQCnt--;
if (pEvent->OSQOut == pEvent->OSQEnd)
{
pEvent->OSQOut = pEvent->OSQStart;
}
OS_OPEN_INT();
return OS_Q_OK;
}
OS_OPEN_INT();
return OS_Q_ERR;
}
//------------------------------------------------
uint8 OSQQuery(OS_Q *pEvent)
{
if (pEvent == (OS_Q *)0)
{
return (OS_ERR_PEVENT_NULL);
}
OS_CLOSE_INT();
if (pEvent->OSQCnt != 0)
{
OS_OPEN_INT();
return (OS_Q_NO_EMPTY);
}
else if (pEvent->OSQCnt >= pEvent->OSQSize)
{
OS_OPEN_INT();
return (OS_Q_FULL);
}
else
{
OS_OPEN_INT();
return (OS_Q_EMPTY);
}
}
//-------------------------------------------------
/*
--------------------------
*OSQCreat:创建一个消息队列.
OS_Q *OSQCreat(OS_Q *pEvent,uint8 *start,uint8 size) :定义消息队列的一些特征
--------------------------
OSQPost:向消息队列发送一则消息,发送函数
无效消息
关中断;if OSQCnt >=OSQSize ,则数据已满
*pEvent->OSQIn++ = msg;
pEvent->OSQCnt++;
if OSQIn==OSQEnd, 则OSQIn =OSQStart
开中断:
return (OS_Q_OK);
向消息队列内装载数据:当数据正常时:*pEvent->OSQIn++ = msg (msg 是函数Process_Msg准备好的)
pEvent事件包括:msg所具有的特性
---------------------------
OSQAccept:从消息队列中取出消息,接收函数
无效消息
关中断: if OSQCnt > 0 则*msg = *pEvent->OSQOut;
pEvent->OSQOut++;
pEvent->OSQCnt--;
if OSQOut ==OSQEnd 则OSQOut =OSQStart
OS_OPEN_INT();
return OS_Q_OK;
OS_OPEN_INT();
return OS_Q_ERR;
从消息队列内取出消息:当数据正常时:pEvent->OSQOut++;pEvent->OSQCnt--;(pEvent是消息队列中存在的数)
-------------------------
OSQQuery:异常处理函数.
无效消息
关中断 if OSQCnt != 0 则OS_OPEN_INT();
return (OS_Q_NO_EMPTY);
else if OSQCnt >=OSQSize 则OS_OPEN_INT();
return (OS_Q_FULL);
else 则OS_OPEN_INT();
return (OS_Q_EMPTY);
--------------------------
以消息队列作为一个媒介:发送时把消息先发送到消息队列中;接收消息时从消息队列中取出消息
*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?