?? queue.c
字號(hào):
{ /* 滿 */
err = OS_Q_FULL;
if (Queue->WriteFull != NULL) /* 調(diào)用用戶處理函數(shù) */
{
err = Queue->WriteFull(Queue, Data, Q_WRITE_FRONT_MODE);
}
}
OS_EXIT_CRITICAL();
}
return err;
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱: QueueNData
** 功能描述: 取得隊(duì)列中數(shù)據(jù)數(shù)
** 輸 入: Buf:指向隊(duì)列的指針
** 輸 出: 消息數(shù)
** 全局變量: 無(wú)
** 調(diào)用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陳明計(jì)
** 日 期: 2003年7月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef EN_QUEUE_NDATA
#define EN_QUEUE_NDATA 0
#endif
#if EN_QUEUE_NDATA > 0
uint16 QueueNData(void *Buf)
{
uint16 temp;
temp = 0; /* 隊(duì)列無(wú)效返回0 */
if (Buf != NULL)
{
OS_ENTER_CRITICAL();
temp = ((DataQueue *)Buf)->NData;
OS_EXIT_CRITICAL();
}
return temp;
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱: QueueSize
** 功能描述: 取得隊(duì)列總?cè)萘?** 輸 入: Buf:指向隊(duì)列的指針
** 輸 出: 隊(duì)列總?cè)萘?** 全局變量: 無(wú)
** 調(diào)用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陳明計(jì)
** 日 期: 2003年7月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef EN_QUEUE_SIZE
#define EN_QUEUE_SIZE 0
#endif
#if EN_QUEUE_SIZE > 0
uint16 QueueSize(void *Buf)
{
uint16 temp;
temp = 0; /* 隊(duì)列無(wú)效返回0 */
if (Buf != NULL)
{
OS_ENTER_CRITICAL();
temp = ((DataQueue *)Buf)->MaxData;
OS_EXIT_CRITICAL();
}
return temp;
}
#endif
/*********************************************************************************************************
** 函數(shù)名稱: OSQFlush
** 功能描述: 清空隊(duì)列
** 輸 入: Buf:指向隊(duì)列的指針
** 輸 出: 無(wú)
** 全局變量: 無(wú)
** 調(diào)用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陳明計(jì)
** 日 期: 2003年7月2日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef EN_QUEUE_FLUSH
#define EN_QUEUE_FLUSH 0
#endif
#if EN_QUEUE_FLUSH > 0
void QueueFlush(void *Buf)
{
DataQueue *Queue;
if (Buf != NULL) /* 隊(duì)列是否有效 */
{ /* 有效 */
Queue = (DataQueue *)Buf;
OS_ENTER_CRITICAL();
Queue->Out = Queue->Buf;
Queue->In = Queue->Buf;
Queue->NData = 0; /* 數(shù)據(jù)數(shù)目為0 */
OS_EXIT_CRITICAL();
}
}
#endif
int QueueWriteBlock(void * Buf, QUEUE_DATA_TYPE * Data, int WriteDataLen, BOOLEAN LessWrite)
{
uint8 err;
DataQueue *Queue;
int i;
err = NOT_OK;
if (Buf != NULL) /* 隊(duì)列是否有效 */
{
Queue = (DataQueue *)Buf;
OS_ENTER_CRITICAL();
if ((Queue->NData + WriteDataLen)<= Queue->MaxData) /* 隊(duì)列是否滿 */
{ /* 不滿 */
i = 0;
while (i < WriteDataLen)
{
Queue->In[0] = *(Data+i);
i++;
Queue->In++;
if (Queue->In >= Queue->End)
{
Queue->In = Queue->Buf;
}
}
Queue->NData = Queue->NData + WriteDataLen;
err = WriteDataLen;
myprintf("inmaxdata\r\n");
}
else if (LessWrite)
{ /* 滿 */
i = 0;
while (i < (Queue->MaxData - Queue->NData))
{
Queue->In[0] = *(Data+i);
i++;
Queue->In++;
if (Queue->In >= Queue->End)
{
Queue->In = Queue->Buf;
}
}
Queue->NData = Queue->MaxData;
err = Queue->MaxData - Queue->NData;
myprintf("inlessdata\r\n");
}
else
{
err = OS_Q_FULL;
if (Queue->WriteFull != NULL) /* 調(diào)用用戶處理函數(shù) */
{
err = Queue->WriteFull(Queue, Data, Q_WRITE_MODE);
}
myprintf("inerrfull\r\n");
}
OS_EXIT_CRITICAL();
}
return err;
}
int QueueReadBlock(QUEUE_DATA_TYPE * Ret, void * Buf, int ReadDataLen, BOOLEAN LessRead)
{
uint8 err;
DataQueue *Queue;
int i;
err = NOT_OK;
if (Buf != NULL) /* 隊(duì)列是否有效 */
{ /* 有效 */
Queue = (DataQueue *)Buf;
OS_ENTER_CRITICAL();
if (Queue->NData >= ReadDataLen) /* 隊(duì)列是否為空 */
{ /* 不空 */
i = 0;
while (i < ReadDataLen)
{
*(Ret + i) = Queue->Out[0]; /* 數(shù)據(jù)出隊(duì) */
Queue->Out++; /* 調(diào)整出隊(duì)指針 */
if (Queue->Out >= Queue->End)
{
Queue->Out = Queue->Buf;
}
i++;
}
Queue->NData = Queue->NData - ReadDataLen; /* 數(shù)據(jù)減少 */
err = ReadDataLen;
}
else if (LessRead)
{
i = 0;
while (i < Queue->NData)
{
*(Ret + i) = Queue->Out[0]; /* 數(shù)據(jù)出隊(duì) */
Queue->Out++; /* 調(diào)整出隊(duì)指針 */
if (Queue->Out >= Queue->End)
{
Queue->Out = Queue->Buf;
}
i++;
}
Queue->NData = 0; /* 數(shù)據(jù)減少 */
err = Queue->NData;
}
else
{ /* 空 */
err = QUEUE_EMPTY;
if (Queue->ReadEmpty != NULL) /* 調(diào)用用戶處理函數(shù) */
{
err = Queue->ReadEmpty(Ret, Queue);
}
}
OS_EXIT_CRITICAL();
}
return err;
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -