搜索
bottom↓
回复: 16

请教傻孩子:你的AVR的工程模板里的环形队列怎么用?在GCC环境下,是下面这么用吗【恢复】

[复制链接]

出0入0汤圆

发表于 2008-12-31 08:36:57 | 显示全部楼层 |阅读模式
START_DEFINE_ADT_QUEUE(VoiceBuff,20);                   //定义一个环转缓冲区

END_DEFINE_ADT_QUEUE;

ADT_Queue_Add_To_Buffer(&(ADT_QUEUE(VoiceBuff)),0x01);   //向环状缓冲区添加一个字节

出0入0汤圆

 楼主| 发表于 2008-12-31 20:23:08 | 显示全部楼层
谢谢

出0入296汤圆

发表于 2008-12-31 19:47:16 | 显示全部楼层
针对你的应用,范例:



在.c文件中:



START_DEFINE_QUEUE

    (

        VoiceBuffer,         //队列名称

        20,                  //队列的大小

        unsigned int,        //数据元素的类型

        unsigned char        //如果队列的大小小于256,请使用unsigned char

    )                        //注意,这个宏最好别加分号



END_DEFINE_QUEUE



如果这个队列要被别的.c文件使用,就在.h里面加入下面的内容



EXTERN_REFERENCE_QUEUE

    (

        VoiceBuffer,         //队列名称

        unsigned int,        //数据元素的类型

        unsigned char        //如果队列的大小小于256,请使用unsigned char

    )                        //注意,这个宏最好别加分号





如果我们要像队列里面添加元素

ADD_QUEUE_DATA(VoiceBuffer,0x1234);

注意,这个函数如果添加成功会返回TRUE也就是非0值,否则是FASLE,也就是0



如果我们要从队列里面取元素

unsigned int wTempData;

GET_QUEUE_DATA(VoiceBuffer,wTempData);

注意,如果成功的从队列里面取出数据,将返回TRUE,wTempData里面存放的就是取

出的数据,否则返回FALSE,并且wTempData的数据无意义。使用上述形势时,无需

传递wTempData的指针。





检查队列是否为空,如果为空,返回TRUE

CHECK_QUEUE_EMPTY(VoiceBuffer)



获取当前对立里面元素个数

GET_QUEUE_COUNT(VoiceBuffer)



Have a good time

出0入296汤圆

发表于 2008-12-31 19:32:21 | 显示全部楼层
给你一个新的模板RD_TPL_QUEUE.h






#ifndef _USE_TPL_QUEUE_H_

#define _USE_TPL_QUEUE_H_

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

*   模板库说明:环形队列模板                               *

*   版本:      v1.10                                      *

*   作者:      王卓然                                     *

*   创建日期:  2008年1月19日                              *

* -------------------------------------------------------- *

*  [支 持 库]                                              *

*   支持库名称:RD_MacroAndConst.h                         *

*   需要版本:  v0.04 &abv                                 *

*   支持库说明:系统常用宏定义库                           *

* -------------------------------------------------------- *

*  [版本更新]                                              *

*   修改:      王卓然                                     *

*   修改日期:  2008年3月8日                               *

*   版本:      v1.10                                      *

* -------------------------------------------------------- *

*  [版本历史]                                              *

*       v1.00   提供了基本的代码模板和基本的队列操作函数。 *

*       v1.10   增加了一个扩展的Peek函数,可以连续的向后预 *

*               读队列中的内容。并增加了队列清空的函数。   *

* -------------------------------------------------------- *

*  [使用说明]                                              *

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



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

* 头 文 件 配 置 区 *

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

# include "RD_MacroAndConst.h"



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

*   系 统 宏 定 义  *

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



/*------------------*

*   常 数 宏 定 义  *

*------------------*/



/*------------------*

*   动 作 宏 定 义  *

*------------------*/

# define START_DEFINE_QUEUE(__NAME,__SIZE,__TYPE,__POS_TYPE)  \

                __TYPE  s_Queue##__NAME##Buffer[(__SIZE)] = {0};\

                __POS_TYPE  s_Queue##__NAME##Tail = 0;\

                __POS_TYPE  s_Queue##__NAME##Head = 0;\

                __POS_TYPE  s_Queue##__NAME##Counter = 0;\

                __POS_TYPE  s_Queue##__NAME##PeekCounter = 0;\

                \

                BOOL Queue_##__NAME##_Add_Data(__TYPE Data)\

                {\

                    SAFE_CODE_PERFORMANCE\

                    (\

                        if ((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\

                          && (s_Queue##__NAME##Counter != 0))\

                        {\

                            EXIT_SAFE_CODE\

                            return FALSE;\

                        }\

                        \

                        s_Queue##__NAME##Buffer[s_Queue##__NAME##Tail] = Data;\

                        s_Queue##__NAME##Tail = (s_Queue##__NAME##Tail == (__SIZE - 1)) ? \

                                                0 : (s_Queue##__NAME##Tail + 1);\

                        s_Queue##__NAME##Counter++;\

                    )\

                    \

                    return TRUE;\

                }\

                \

                BOOL Queue_##__NAME##_Get_Data(__TYPE *pData)\

                {\

                    SAFE_CODE_PERFORMANCE\

                    (\

                        if (((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\

                          && (s_Queue##__NAME##Counter == 0))\

                          || (pData == NULL))\

                        {\

                            EXIT_SAFE_CODE\

                            return FALSE;\

                        }\

                        \

                        (*pData) = s_Queue##__NAME##Buffer[s_Queue##__NAME##Head];\

                        s_Queue##__NAME##Head = (s_Queue##__NAME##Head == (__SIZE - 1)) ? \

                                                0 : (s_Queue##__NAME##Head + 1);\

                        s_Queue##__NAME##Counter--;\

                        s_Queue##__NAME##PeekCounter = s_Queue##__NAME##Head;\

                    )\

                    \

                    return TRUE;\

                }\

                \

                BOOL Queue_##__NAME##_Peek_Data(__TYPE *pData)\

                {\

                    SAFE_CODE_PERFORMANCE\

                    (\

                        if (((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\

                          && (s_Queue##__NAME##Counter == 0))\

                          || (pData == NULL))\

                        {\

                            EXIT_SAFE_CODE\

                            return FALSE;\

                        }\

                        \

                        (*pData) = s_Queue##__NAME##Buffer[s_Queue##__NAME##Head];\

                    )\

                    \

                    return TRUE;\

                }\

                \

                BOOL Queue_##__NAME##_Check_Empty(void)\

                {\

                    SAFE_CODE_PERFORMANCE\

                    (\

                        if ((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\

                          && (s_Queue##__NAME##Counter == 0))\

                        {\

                            EXIT_SAFE_CODE\

                            return TRUE;\

                        }\

                    )\

                    return FALSE;\

                }\

                \

                __POS_TYPE Queue_##__NAME##_Get_Count(void)\

                {\

                    return s_Queue##__NAME##Counter;\

                }\

                BOOL Queue_##__NAME##_Peek_Extend(__TYPE *pData)\

                {\

                    SAFE_CODE_PERFORMANCE\

                    (\

                        if ((s_Queue##__NAME##PeekCounter == s_Queue##__NAME##Tail)\

                            || (pData == NULL))\

                        {\

                            EXIT_SAFE_CODE\

                            return FALSE;\

                        }\

                        \

                        (*pData) = s_Queue##__NAME##Buffer[s_Queue##__NAME##PeekCounter];\

                        s_Queue##__NAME##PeekCounter++;\

                        s_Queue##__NAME##PeekCounter = (s_Queue##__NAME##PeekCounter == (__SIZE - 1)) ? \

                                                0 : (s_Queue##__NAME##PeekCounter + 1);\

                    )\

                    \

                    return TRUE;\

                }\

                void Queue_##__NAME##_Reset_Peek_Counter(void)\

                {\

                    SAFE_CODE_PERFORMANCE\

                    (\

                        s_Queue##__NAME##PeekCounter = s_Queue##__NAME##Head;\

                    )\

                }\

                void Queue_##__NAME##_Clear(void)\

                {\

                    SAFE_CODE_PERFORMANCE\

                    (\

                        s_Queue##__NAME##Tail = s_Queue##__NAME##Head;\

                        s_Queue##__NAME##Counter = 0;\

                        s_Queue##__NAME##PeekCounter = s_Queue##__NAME##Head;\

                    )\

                }

                

                

# define END_DEFINE_QUEUE



# define GET_QUEUE_DATA(__NAME,__ADDR)          Queue_##__NAME##_Get_Data(__ADDR)

# define PEEK_QUEUE_DATA(__NAME,__ADDR)         Queue_##__NAME##_Peek_Data(__ADDR)

# define ADD_QUEUE_DATA(__NAME,__VAR)           Queue_##__NAME##_Add_Data(__VAR)

# define GET_QUEUE_COUNT(__NAME)                Queue_##__NAME##_Get_Count()

# define CHECK_QUEUE_EMPTY(__NAME)              Queue_##__NAME##_Check_Empty()

# define PEEK_QUEUE_DATA_EXTEND(__NAME,__ADDR)  Queue_##__NAME##_Peek_Extend(__ADDR)

# define RESET_PEEK_COUNTER(__NAME)             Queue_##__NAME##_Reset_Peek_Counter();

# define CLEAR_QUEUE(__NAME)                    Queue_##__NAME##_Clear();



# define EXTERN_REFERENCE_QUEUE(__NAME,__TYPE,__POS_TYPE)  \

            extern BOOL Queue_##__NAME##_Add_Data(__TYPE Data);\

            extern BOOL Queue_##__NAME##_Get_Data(__TYPE *pData);\

            extern BOOL Queue_##__NAME##_Peek_Data(__TYPE *pData);\

            extern BOOL Queue_##__NAME##_Check_Empty(void);\

            extern __POS_TYPE Queue_##__NAME##_Get_Count(void);\

            extern BOOL Queue_##__NAME##_Peek_Extend(__TYPE *pData);\

            extern void Queue_##__NAME##_Reset_Peek_Counter(void);\

            extern void Queue_##__NAME##_Clear(void);

            

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

*  用户变量类型定义 *

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



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

*    结构体定义区   *

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



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

*   函 数 引 用 区  *

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



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

*   全局变量引用区  *

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



#endif

出0入0汤圆

发表于 2009-7-24 19:48:29 | 显示全部楼层
傻孩子,是否存在函数空间的浪费?是否还有改进的空间.比如说,声明2个队列,当然它们的名字不同,但队列的元素类型都是char时,即类型相同时,则事实上会有2个函数副本参与编译,代码量增加了.类型相同,名字不同的2个队列其函数体应该是可以共享的

出0入0汤圆

发表于 2009-7-24 22:27:47 | 显示全部楼层
Peek_Extend函数多了一句s_Queue##__NAME##PeekCounter++;\

出0入296汤圆

发表于 2009-7-27 23:29:57 | 显示全部楼层
你说的情况,我有另外一个库……现在这个库,在Flash上肯定有浪费
这个库就是对应单独的队列来说的。

再更新一个版本
#ifndef _USE_TPL_QUEUE_H_
#define _USE_TPL_QUEUE_H_

/*-----------------------------*
*  Macros for others          *
*----------------------------*/
# define START_DEFINE_QUEUE(__NAME,__SIZE,__TYPE,__POS_TYPE)  \
                __TYPE  s_Queue##__NAME##Buffer[(__SIZE)];\
                __POS_TYPE  s_Queue##__NAME##Tail = 0;\
                __POS_TYPE  s_Queue##__NAME##Head = 0;\
                __POS_TYPE  s_Queue##__NAME##Counter = 0;\
                __POS_TYPE  s_Queue##__NAME##Peek = 0;\
                __POS_TYPE  s_Queue##__NAME##PeekMark = 0;\
                __POS_TYPE  s_Queue##__NAME##PeekCounter = 0;\
                \
                ES_BOOL Queue_##__NAME##_Add_Data(__TYPE Data)\
                {\
                    SAFE_CODE_PERFORMANCE\
                    (\
                        if ((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\
                          && (s_Queue##__NAME##Counter != 0))\
                        {\
                            EXIT_SAFE_CODE\
                            return ES_FALSE;\
                        }\
                        \
                        s_Queue##__NAME##Buffer[s_Queue##__NAME##Head] = Data;\
                        s_Queue##__NAME##Head = (s_Queue##__NAME##Head == (__SIZE - 1)) ? \
                                                0 : (s_Queue##__NAME##Head + 1);\
                        s_Queue##__NAME##Counter++;\
                        s_Queue##__NAME##PeekCounter++;\
                    )\
                    \
                    return ES_TRUE;\
                }\
                \
                ES_BOOL Queue_##__NAME##_Get_Data(__TYPE *pData)\
                {\
                    SAFE_CODE_PERFORMANCE\
                    (\
                        if (((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\
                          && (s_Queue##__NAME##Counter == 0))\
                          || (pData == NULL))\
                        {\
                            EXIT_SAFE_CODE\
                            return ES_FALSE;\
                        }\
                        \
                        (*pData) = s_Queue##__NAME##Buffer[s_Queue##__NAME##Tail];\
                        s_Queue##__NAME##Tail = (s_Queue##__NAME##Tail == (__SIZE - 1)) ? \
                                                0 : (s_Queue##__NAME##Tail + 1);\
                        s_Queue##__NAME##Counter--;\
                        s_Queue##__NAME##Peek = s_Queue##__NAME##Tail;\
                        s_Queue##__NAME##PeekCounter = s_Queue##__NAME##Counter;\
                        s_Queue##__NAME##PeekMark = s_Queue##__NAME##Tail;\
                    )\
                    \
                    return ES_TRUE;\
                }\
                \
                ES_BOOL Queue_##__NAME##_Peek_Data(__TYPE *pData)\
                {\
                    SAFE_CODE_PERFORMANCE\
                    (\
                        if (((s_Queue##__NAME##Peek == s_Queue##__NAME##Head)\
                          && (s_Queue##__NAME##PeekCounter == 0))\
                          || (pData == NULL))\
                        {\
                            EXIT_SAFE_CODE\
                            return ES_FALSE;\
                        }\
                        \
                        (*pData) = s_Queue##__NAME##Buffer[s_Queue##__NAME##Peek];\
                        s_Queue##__NAME##Peek = (s_Queue##__NAME##Peek == (__SIZE - 1)) ? \
                                                0 : (s_Queue##__NAME##Peek + 1);\
                        s_Queue##__NAME##PeekCounter--;\
                    )\
                    \
                    return ES_TRUE;\
                }\
                \
                ES_BOOL Queue_##__NAME##_Check_Empty(void)\
                {\
                    SAFE_CODE_PERFORMANCE\
                    (\
                        if ((s_Queue##__NAME##Tail == s_Queue##__NAME##Head)\
                          && (s_Queue##__NAME##Counter == 0))\
                        {\
                            EXIT_SAFE_CODE\
                            return ES_TRUE;\
                        }\
                    )\
                    return ES_FALSE;\
                }\
                \
                __POS_TYPE Queue_##__NAME##_Get_Count(void)\
                {\
                    return s_Queue##__NAME##Counter;\
                }\
                \
                void Queue_##__NAME##_Get_All_Peek(void)\
                {\
                    SAFE_CODE_PERFORMANCE\
                    (\
                        s_Queue##__NAME##Tail = s_Queue##__NAME##Peek;\
                        s_Queue##__NAME##Counter = s_Queue##__NAME##PeekCounter;\
                    )\
                }\
                void Queue_##__NAME##_Mark_Peek_Position(void)\
                {\
                    SAFE_CODE_PERFORMANCE\
                    (\
                        s_Queue##__NAME##PeekMark = s_Queue##__NAME##Tail;\
                    )\
                }\
                void Queue_##__NAME##_Reset_Peek(void)\
                {\
                    SAFE_CODE_PERFORMANCE\
                    (\
                        s_Queue##__NAME##Peek = s_Queue##__NAME##PeekMark;\
                    )\
                }
               
               
               
# define END_DEFINE_QUEUE

# define GET_QUEUE_DATA(__NAME,__ADDR)          Queue_##__NAME##_Get_Data(__ADDR)
# define PEEK_QUEUE_DATA(__NAME,__ADDR)         Queue_##__NAME##_Peek_Data(__ADDR)
# define ADD_QUEUE_DATA(__NAME,__VAR)           Queue_##__NAME##_Add_Data(__VAR)
# define GET_QUEUE_COUNT(__NAME)                Queue_##__NAME##_Get_Count()
# define CHECK_QUEUE_EMPTY(__NAME)              Queue_##__NAME##_Check_Empty()
# define GET_QUEUE_PEEK(__NAME)                 Queue_##__NAME##_Get_All_Peek()
# define MARK_QUEUE_PEEK(__NAME)                Queue_##__NAME##_Mark_Peek_Position()
# define RESET_QUEUE_PEEK(__NAME)               Queue_##__NAME##_Reset_Peek()

# define FN_GET_QUEUE_DATA(__NAME)              Queue_##__NAME##_Get_Data
# define FN_PEEK_QUEUE_DATA(__NAME)             Queue_##__NAME##_Peek_Data
# define FN_ADD_QUEUE_DATA(__NAME)              Queue_##__NAME##_Add_Data
# define FN_GET_QUEUE_COUNT(__NAME)             Queue_##__NAME##_Get_Count
# define FN_CHECK_QUEUE_EMPTY(__NAME)           Queue_##__NAME##_Check_Empty
# define FN_GET_QUEUE_PEEK(__NAME)              Queue_##__NAME##_Get_All_Peek
# define FN_MARK_QUEUE_PEEK(__NAME)             Queue_##__NAME##_Mark_Peek_Position
# define FN_RESET_QUEUE_PEEK(__NAME)            Queue_##__NAME##_Reset_Peek

# define EXTERN_REFERENCE_QUEUE(__NAME,__TYPE,__POS_TYPE)  \
            extern ES_BOOL Queue_##__NAME##_Add_Data(__TYPE Data);\
            extern ES_BOOL Queue_##__NAME##_Get_Data(__TYPE *pData);\
            extern ES_BOOL Queue_##__NAME##_Peek_Data(__TYPE *pData);\
            extern ES_BOOL Queue_##__NAME##_Check_Empty(void);\
            extern __POS_TYPE Queue_##__NAME##_Get_Count(void);\
            extern void Queue_##__NAME##_Get_All_Peek(void);\
            extern void Queue_##__NAME##_Mark_Peek_Position(void);\
            extern void Queue_##__NAME##_Reset_Peek(void);
            
/*-----------------------------*
*  type definitions           *
*----------------------------*/


#endif

出0入0汤圆

发表于 2010-9-15 09:17:10 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-9-15 09:55:57 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-18 11:53:58 | 显示全部楼层
哈哈,正需要呢

出0入0汤圆

发表于 2011-8-17 11:59:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-17 12:28:24 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-5-8 20:37:21 | 显示全部楼层
怎么是乱码呢??

出0入0汤圆

发表于 2012-5-10 16:26:37 | 显示全部楼层
请问傻孩子,在工程模板中多串口应用模板范例有没更新?现在使用两个串口,把NAME定义为UART0,UART1后,编译时提示ADT_UART0_RX 没有声明?

对于这种宏定义嵌套的情况,怎样进行外部声明?

出0入296汤圆

发表于 2012-7-26 18:39:01 | 显示全部楼层
哇嘎 发表于 2012-5-10 16:26
请问傻孩子,在工程模板中多串口应用模板范例有没更新?现在使用两个串口,把NAME定义为UART0,UART1后,编 ...

有更新,参考这个帖子里面给出的工程代码,有问题请继续在这个帖子里面问
http://www.amobbs.com/thread-5468708-1-4.html

出0入0汤圆

发表于 2012-7-27 10:17:51 | 显示全部楼层
是答非所问,还是我看不懂呀。咋就是找不到相关内容呢?

出0入296汤圆

发表于 2012-7-27 23:11:28 | 显示全部楼层
哇嘎 发表于 2012-7-27 10:17
是答非所问,还是我看不懂呀。咋就是找不到相关内容呢?

我现在也晕了,你能找到具体哪个帖子说的多串口模板么?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 09:58

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表