linux使用循环队列,一个循环队列在linux下的应用

typedef struct

{

int ReadPt;    /* 循环队列只能在队列头读操作 */

int WritePt;/* 循环队列只能在队列尾写操作 */

unsigned char DataQueue[RingBufferMaxSize];

}RingBuffer;

/**************************************************

*Function:    InitQueue( RingBuffer *Queue )

*

*ShortDesc:    创建一个空队列

*

*Inputs:    循环队列地址

*

****************************************************/

void InitQueue( RingBuffer *Queue )

{

int i;

Queue->ReadPt = Queue->WritePt = 0;

for (i = 0; i < RingBufferMaxSize; i++ )

{

Queue->DataQueue[i] = 0;

}

}

/**************************************************

*Function:    IsFullQueue(RingBuffer *Queue)

*

*ShortDesc:    判断队列是否是满

*

*Inputs:    循环队列地址

*

****************************************************/

bool IsFullQueue( RingBuffer *Queue )

{

/* 写指针+1等于读指针 */

if ( (Queue->WritePt + 1) % RingBufferMaxSize == Queue->ReadPt )

return true;

else

return false;

}

/**************************************************

*Function:    IsEmptyQueue(RingBuffer *Queue)

*

*ShortDesc:    判断队列是否是空

*

*Inputs:    循环队列地址

*

****************************************************/

bool IsEmptyQueue( RingBuffer *Queue )

{

/* 读指针等于写指针 */

if ( Queue->ReadPt == Queue->WritePt )

return true;

else

return false;

}

/**************************************************

*Function:    WriteQueue( RingBuffer *Queue,int inData )

*

*ShortDesc:    向循环队列中写入数据

*

*Inputs:    循环队列地址,写入的数据

*

****************************************************/

bool WriteQueue( RingBuffer *Queue,unsigned char inData )

{

/* 判断是否是满 */

if ( IsFullQueue( Queue ) )

return false;

else

{

Queue->DataQueue[Queue->WritePt] = inData;            //写入数据

Queue->WritePt = ( Queue->WritePt + 1 ) % RingBufferMaxSize;    //写指针加1

return true;

}

}

/**************************************************

*Function:    ReadQueue( RingBuffer *Queue,int OutData )

*

*ShortDesc:    从循环队列中读出数据

*

*Inputs:    循环队列地址

*

*Outputs:    读出的数据

*

****************************************************/

bool ReadQueue( RingBuffer *Queue,unsigned char *outData )

{

/* 判断是否是空*/

if ( IsEmptyQueue( Queue ) )

{

return false;

}

else

{

*outData = Queue->DataQueue[Queue->ReadPt];            //读出数据

Queue->DataQueue[Queue->ReadPt] = 0;

Queue->ReadPt = ( Queue->ReadPt + 1 ) % RingBufferMaxSize;    //读指针加1

return true;

}

}

/**************************************************

*Function:    CalcNumNotRead( RingBuffer *Queue )

*

*ShortDesc:    计算没有被读到的个数

*

*Inputs:    循环队列地址

*

****************************************************/

int CalcNumNotRead( RingBuffer *Queue )

{

return ( Queue->WritePt + RingBufferMaxSize - Queue->ReadPt ) % RingBufferMaxSize;

}

/**************************************************

*Function:    CalcNumRevSpace( RingBuffer *Queue )

*

*ShortDesc:    计算剩余空间个数(保留空间)

*

*Inputs:    循环队列地址

*

****************************************************/

int CalcNumRevSpace( RingBuffer *Queue )

{

return RingBufferMaxSize - CalcNumNotRead( Queue );

}

/**************************************************

*Function:   udelay(int us_count)

*

*ShortDesc:    延时函数

*

*Inputs:    延时时间um

*

****************************************************/

void udelay(int us_count)

{

struct timeval  tpStart,tpEnd;

float timeUse;

gettimeofday(&tpStart, NULL);

do {

gettimeofday(&tpEnd, NULL);

timeUse = 1000000 * (tpEnd.tv_sec - tpStart.tv_sec) + (tpEnd.tv_usec - tpStart.tv_usec);

} while(timeUse < us_count);

return;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值