fifo的c语言编程,C语言 FIFO(宏)

#if !defined(_MESSAGEOBJECT_H_)

#define _MESSAGEOBJECT_H_

#defineSTART_CRITICAL()EA=0

#defineEND_CRITICAL()EA=1

/***********************************************************************\

Basic Thread/Interrupt Safe Queue Mechanism

\***********************************************************************/

/* 声明FIFO */

#define DECLARE_MSG_QUEUE(NAME,TYPE,SIZE)\

xdata struct\

{\

int    ri;\

int    wi;\

int    max;\

##TYPE buffer[SIZE];\

} ##NAME;

/* 初始化消息队列 */

#define MSG_INITQUEUE(NAME,SIZE)\

{\

##NAME.ri = ##NAME.wi = 0;\

##NAME.max = SIZE;\

}

/* 向FIFO加入一个消息 */

// Prototype: void MSG_ENQUEUE(char *NAME, UCHAR C)

#define MSG_ENQUEUE(NAME,C)\

{\

START_CRITICAL();\

##NAME.buffer[##NAME.wi] = C;\

##NAME.wi++;\

if(##NAME.wi == ##NAME.max) ##NAME.wi=0;\

END_CRITICAL();\

}

/* 向FIFO加入一个串消息 */

// Prototype: void MSG_ENQUEUESTR(char *NAME, UCHAR* S, int LEN)

#define MSG_ENQUEUESTR(NAME,S,LEN)\

{\

int i;\

START_CRITICAL();\

for(i=0;i

{\

##NAME.buffer[##NAME.wi] = *(((UCHAR*)(S))+i);\

##NAME.wi++;\

if(##NAME.wi == ##NAME.max) ##NAME.wi=0;\

}\

END_CRITICAL();\

}

/* 从FIFO读消息*/

// Prototype: void MSG_DEQUEUE(char *NAME, TYPE *BUF, int BUFSIZE, int READ)

#define MSG_DEQUEUE(NAME,BUF,SIZE,READ)\

{\

int i=0;\

START_CRITICAL();\

READ=0;\

while(##NAME.ri != ##NAME.wi && i < SIZE)\

{\

*(BUF+i) = *(##NAME.buffer+##NAME.ri);\

i++;\

##NAME.ri++;\

if(##NAME.ri == ##NAME.max) ##NAME.ri=0;\

}\

READ = i;\

END_CRITICAL();\

}

/* 统计FIFO中消息的数量 */

// Prototype: void MSG_COUNT(char *NAME,int COUNT)

#define MSG_COUNT(NAME,COUNT)\

{\

int i=0;\

START_CRITICAL();\

if(##NAME.ri <= ##NAME.wi)\

COUNT = ##NAME.wi - ##NAME.ri;\

else\

COUNT = ##NAME.wi + (##NAME.max - ##NAME.ri);\

END_CRITICAL();\

}

/* 清空FIFO */

// Prototype: void MSG_FLUSH(char *NAME)

#define MSG_FLUSH(NAME)\

{\

START_CRITICAL();\

##NAME.wi = ##NAME.ri =0;\

END_CRITICAL();\

}

#endif // _MESSAGEOBJECT_H_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值