//--------------------------------------------------------------------------- //通用缓冲队列 //---------------------------------------------------------------------------- struct QueueBuffer{ unsigned char idata *aBufferStart; //缓冲区起始点 unsigned char idata *aBufferEnd; //缓冲区结束点 unsigned char idata *pIn; //写指针 unsigned char idata *pOut; //读指针 unsigned char mCount; //缓冲区数据个数 };
#ifdef _QueueH //用户可以使用的变量
#else //------------------------------------------------------------ //构造 //------------------------------------------------------------ extern void Queue_Init(void);
//------------------------------------------------------------ //析构,释放在init()中使用到的硬件资源 //------------------------------------------------------------ extern void Queue_Destory(void);
//------------------------------------------------------------ //申请注册缓冲队列 //返回struct QueueBuffer结构指针。 //------------------------------------------------------------ extern struct QueueBuffer idata * Queue_Register( unsigned char mSize );
//------------------------------------------------------------ //将数据压入队列 //------------------------------------------------------------ extern void Queue_Push( struct QueueBuffer idata *pQueueBuffer, unsigned char mData );
//------------------------------------------------------------ //将数据弹出队列 //------------------------------------------------------------ extern unsigned char Queue_Pop( struct QueueBuffer idata *pQueueBuffer );
//------------------------------------------------------------ //读出队列指定序号数据 //------------------------------------------------------------ extern unsigned char Queue_Read( struct QueueBuffer idata *pQueueBuffer, unsigned char mId );
//------------------------------------------------------------ //返回队列数据个数 //------------------------------------------------------------ extern unsigned char Queue_Num( struct QueueBuffer idata *pQueueBuffer );
//------------------------------------------------------------ //队列清空 //------------------------------------------------------------ extern void Queue_Clear( struct QueueBuffer idata *pQueueBuffer );
#endif
//--------------------------------------------------------------------------- //通用缓冲队列 //---------------------------------------------------------------------------- #define _QueueH
#include <reg52.h> #include "Memory.h" #include "Queue.h"
//---------------------------------------------------------------------------- //构造 //---------------------------------------------------------------------------- void Queue_Init(void){ }
//---------------------------------------------------------------------------- //析构,释放在init()中使用到的硬件资源 //---------------------------------------------------------------------------- void Queue_Destory(void){ }
//------------------------------------------------------------ //申请注册缓冲队列 //返回struct QueueBuffer结构指针。 //------------------------------------------------------------ struct QueueBuffer idata * Queue_Register( unsigned char mSize ) { struct QueueBuffer idata *pQueueBuffer; pQueueBuffer = (struct QueueBuffer idata * )Memory_Malloc( sizeof(struct QueueBuffer) ); //分配记录队列信息的结构变量 Memory_Memset( (unsigned char idata *)pQueueBuffer, 0, sizeof(struct QueueBuffer) ); //记录队列信息的结构变量清0
pQueueBuffer->aBufferStart = pQueueBuffer->pIn = pQueueBuffer->pOut = Memory_Malloc( mSize ); //分配队列所需内存 pQueueBuffer->aBufferEnd = pQueueBuffer->aBufferStart + mSize; //队列结束指针
return pQueueBuffer; }
#pragma NOAREGS //------------------------------------------------------------ //将数据压入队列 //------------------------------------------------------------ void Queue_Push( struct QueueBuffer idata * pQueueBuffer, unsigned char mData ) { unsigned char idata *p; p = pQueueBuffer->pIn;
*p++ = mData; if (p == pQueueBuffer->aBufferEnd){ p = pQueueBuffer->aBufferStart; } pQueueBuffer->pIn = p;
pQueueBuffer->mCount ++; }
//------------------------------------------------------------ //将数据弹出队列 //------------------------------------------------------------ unsigned char Queue_Pop( struct QueueBuffer idata *pQueueBuffer ) { unsigned char mData; unsigned char idata *p; p = pQueueBuffer->pOut;
mData = *p; if( ++p == pQueueBuffer->aBufferEnd ){ p = pQueueBuffer->aBufferStart; } pQueueBuffer->pOut = p;
pQueueBuffer->mCount --;
return mData; }
//------------------------------------------------------------ //读出队列指定序号数据 //------------------------------------------------------------ unsigned char Queue_Read( struct QueueBuffer idata *pQueueBuffer, unsigned char mId ) { unsigned char idata *pTemp;
pTemp = pQueueBuffer->pOut + mId; if( pTemp < pQueueBuffer->aBufferEnd )return(*pTemp); else return( *(pTemp - pQueueBuffer->aBufferEnd + pQueueBuffer->aBufferStart) ); }
//------------------------------------------------------------ //返回队列数据个数 //------------------------------------------------------------ unsigned char Queue_Num( struct QueueBuffer idata *pQueueBuffer ) { return pQueueBuffer->mCount; } #pragma AREGS
//------------------------------------------------------------ //队列清空 //------------------------------------------------------------ void Queue_Clear( struct QueueBuffer idata *pQueueBuffer ) { B = IE; //清零阶段禁止中断,防止被使用 EA = 0; pQueueBuffer->pIn = pQueueBuffer->pOut = pQueueBuffer->aBufferStart; pQueueBuffer->mCount = 0; IE = B; }
|