?? os_q.c
字號:
/* 判斷消息入隊前消息隊列是否為空 */
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
**
** 作 者: 陳明計
** 日 期: 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)
#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
**
** 作 者: 陳明計
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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
**
** 作 者: 陳明計
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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
**
** 作 者: 陳明計
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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
**
** 作 者: 陳明計
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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
**
** 作 者: 陳明計
** 日 期: 2002年9月1日
**-------------------------------------------------------------------------------------------------------
** 修改人: 陳明計
** 日 期: 2002年10月26日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#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 + -