⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 queue.h

📁 用宏的方法实现fifo,纯c语言实现,大家可以试一试
💻 H
字号:
/*=========================================================================
 Copyright 2007- Jiaxun feihong, Inc.
 程序名称:	queue.h
 作    者:	lijinbin
 工程名称:	
 创建日前:	2007-11-15
 模块描述:	一种简洁的FIFO实现方法
 备    注: 使用时需定义以下宏:
 			(1) START_CRITICAL()
 			(2) END_CRITICAL()

 <修改记录>
 Rev1.00  	2007-11-15   	lijinbin
==========================================================================*/

#if !defined(_MESSAGEOBJECT_H_)
#define _MESSAGEOBJECT_H_

/***********************************************************************\
Basic Thread/Interrupt Safe Queue Mechanism
\***********************************************************************/

/* 声明FIFO */
#define DECLARE_MSG_QUEUE(NAME,TYPE,SIZE)\
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<(LEN);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_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -