📄 os_q.c
字号:
/*********************************************************************************************************
** Small RTOS(51)
** The Real-Time Kernel(For Keil c51)
**
** (c) Copyright 2002-2002, chenmingji
** All Rights Reserved
**
** V1.10.5
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#define IN_OS_Q
#include "config.h"
#if EN_OS_Q > 0
/*********************************************************************************************************
** 函数名称: OSQCreate
** 功能描述: 初始化消息队列
** 输 入: Buf:为队列分配的存储空间地址
** SizeOfBuf:为队列分配的存储空间大小
** 输 出: NOT_OK:参数错误
** OS_Q_OK:成功
** 全局变量: 无
** 调用模块: 无
********************************************************************************************************/
uint8 OSQCreate(uint8 OS_Q_MEM_SEL *Buf, uint8 SizeOfBuf)
//Buf[0]:队列中字节数,Buf[1]:Buf总长度,Buf[2]:出对端,Buf[3](,Buf[4]):等待队列任务列表
{
OS_ENTER_CRITICAL();
if ((SizeOfBuf >= 5) && (Buf != NULL))
{
Buf[0] = 0;
Buf[1] = SizeOfBuf;
#if OS_MAX_TASKS < 9
Buf[2] = 4;
#else
Buf[2] = 5;
#endif
Buf[3] = 0;
Buf[4] = 0;
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
OS_EXIT_CRITICAL();
return NOT_OK;
}
}
/*********************************************************************************************************
** 函数名称: OSQPend
** 功能描述: 等待消息队列中的消息
** 输 入: Ret:返回的消息
** Buf:指向队列的指针
** Tick:等待时间
** 输 出: NOT_OK:参数错误
** OS_Q_OK:收到消息
** OS_Q_TMO:超时到
** OS_Q_NOT_OK:无消息
** 全局变量: 无
** 调用模块: OSRunningTaskID,OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
********************************************************************************************************/
#if EN_OS_Q_PENT > 0
uint8 OSQPend(uint8 idata *Ret, uint8 OS_Q_MEM_SEL *Buf, uint8 Tick)
{
#ifdef __C51__
uint8 idata *cp;
#endif
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
OS_ENTER_CRITICAL();
OSWaitTick[OSRunningTaskID()] = Tick;
#ifdef __C51__
SP++;
*((uint8 idata * idata *)SP) = Ret;
#endif
#if OS_MAX_TASKS < 9
Buf[3] |= OSMapTbl[OSRunningTaskID()];
#else
if (OSRunningTaskID() < 8)
{
Buf[3] |= OSMapTbl[OSRunningTaskID()];
}
else
{
Buf[4] |= OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
while (Buf[0] == 0)
{
#ifdef __C51__
SP = SP + sizeof(Buf);
*((uint8 OS_Q_MEM_SEL * idata *)(SP + 1 - sizeof(Buf))) = Buf;
#endif
OSClearSignal(OSRunningTaskID());
OSSched();
OS_ENTER_CRITICAL();
#ifdef __C51__
Buf = *((uint8 OS_Q_MEM_SEL * idata *)(SP + 1 - sizeof(Buf)));
SP = SP - sizeof(Buf);
#endif
if (OSWaitTick[OSRunningTaskID()] == 0)
{
break;
}
}
#if OS_MAX_TASKS < 9
Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
#else
if (OSRunningTaskID() < 8)
{
Buf[3] &= ~OSMapTbl[OSRunningTaskID()];
}
else
{
Buf[4] &= ~OSMapTbl[OSRunningTaskID() & 0x07];
}
#endif
if (Buf[0] > 0)
{
Buf[0]--;
Buf[2]++;
if (Buf[2] >= Buf[1] )
{
#if OS_MAX_TASKS < 9
Buf[2] = 4;
#else
Buf[2] = 5;
#endif
}
#ifdef __C51__
cp = (uint8 idata *)(*((uint8 idata *)SP));
SP--;
*cp = Buf[Buf[2]];
#else
*Ret = Buf[Buf[2]];
#endif
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
#ifdef __C51__
SP--;
#endif
OS_EXIT_CRITICAL();
return OS_Q_TMO;
}
}
#endif
/*********************************************************************************************************
** 函数名称: OSQAccept
** 功能描述: 无等待从消息队列中取得消息
** 输 入: Ret:返回的消息
** Buf:指向队列的指针
** 输 出: NOT_OK:参数错误
** OS_Q_OK:收到消息
** OS_Q_TMO:超时到
** OS_Q_NOT_OK:无消息
** 全局变量: 无
** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
********************************************************************************************************/
#if EN_OS_Q_ACCEPT > 0
uint8 OSQAccept(uint8 idata *Ret, uint8 OS_Q_MEM_SEL *Buf)
{
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
OS_ENTER_CRITICAL();
if (*Buf != 0)
{
Buf[0]--;
Buf[2]++;
if (Buf[2] >= Buf[1])
{
#if OS_MAX_TASKS < 9
Buf[2] = 4;
#else
Buf[2] = 5;
#endif
}
*Ret = Buf[Buf[2]];
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
OS_EXIT_CRITICAL();
return OS_Q_NOT_OK;
}
}
#endif
/*********************************************************************************************************
** 函数名称: OSQIntPost
** 功能描述: 中断中FIFO方式发送消息
** 输 入: Buf:指向队列的指针
** Data:消息数据
** 输 出: OS_Q_FULL:队列满
** OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
********************************************************************************************************/
#if EN_OS_Q_INT_POST > 0 || EN_OS_Q_POST > 0
uint8 OSQIntPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
uint8 temp,i;
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
if (Buf[0] < (Buf[1]-4))
#else
if (Buf[0] < (Buf[1]-5))
#endif
{
#ifdef __C51__
SP++;
*((uint8 idata *)SP) = Data;
#endif
temp = Buf[2] + Buf[0] + 1;
if (temp >= Buf[1])
{
#if OS_MAX_TASKS < 9
temp = temp - Buf[1]+4;
#else
temp = temp - Buf[1]+5;
#endif
}
#ifdef __C51__
Buf[temp] = *((uint8 idata *)SP);
SP--;
#else
Buf[temp] = Data;
#endif
Buf[0]++;
if (Buf[0] == 1)
{
temp = Buf[3];
#if OS_MAX_TASKS < 9
for (i = 0; i < OS_MAX_TASKS; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
if (i < OS_MAX_TASKS )
{
Buf[3] &= ~OSMapTbl[i];
OSIntSendSignal(i);
}
#else
for (i = 0; i < 8; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
if (i >= 8 )
{
temp = Buf[4];
for (; i < OS_MAX_TASKS; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
}
if (i < OS_MAX_TASKS )
{
if (i < 8)
{
Buf[3] &= ~OSMapTbl[i];
}
else
{
Buf[4] &= ~OSMapTbl[i & 0x07];
}
OSIntSendSignal(i);
}
#endif
}
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
OS_EXIT_CRITICAL();
return OS_Q_FULL;
}
}
#endif
/*********************************************************************************************************
** 函数名称: OSQIntPostFront
** 功能描述: 中断中LIFO方式发送消息
** 输 入: Buf:指向队列的指针
** Data:消息数据
** 输 出: OS_Q_FULL:队列满
** OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
********************************************************************************************************/
#if EN_OS_Q_INT_POST_FRONT > 0 || EN_OS_Q_POST_FRONT > 0
uint8 OSQIntPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
uint8 temp,i;
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
if (Buf[0] < (Buf[1]-4))
#else
if (Buf[0] < (Buf[1]-5))
#endif
{
Buf[Buf[2]] = Data;
Buf[0]++;
Buf[2]--;
#if OS_MAX_TASKS < 9
if (Buf[2] < 4)
#else
if (Buf[2] < 5)
#endif
{
Buf[2] = Buf[1]-1;
}
if (Buf[0] == 1)
{
temp = Buf[3];
#if OS_MAX_TASKS < 9
for (i = 0; i < OS_MAX_TASKS; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
if (i < OS_MAX_TASKS )
{
Buf[3] &= ~OSMapTbl[i];
OSIntSendSignal(i);
}
#else
for (i = 0; i < 8; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
if (i >= 8 )
{
temp = Buf[4];
for (; i < OS_MAX_TASKS; i++)
{
if ((temp & 0x01) != 0)
{
break;
}
temp = temp >> 1;
}
}
if (i < OS_MAX_TASKS )
{
if (i < 8)
{
Buf[3] &= ~OSMapTbl[i];
}
else
{
Buf[4] &= ~OSMapTbl[i & 0x07];
}
OSIntSendSignal(i);
}
#endif
}
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
OS_EXIT_CRITICAL();
return OS_Q_FULL;
}
}
#endif
/*********************************************************************************************************
** 函数名称: OSQPost
** 功能描述: FIFO方式发送消息
** 输 入: Buf:指向队列的指针
** Data:消息数据
** 输 出: OS_Q_FULL:队列满
** OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSQIntPost,OSSched
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_POST > 0
uint8 OSQPost(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
if (OSQIntPost(Buf,Data) == OS_Q_OK)
{
OSSched();
return OS_Q_OK;
}
else
{
return OS_Q_FULL;
}
}
#endif
/*********************************************************************************************************
** 函数名称: OSQPostFront
** 功能描述: LIFO方式发送消息
** 输 入: Buf:指向队列的指针
** Data:消息数据
** 输 出: OS_Q_FULL:队列满
** OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSQIntPostFront,OSSched
********************************************************************************************************/
#if EN_OS_Q_POST_FRONT > 0
uint8 OSQPostFront(uint8 OS_Q_MEM_SEL *Buf, uint8 Data)
{
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return NOT_OK;
}
#endif
if (OSQIntPostFront(Buf,Data) == OS_Q_OK)
{
OSSched();
return OS_Q_OK;
}
else
{
return OS_Q_FULL;
}
}
#endif
/*********************************************************************************************************
** 函数名称: OSQNMsgs
** 功能描述: 取得消息队列中消息数
** 输 入: Buf:指向队列的指针
** 输 出: 消息数
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
********************************************************************************************************/
#if EN_OS_Q_NMsgs > 0
uint8 OSQNMsgs(uint8 OS_Q_MEM_SEL *Buf)
{
uint8 temp;
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return 0;
}
#endif
OS_ENTER_CRITICAL();
temp = Buf[0];
OS_EXIT_CRITICAL();
return temp;
}
#endif
/*********************************************************************************************************
** 函数名称: OSQSize
** 功能描述: 取得消息队列总容量
** 输 入: Buf:指向队列的指针
** 输 出: 消息队列总容量
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
********************************************************************************************************/
#if EN_OS_Q_SIZE > 0
uint8 OSQSize(uint8 OS_Q_MEM_SEL *Buf)
{
uint8 temp;
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return 0;
}
#endif
OS_ENTER_CRITICAL();
#if OS_MAX_TASKS < 9
temp = Buf[1] - 4;
#else
temp = Buf[1] - 5;
#endif
OS_EXIT_CRITICAL();
return temp;
}
#endif
/*********************************************************************************************************
** 函数名称: OSQFlush
** 功能描述: 清空队列
** 输 入: Buf:指向队列的指针
** 输 出: 无
** 全局变量: 无
** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
********************************************************************************************************/
#if EN_OS_Q_FLUSH > 0
void OSQFlush (uint8 OS_Q_MEM_SEL *Buf)
{
#if EN_OS_Q_CHK > 0
if (Buf == NULL)
{
return;
}
#endif
Buf[0] = 0;
#if OS_MAX_TASKS < 9
Buf[2] = 4;
#else
Buf[2] = 5;
#endif
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -