?? 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 + -