?? queue.bak
字號:
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef EN_QUEUE_NDATA
#define EN_QUEUE_NDATA 0
#endif
#if EN_QUEUE_NDATA > 0
uint16 QueueNData(void *Buf)
{
uint16 temp;
temp = 0; /* 隊列無效返回0 */
if (Buf != NULL)
{
OS_ENTER_CRITICAL();
temp = ((DataQueue *)Buf)->NData;
OS_EXIT_CRITICAL();
}
return temp;
}
#endif
/*********************************************************************************************************
** 函數名稱: QueueSize
** 功能描述: 取得隊列總容量
** 輸 入: Buf:指向隊列的指針
** 輸 出: 隊列總容量
** 全局變量: 無
** 調用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陳明計
** 日 期: 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; /* 隊列無效返回0 */
if (Buf != NULL)
{
OS_ENTER_CRITICAL();
temp = ((DataQueue *)Buf)->MaxData;
OS_EXIT_CRITICAL();
}
return temp;
}
#endif
/*********************************************************************************************************
** 函數名稱: OSQFlush
** 功能描述: 清空隊列
** 輸 入: Buf:指向隊列的指針
** 輸 出: 無
** 全局變量: 無
** 調用模塊: OS_ENTER_CRITICAL,OS_EXIT_CRITICAL
**
** 作 者: 陳明計
** 日 期: 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) /* 隊列是否有效 */
{ /* 有效 */
Queue = (DataQueue *)Buf;
OS_ENTER_CRITICAL();
Queue->Out = Queue->Buf;
Queue->In = Queue->Buf;
Queue->NData = 0; /* 數據數目為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) /* 隊列是否有效 */
{
Queue = (DataQueue *)Buf;
OS_ENTER_CRITICAL();
if ((Queue->NData + WriteDataLen)<= Queue->MaxData) /* 隊列是否滿 */
{ /* 不滿 */
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) /* 調用用戶處理函數 */
{
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) /* 隊列是否有效 */
{ /* 有效 */
Queue = (DataQueue *)Buf;
OS_ENTER_CRITICAL();
if (Queue->NData >= ReadDataLen) /* 隊列是否為空 */
{ /* 不空 */
i = 0;
while (i < ReadDataLen)
{
*(Ret + i) = Queue->Out[0]; /* 數據出隊 */
Queue->Out++; /* 調整出隊指針 */
if (Queue->Out >= Queue->End)
{
Queue->Out = Queue->Buf;
}
i++;
}
Queue->NData = Queue->NData - ReadDataLen; /* 數據減少 */
err = ReadDataLen;
}
else if (LessRead)
{
i = 0;
while (i < Queue->NData)
{
*(Ret + i) = Queue->Out[0]; /* 數據出隊 */
Queue->Out++; /* 調整出隊指針 */
if (Queue->Out >= Queue->End)
{
Queue->Out = Queue->Buf;
}
i++;
}
Queue->NData = 0; /* 數據減少 */
err = Queue->NData;
}
else
{ /* 空 */
err = QUEUE_EMPTY;
if (Queue->ReadEmpty != NULL) /* 調用用戶處理函數 */
{
err = Queue->ReadEmpty(Ret, Queue);
}
}
OS_EXIT_CRITICAL();
}
return err;
}
/*********************************************************************************************************
** 函數名稱 :IRQ_Eint0()
** 函數功能 :外部中斷0 EINT0服務程序口。
** 入口參數 :無。
** 出口擦數 :無。
*********************************************************************************************************
*/
void Eint0_Exception(void)
{
uint32 i;
uint8 tempchar;
DataQueue *Queue;
Queue = (DataQueue *)RcvSendBuf;
EXTINT = 0x01;
tempchar = ((IO0PIN & 0x00600000) >> 21)| //P0.22 P0.21
((IO1PIN & 0x00040000) >> 16)| //P1.18
((IO0PIN & 0x0E000000) >> 22)| //P0.27 P0.26 P0.25
((IO1PIN & 0x00020000) >> 11)| //P1.17
((IO0PIN & 0x10000000) >> 21); //P0.28
//QueueWrite((void *)RcvSendBuf, tempchar);
//if (Queue->NData < Queue->MaxData) /* 隊列是否滿 */
//{ /* 不滿 */
Queue->In[0] = tempchar; /* 數據入隊 */
Queue->In++; /* 調整入隊指針*/
if (Queue->In >= Queue->End)
{
Queue->In = Queue->Buf;
}
Queue->NData++; /* 數據增加 */
//}
VICVectAddr = 0;
/* 等待外部中斷信號恢復為高電平
若信號保持為低電平,中斷標志會一直置位。*/
//while ((EXTINT & 0x01) != 0)
//{
EXTINT = 0x01; /* 清除EINT0中斷標志 */
//}
VICVectAddr = 0; /* 向量中斷結束 */
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -