📄 os_q.lst
字号:
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];
OSTaskResume(i);
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 9
}
#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];
}
OSTaskResume(i);
}
#endif
}
OS_EXIT_CRITICAL();
return OS_Q_OK;
}
else
{
OS_EXIT_CRITICAL();
return OS_Q_FULL;
}
}
#endif
536
537 /*********************************************************************************************************
538 ** 函数名称: OSQNMsgs
539 ** 功能描述: 取得消息队列中消息数
540 ** 输 入: Buf:指向队列的指针
541 ** 输 出: 消息数
542 ** 全局变量: 无
543 ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
544 **
545 ** 作 者: 陈明计
546 ** 日 期: 2002年9月1日
547 **-------------------------------------------------------------------------------------------------------
548 ** 修改人:
549 ** 日 期:
550 **-------------------------------------------------------------------------------------------------------
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 10
551 ********************************************************************************************************/
552 #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
570
571 /*********************************************************************************************************
572 ** 函数名称: OSQSize
573 ** 功能描述: 取得消息队列总容量
574 ** 输 入: Buf:指向队列的指针
575 ** 输 出: 消息队列总容量
576 ** 全局变量: 无
577 ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
578 **
579 ** 作 者: 陈明计
580 ** 日 期: 2002年9月1日
581 **-------------------------------------------------------------------------------------------------------
582 ** 修改人:
583 ** 日 期:
584 **-------------------------------------------------------------------------------------------------------
585 ********************************************************************************************************/
586 #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
608
609 /*********************************************************************************************************
610 ** 函数名称: OSQFlush
611 ** 功能描述: 清空队列
612 ** 输 入: Buf:指向队列的指针
C51 COMPILER V8.05a OS_Q 03/10/2007 13:05:45 PAGE 11
613 ** 输 出: 无
614 ** 全局变量: 无
615 ** 调用模块: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
616 **
617 ** 作 者: 陈明计
618 ** 日 期: 2002年9月1日
619 **-------------------------------------------------------------------------------------------------------
620 ** 修改人: 陈明计
621 ** 日 期: 2002年10月26日
622 **-------------------------------------------------------------------------------------------------------
623 ** 修改人:
624 ** 日 期:
625 **-------------------------------------------------------------------------------------------------------
626 ********************************************************************************************************/
627 #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
645
646 #endif
647 /*********************************************************************************************************
648 ** End Of File
649 ********************************************************************************************************/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 340 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -