📄 os_q.lst
字号:
** 函数名称: OSQAccept
** 功能描述: 无等待从消息队列中取得消息
** 输 入: Ret:返回的消息
** Buf:指向队列的指针
** 输 出: NOT_OK:参数错误
** OS_Q_OK:收到消息
** OS_Q_TMO:超时到
** OS_Q_NOT_OK:无消息
** 全局变量: 无
** 调用模块: OSClearSignal,OSSched,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if EN_OS_Q_ACCEPT > 0
uint8 OSQAccept(uint8 data *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;
}
C51 COMPILER V8.08 OS_Q 10/17/2008 09:11:32 PAGE 6
}
#endif
/*********************************************************************************************************
** 函数名称: OSQIntPost
** 功能描述: 中断中FIFO方式发送消息
** 输 入: Buf:指向队列的指针
** Data:消息数据
** 输 出: OS_Q_FULL:队列满
** OS_Q_OK:发送成功
** 全局变量: 无
** 调用模块: OSIntSendSignal,OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年9月9日
**------------------------------------------------------------------------------------------------------
** 修改人: 陈明计
** 日 期: 2002年10月26日
**------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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 data *)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
C51 COMPILER V8.08 OS_Q 10/17/2008 09:11:32 PAGE 7
}
/* 存储消息 */
#ifdef __C51__
Buf[temp] = *((uint8 data *)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];
}
C51 COMPILER V8.08 OS_Q 10/17/2008 09:11:32 PAGE 8
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
**
** 作 者: 陈明计
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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)
C51 COMPILER V8.08 OS_Q 10/17/2008 09:11:32 PAGE 9
#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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -