搜索
bottom↓
12
返回列表 发新帖
楼主: sochen1987

精简通用环形fifo

  [复制链接]

出0入0汤圆

发表于 2014-3-24 13:56:58 | 显示全部楼层
好帖,收藏了

出0入0汤圆

发表于 2014-3-26 10:21:51 | 显示全部楼层
保存!mark!!

出0入0汤圆

发表于 2014-4-1 13:40:34 | 显示全部楼层
精简通用环形FIFO,标记

出0入0汤圆

发表于 2014-4-7 19:42:09 | 显示全部楼层
刚好需要呢,哎,一直不会写的说

出0入0汤圆

发表于 2014-4-17 09:11:41 | 显示全部楼层
必须标记,十分有用

出0入0汤圆

发表于 2014-4-17 09:37:32 | 显示全部楼层
好资料啊,收藏了

出0入53汤圆

发表于 2014-6-25 21:10:11 | 显示全部楼层
学习了,

出0入0汤圆

发表于 2014-8-19 10:44:04 | 显示全部楼层
学习下   FIFO

出0入0汤圆

发表于 2014-10-19 20:22:54 | 显示全部楼层
很深的体会, 努力学习

出0入0汤圆

发表于 2014-10-30 16:26:49 来自手机 | 显示全部楼层
好好学习~

出0入0汤圆

发表于 2014-10-30 16:44:09 | 显示全部楼层
mark一下 ,以备后需使用啊

出0入0汤圆

发表于 2014-10-30 17:04:36 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2014-10-30 20:11:29 | 显示全部楼层
看了好多遍了  理解原理 就是自己不知道怎么写

出0入0汤圆

发表于 2014-11-7 16:22:15 来自手机 | 显示全部楼层
收藏,学习

出0入10汤圆

发表于 2014-11-9 18:49:35 | 显示全部楼层
chencc8 发表于 2013-1-11 20:07
和傻孩子大哥的比 我的例子的没有那么多奇奇怪怪的宏定义,可读性好那么一丁点,并且同样实现了可复用性, ...

谢谢大哥,果然比傻孩子的明白得多,写得不错!!

出0入0汤圆

发表于 2014-11-9 18:57:55 | 显示全部楼层
fifo技术贴,感谢分享,记号备用。

出0入10汤圆

发表于 2014-11-9 19:20:22 | 显示全部楼层
chencc8 发表于 2013-1-11 20:04
哈哈我也有,这是最近公司给新员工办的科技论文大赛的产品,前几天为了攒车费 我也凑热闹参加了,因为时间 ...

缓冲区元素的长度命名的话可以用有Byte相关的名字就容易区分啊

出0入0汤圆

发表于 2014-11-9 19:25:26 | 显示全部楼层
MARK  循环队列

出0入0汤圆

发表于 2014-11-9 19:30:14 | 显示全部楼层
10xjzheng 发表于 2014-11-9 19:20
缓冲区元素的长度命名的话可以用有Byte相关的名字就容易区分啊

这个队列,我一直没有用到实际的工程中,用作验证技术而已~~
我比较喜欢在裸机环境下使用的,还是类似楼主位的队列宏.

出0入0汤圆

发表于 2014-11-9 19:33:06 | 显示全部楼层
占座学习

出0入10汤圆

发表于 2014-11-9 19:38:00 | 显示全部楼层
chencc8 发表于 2014-11-9 19:30
这个队列,我一直没有用到实际的工程中,用作验证技术而已~~
我比较喜欢在裸机环境下使用的,还是类似楼 ...

大神,有QQ吗?

出0入10汤圆

发表于 2014-11-9 20:27:41 | 显示全部楼层
chencc8 发表于 2014-11-9 19:30
这个队列,我一直没有用到实际的工程中,用作验证技术而已~~
我比较喜欢在裸机环境下使用的,还是类似楼 ...

当队列在不同的文件中使用的时候,这个宏就会带来麻烦!
/*创建队列并初始化*/
#define CREAT_QUEUE(QueueName, type, pCopy, Size, Leng) \
        type static QueueName##Buff[Size]; \
        Queue static QueueName = { \
            QueueName##Buff, pCopy, Size, Leng, 0, 0, 1 \
        }

出0入0汤圆

发表于 2014-11-9 20:50:05 | 显示全部楼层
10xjzheng 发表于 2014-11-9 20:27
当队列在不同的文件中使用的时候,这个宏就会带来麻烦!
/*创建队列并初始化*/
#define CREAT_QUEUE(Queu ...

试下
#define CREAT_QUEUE(QueueName, type, pCopy, Size, Leng) \
        type staic QueueName##Buff【Size】; \
        Queue  QueueName = { \
            QueueName##Buff, pCopy, Size, Leng, 0, 0, 1 \
        }

//声明
#define DECLARATION_QUEUE(QueueName) \
    extern Queue  QueueName;
     }


我这几年用的队列宏,在生成相应的数据结构和读写API后,甚至还需要手动在头文件中extern 需要在外部用到的API

出0入0汤圆

发表于 2014-11-9 20:56:40 | 显示全部楼层
大神出没,学习

出0入10汤圆

发表于 2014-11-9 21:01:23 | 显示全部楼层
chencc8 发表于 2014-11-9 20:50
试下
#define CREAT_QUEUE(QueueName, type, pCopy, Size, Leng) \
        type staic QueueName##Buff ...

我刚才是直接声明,刚才试了其他的办法来避免这个问题,然后失败了,也只能这样子了。大神,这样的程序写得非常好,今天学到不少,还有没有可以让我学习学习的程序?

出0入0汤圆

发表于 2015-2-12 16:41:50 | 显示全部楼层
chencc8 发表于 2014-11-9 20:50
试下
#define CREAT_QUEUE(QueueName, type, pCopy, Size, Leng) \
        type staic QueueName##Buff ...

你这个队列坑了我最近的项目,讨论下是你队列的硬伤还是我用得不对。main当中提取数据,串口中断中插入数据,这样子一段高速测试之后就会出现问题,因为当中没有保证读取的原子性,比如读取一半进入中断然后插入数据,队列结构体就被破坏了

出0入0汤圆

发表于 2015-3-2 14:48:21 | 显示全部楼层
傻孩子面向对象的思路很厉害~   c语言真是博大精深   

出0入0汤圆

发表于 2015-3-4 08:31:19 | 显示全部楼层
weshare 发表于 2015-2-12 16:41
你这个队列坑了我最近的项目,讨论下是你队列的硬伤还是我用得不对。main当中提取数据,串口中断中插入数 ...

这只是学习验证性质的程序,我也没考虑过将它用到自己的工程中,所以没添加中断临界区,更没考虑如何让临界区最小的问题。
但如果真想用的话,可以沿着这套思路,将自己常用的队列修改成这种可重用队列来。

出0入0汤圆

发表于 2015-3-4 09:48:49 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2015-3-4 11:57:20 | 显示全部楼层
傻孩子老师牛,

出0入0汤圆

发表于 2015-3-4 12:19:47 | 显示全部楼层
都是高手啊,拜膜,暂时没用这个

出0入0汤圆

发表于 2015-3-4 12:41:55 | 显示全部楼层
傻孩子的不错,标记!

出0入0汤圆

发表于 2015-3-4 14:02:29 | 显示全部楼层
很复杂,也很强大

出0入0汤圆

发表于 2015-3-4 14:13:56 | 显示全部楼层
各种利害,学习了

出0入0汤圆

发表于 2015-3-4 21:29:01 | 显示全部楼层
chencc8 发表于 2015-3-4 08:31
这只是学习验证性质的程序,我也没考虑过将它用到自己的工程中,所以没添加中断临界区,更没考虑如何让临 ...

嗯,我最后用了论坛上一个DMA做成的FIFO,不用中断

出0入0汤圆

发表于 2015-3-5 08:46:39 | 显示全部楼层
weshare 发表于 2015-3-4 21:29
嗯,我最后用了论坛上一个DMA做成的FIFO,不用中断

额……我以前用DMA的时候一样会用到中断,还是两个中断一个定时 一个DMA满。

出0入0汤圆

发表于 2015-3-26 21:00:35 | 显示全部楼层
楼主,这个FIFO 出队如何加上队列满和队列空返回值呢?试了一下 不成功呢。用到了##这种连接符,不知道如何处理。

出0入296汤圆

发表于 2015-3-29 10:44:47 | 显示全部楼层
byrin219 发表于 2015-3-26 21:00
楼主,这个FIFO 出队如何加上队列满和队列空返回值呢?试了一下 不成功呢。用到了##这种连接符,不知道如 ...

##是宏连接符,可以去百度下。

出0入0汤圆

发表于 2015-3-29 12:05:57 | 显示全部楼层
好好学习,天天向上

出0入0汤圆

发表于 2015-4-13 14:12:11 | 显示全部楼层
//! 定义了一个专门的byte队列类型,这个队列用uint16_t作为计数器类型,所以,可以处理0~65535个元素, 用bool作为临界区变量类型
DEF_SAFE_QUEUE_U8(byte_queue, uint16_t, bool)
END_DEF_SAFE_QUEUE_U8

DEF_SAFE_QUEUE(__NAME, uint8_t, __PTR_TYPE, __MUTEX_TYPE)
DEF_QUEUE_EX(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE, SAFE_ATOM_CODE)
                               
#define DEF_QUEUE_EX(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE, __ATOM_ACCESS)  \
typedef struct {                                                          \
    uint8_t       *ptBuffer;                                              \
    uint16_t      tSize;                                                  \
    uint16_t      tHead;                                                  \
    uint16_t      tTail;                                                  \
    uint16_t      tCounter;                                               \
    bool          tMutex;                                                 \
                }__byte_queue_queue_t;                                                \
typedef struct {                                                          \
        uint8_t chMask[sizeof(__byte_queue_queue_t)];                     \
    }byte_queue_queue_t;


类型定义依次展开

这个fifo代码尺寸会随着对象的数量而增加,对么?

出0入0汤圆

发表于 2015-4-13 14:12:36 | 显示全部楼层
本帖最后由 worldsing 于 2015-4-13 14:23 编辑

#define NONE_ATOM_ACCESS(__CODE)        {__CODE;}

#define DEF_QUEUE(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE)                 \
        DEF_QUEUE_EX(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE, NONE_ATOM_ACCESS)


定义里的NONE_ATOM_ACCESS 会不会有问题,应该参数吧?

明白了,NONE_ATOM_ACCESS 在这也是套个壳

出0入0汤圆

发表于 2015-4-13 14:20:03 | 显示全部楼层
bygreencn 发表于 2013-1-15 17:37
挑个次,好像楼主的两个地方的定义有问题,编译不过,应该是这样才对
/* 创建FIFO */
#define CREAT_MY_FIF ...

刚测试楼主队列,编译不通过,百度一下说变量初始化不对,仔细看了下发现确实是你说的这个这个问题。
要把
  1. /* 创建FIFO */
  2. #define CREAT_MY_FIFO(fifo,type,size)                        \
  3.                 type  fifo;                              \
  4.                 type *fifo##_in = fifo;                        \
  5.                 type *fifo##_out = fifo                 
复制代码

改成这样
  1. /* 创建FIFO */
  2. #define CREAT_MY_FIFO(fifo,type,size)                        \
  3.                 type  fifo[size];                              \
  4.                 type *fifo##_in = fifo;                        \
  5.                 type *fifo##_out = fifo                 
复制代码

出0入0汤圆

发表于 2015-4-13 14:28:01 | 显示全部楼层
DEF_SAFE_QUEUE(__NAME, uint32_t __PTR_TYPE, __MUTEX_TYPE)

uint32_t  是可以是typedef 的类型 (实现任意类型的FIFO)

对么傻孩子老师?

出0入0汤圆

发表于 2015-4-13 15:15:44 | 显示全部楼层
我自己也写过一个,早知道不写了

出0入296汤圆

发表于 2015-4-13 17:32:00 | 显示全部楼层
worldsing 发表于 2015-4-13 14:28
DEF_SAFE_QUEUE(__NAME, uint32_t __PTR_TYPE, __MUTEX_TYPE)

uint32_t  是可以是typedef 的类型 (实现任 ...

你在哪里看到这段话的……原文应该是:

  1. #define DEF_SAFE_QUEUE(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE)            \
  2.         DEF_QUEUE_EX(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE, SAFE_ATOM_CODE)
复制代码

出0入296汤圆

发表于 2015-4-13 17:34:00 | 显示全部楼层
worldsing 发表于 2015-4-13 14:12
//! 定义了一个专门的byte队列类型,这个队列用uint16_t作为计数器类型,所以,可以处理0~65535个元素, 用b ...


fifo结构体本身尺寸不会变化的。FIFO的数据buffer是用户提供的……所以不知道你想说啥……
感觉你没有提供buffer啊……如果不通过init函数把buffer提供进去……队列指针就是野指针。

出0入0汤圆

发表于 2015-4-13 17:53:48 | 显示全部楼层
我要好好修炼,向各位大神看齐

出0入0汤圆

发表于 2015-4-13 17:58:19 | 显示全部楼层
好东西,我学习了,谢谢

出0入0汤圆

发表于 2015-4-15 16:43:13 | 显示全部楼层
Gorgon_Meducer 发表于 2015-4-13 17:34
fifo结构体本身尺寸不会变化的。FIFO的数据buffer是用户提供的……所以不知道你想说啥……
感觉你没有提 ...

fofi机构体的尺寸是不会改变,这个我理解

我说的是:fifo操作的代码尺寸,比如__NAME_enqueue(),代码量(Flash)会随着
__NAME的定义个数增加。

比如:
         DEF_SAFE_QUEUE_U8(byte_queue, uint16_t, bool)
         END_DEF_SAFE_QUEUE_U8

         DEF_SAFE_QUEUE_U32(word_queue, uint16_t, bool)
         END_DEF_SAFE_QUEUE_U32


这里的代码量应该是2倍的占用Flash吧?

出0入0汤圆

发表于 2015-4-15 16:58:37 | 显示全部楼层
Gorgon_Meducer 大侠:
有种场景是,一个代码工程里有多种数据类型的FIFO, uint8_t ,uint16_t,  uint32_t, .....  user_t

在这种情况下使用宏:

#define DEF_SAFE_QUEUE(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE)            \
        DEF_QUEUE_EX(__NAME, __TYPE, __PTR_TYPE, __MUTEX_TYPE, SAFE_ATOM_CODE)

__TYPE: 可以是我上面举的任意类型, 内部代码也支持


而外部有把他们分开:U8、U16、U32
//定义数据类型为uint8_t的FIFO
#define DEF_SAFE_QUEUE_U8(__NAME, __PTR_TYPE,__MUTEX_TYPE)                  \
        DEF_SAFE_QUEUE(__NAME, uint8_t, __PTR_TYPE, __MUTEX_TYPE)

//定义数据类型为uint16_t的FIFO
#define DEF_SAFE_QUEUE_U16(__NAME, __PTR_TYPE, __MUTEX_TYPE)                \
        DEF_SAFE_QUEUE(__NAME, uint16_t, __PTR_TYPE, __MUTEX_TYPE)

//定义数据类型为uint32_t的FIFO
#define DEF_SAFE_QUEUE_U32(__NAME, __PTR_TYPE, __MUTEX_TYPE)                \
        DEF_SAFE_QUEUE(__NAME, uint32_t __PTR_TYPE, __MUTEX_TYPE)



如果分类型定义展开

是:
__u8_enqueue(....)
{
.....
}
__u16_enqueue(....)
{
.....
}
__u32_enqueue(....)
{
.....
}

这样在极端的多种数据类型都定义,占用Flash就是 n种 * 单个Fifo功能代码的大小,对么?


出0入0汤圆

发表于 2015-4-15 17:04:59 | 显示全部楼层
Gorgon_Meducer 大侠:

当然,这么做代码很好封装一个文件里,代码悄悄的在C文件里展开,只要包含头文件,定义,操作即可,方便,复用性强。

只是考虑极端应用,怎么改善。

出0入0汤圆

发表于 2015-4-15 17:11:08 | 显示全部楼层
Gorgon_Meducer 大侠:


typedef struct
{
   ....
}user_t;

DEF_SAFE_QUEUE(userType, user_t,  uint16_t, bool)
END_DEF_QUEUE

NO_INIT PRIVATE QUEUE(userType) userTest;


这种我还没有测,看代码应该是支持的。

出0入0汤圆

发表于 2015-4-15 20:49:30 | 显示全部楼层
mark,收藏

出0入296汤圆

发表于 2015-4-15 22:37:01 | 显示全部楼层
worldsing 发表于 2015-4-15 17:04
Gorgon_Meducer 大侠:

当然,这么做代码很好封装一个文件里,代码悄悄的在C文件里展开,只要包含头文件, ...

我是放在一个叫做t_queue.h的文件里面的。

出0入296汤圆

发表于 2015-4-15 22:38:08 | 显示全部楼层
worldsing 发表于 2015-4-15 16:58
Gorgon_Meducer 大侠:
有种场景是,一个代码工程里有多种数据类型的FIFO, uint8_t ,uint16_t,  uint32_t, ...

是的,缺点就是每次定义一个新的队列类型都会重复生成队列代码。
但是队列本身大小只和Buffer大小有关。

出0入0汤圆

发表于 2015-4-16 16:38:12 | 显示全部楼层
Gorgon_Meducer 发表于 2015-4-15 22:38
是的,缺点就是每次定义一个新的队列类型都会重复生成队列代码。
但是队列本身大小只和Buffer大小有关。 ...

嗯,
使用这种思路正在写个二叉树结构。

出0入0汤圆

发表于 2015-4-17 05:07:02 | 显示全部楼层
Gorgon_Meducer 发表于 2013-1-11 13:13
顶啊~我也粘贴一个,捧个场
支撑宏

使用队列时是否需要关闭全局中断?
不需要考虑原子操作吗?

出0入296汤圆

发表于 2015-4-17 14:50:01 | 显示全部楼层
zyw19987 发表于 2015-4-17 05:07
使用队列时是否需要关闭全局中断?
不需要考虑原子操作吗?

当然需要考虑,一般都是在队列里面做掉了

出0入0汤圆

发表于 2015-4-18 13:38:11 | 显示全部楼层
本帖最后由 xtaens 于 2015-4-18 13:41 编辑
Gorgon_Meducer 发表于 2013-1-11 13:13
顶啊~我也粘贴一个,捧个场
支撑宏


请教傻孩子老师:

我在串口中断中接收串口发送的数据:
  1. void UART5_IRQHandler(void)
  2. {
  3.   uint8_t res=0;

  4.   if(UART5->SR & (BIT5))
  5.   {
  6.     res=UART5->DR;

  7.     pipe_out_write_byte(res);
  8.   }
  9. }
复制代码


初始化如下,我只使用了接收缓存

  1. bool app_queue_init(void)
  2. {
  3.   //! 初始化两个队列,没啥好说的
  4.   QUEUE_INIT(byte_queue, &s_tBLQIn, s_chInBuffer, sizeof(s_chInBuffer));

  5.   return true;
  6. }
复制代码


写数据:
  1. bool pipe_out_write_byte(uint8_t chByte)
  2. {
  3.   return ENQUEUE(byte_queue, &s_tBLQIn, chByte);
  4. }
复制代码


最后在while1中调用这个函数。
  1. void read_byte(void)
  2. {
  3.   uint8_t pchByte;
  4.   if(PEEK_QUEUE(byte_queue, &s_tBLQIn, &pchByte))
  5.   {
  6.     UART5_SendByte(pchByte);
  7.    
  8.     DEQUEUE(byte_queue, &s_tBLQIn, &pchByte);
  9.   }
  10. }
复制代码



我要达到的效果:串口发送一个字节的数据存入到s_chInBuffer中,再用PEEK_QUEUE函数从s_chInBuffer中读取数据发到电脑上。
问题:电脑收到的数据不对,但是缓存中的数据是对的。我哪里调用的不对?谢谢



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入296汤圆

发表于 2015-4-20 08:11:24 | 显示全部楼层
xtaens 发表于 2015-4-18 13:38
请教傻孩子老师:

我在串口中断中接收串口发送的数据:

先要考虑不用队列,从串口收到数据以后立即回发给PC看看是否正确,因为波特率不对也会有问题的。

出0入0汤圆

发表于 2015-4-20 08:31:45 | 显示全部楼层
本帖最后由 xtaens 于 2015-4-20 08:36 编辑
Gorgon_Meducer 发表于 2015-4-20 08:11
先要考虑不用队列,从串口收到数据以后立即回发给PC看看是否正确,因为波特率不对也会有问题的。 ...


不用队列是没有问题的,我试过,波特率也正确。


我调用的函数、初始化、及流程对吗?写,读我用了同一个buffer

出0入0汤圆

发表于 2015-4-20 08:34:22 | 显示全部楼层
好贴,学习,

出0入0汤圆

发表于 2015-4-30 14:02:03 | 显示全部楼层
xtaens 发表于 2015-4-18 13:38
请教傻孩子老师:

我在串口中断中接收串口发送的数据:

昨天测试发现把波特率改为9600【以前是115200】后即使以5ms一次循环发送数据,电脑再也没有收到错误的数据了。

再改回115200,出错的数据很多,再改回9600,没有错误的数据了。

直接建立一个数组来收发数据,不用傻孩子的FIFO,115200波特率时数据出错很多,9600时没有错误数据。


结论:1、傻孩子的代码没有问题,大家可以放心使用。
      2、我的串口经过了max3485芯片,然后再经过485转换器转到232电平,可能中间存在某些问题,导致在高波特率下数据出错。

出0入0汤圆

发表于 2015-5-6 00:54:49 | 显示全部楼层
MARK                  

出0入0汤圆

发表于 2015-6-22 23:02:22 | 显示全部楼层
最近做单片机间串口数据通信,可否用到这个。

出0入0汤圆

发表于 2015-8-10 13:20:52 | 显示全部楼层
mark一下,精简通用环形fifo

出0入0汤圆

发表于 2015-8-10 14:52:31 | 显示全部楼层
mark  mark

出0入0汤圆

发表于 2015-8-21 17:41:32 | 显示全部楼层
最好是大致讲一下程序的思路和架构,这样理解起来就很好了。

出20入62汤圆

发表于 2015-8-22 22:52:28 | 显示全部楼层
收藏了,精简fifo~多谢

出0入0汤圆

发表于 2015-9-1 09:03:45 | 显示全部楼层
哪位大侠可以解释下FIFO和双向链表有什么联系

出0入0汤圆

发表于 2015-9-1 09:05:17 | 显示全部楼层
哪位大侠可以解释下FIFO和双向链表有什么联系

出0入296汤圆

发表于 2015-9-1 09:12:28 来自手机 | 显示全部楼层
wangle315065 发表于 2015-9-1 09:05
哪位大侠可以解释下FIFO和双向链表有什么联系

双向链表是一种结构,你可以拿他来做很多事情,做FIFO是其中一种。FIFO只是一种约定俗成的数据结构『应用』,其用法与实现是无关的。双向链表是FIFO的一种可能的实现方法。

出0入0汤圆

发表于 2015-9-1 16:17:44 | 显示全部楼层
研究了下,很精典

出0入4汤圆

发表于 2015-9-1 17:01:26 | 显示全部楼层
我靠,厉害。膜拜

出0入0汤圆

发表于 2015-9-7 22:29:38 | 显示全部楼层
非常感谢无私分享,拜读中!

出0入0汤圆

发表于 2015-9-11 16:26:23 | 显示全部楼层
Gorgon_Meducer 发表于 2015-9-1 09:12
双向链表是一种结构,你可以拿他来做很多事情,做FIFO是其中一种。FIFO只是一种约定俗成的数据结构『应用 ...

嗯嗯  学习了

出20入26汤圆

发表于 2016-5-28 02:42:01 | 显示全部楼层
把帖子看完,看了几遍,终于了解的环形FIFO的思想了。
有疑问,比如环形FIFO用在串口中断接收,就可以入列,处理接收的数据可以,出列判断。
但,在串口用DMA接收时,是不需要软件来入列操作的?DMA直接将串口接收的数据存到了内存数组上,目前还不了解DMA是怎么存的,
是跟FIFO入列一样循环存的吗?

出20入26汤圆

发表于 2016-6-2 18:28:48 | 显示全部楼层
Gorgon_Meducer 发表于 2013-4-27 12:22
这个要自己定义的,定义方法如下,假设我们已经有三个宏:
DISABLE_GLOBAL_INTERRUPT()
GET_GLOBAL_INTER ...

请问傻孩子老师,这里为啥还获取中断状态?
STM32中,这里我只关闭中断,执行代码后,再恢复中断 ---->(__disable_irq())
可行吗?

出20入26汤圆

发表于 2016-6-3 00:09:26 | 显示全部楼层
Gorgon_Meducer 发表于 2013-1-11 13:13
顶啊~我也粘贴一个,捧个场
支撑宏
  1. PRIVATE STATE(BootLoader_Task) BEGIN

  2.     do {
  3.         uint8_t chByte;
  4.         if (SERIAL_IN(&chByte)) {
  5.             ENQUEUE(byte_queue, &s_tBLQIn, chByte);
  6.         }
  7.     } while (false);

  8.     do {
  9.         uint8_t chByte;
  10.         if (PEEK_QUEUE(byte_queue, &s_tBLQOut, &chByte)) {
  11.             if (SERIAL_OUT(chByte)) {
  12.                 DEQUEUE(byte_queue, &s_tBLQOut, &chByte);
  13.             }
  14.         }
  15.     } while (false);
  16.     ...

  17.     REFLEXIVE_STATE;
  18. END
复制代码

傻孩子老师,这部分的宏是什么?

出0入0汤圆

发表于 2016-6-3 00:19:55 | 显示全部楼层
留个记号,慢慢看!

出0入0汤圆

发表于 2016-6-3 10:22:18 | 显示全部楼层
试了一下,好像头文件要稍微修改一下才可以用

出0入0汤圆

发表于 2016-6-3 11:41:34 | 显示全部楼层
好东西,这个很实用

出0入0汤圆

发表于 2016-6-3 12:38:22 | 显示全部楼层
感谢分享。。

出0入0汤圆

发表于 2016-6-3 15:34:27 来自手机 | 显示全部楼层
fifo收藏了

出0入296汤圆

发表于 2016-7-1 10:44:21 | 显示全部楼层
jufr12315 发表于 2016-6-2 18:28
请问傻孩子老师,这里为啥还获取中断状态?
STM32中,这里我只关闭中断,执行代码后,再恢复中断 ---->( ...

如果你之前已经是关闭中断的状态,执行完这段代码后无脑开中断,岂不是坑了自己?

出0入296汤圆

发表于 2016-7-1 10:45:21 | 显示全部楼层
jufr12315 发表于 2016-6-3 00:09
傻孩子老师,这部分的宏是什么?

天坑……你可以看我 微知识系列 的 状态机帖子

出40入42汤圆

发表于 2016-7-1 11:05:16 | 显示全部楼层
几年前的帖子,一直交流到现在,真是个好贴哦。
Mark:环形FIFO交流贴。

出0入0汤圆

发表于 2016-7-1 11:10:28 | 显示全部楼层
技术贴,要马克

出0入0汤圆

发表于 2016-10-17 16:26:28 | 显示全部楼层
本帖最后由 chinaboy25 于 2016-10-18 11:47 编辑
Gorgon_Meducer 发表于 2013-1-28 11:49
你可以看看我提供的方式,里面定义了两种方式可以用来加入互斥,__ATOM_ACESS是一种,专门的MUTEX类型也 ...


能把互斥宏补上吗?准备用你的,用不上,自己修改了用了;

另外再问一句,count不是可以通过head  - tail 得到吗?

出0入296汤圆

发表于 2016-11-4 04:33:49 | 显示全部楼层
chinaboy25 发表于 2016-10-17 16:26
能把互斥宏补上吗?准备用你的,用不上,自己修改了用了;

另外再问一句,count不是可以通过head  - tai ...

护持宏一般根据你用的平台来确定的,具体形式参考74楼

出0入296汤圆

发表于 2016-11-4 04:34:51 | 显示全部楼层
chinaboy25 发表于 2016-10-17 16:26
能把互斥宏补上吗?准备用你的,用不上,自己修改了用了;

另外再问一句,count不是可以通过head  - tai ...

有两种情况,tail和head会重合

出0入0汤圆

发表于 2016-11-4 08:29:23 | 显示全部楼层
Gorgon_Meducer 发表于 2016-11-4 04:34
有两种情况,tail和head会重合

不让队列满,要重合了就返回错误

出0入0汤圆

发表于 2016-12-29 15:12:29 | 显示全部楼层
本帖最后由 wongT 于 2016-12-29 15:14 编辑
Gorgon_Meducer 发表于 2013-1-11 13:13
顶啊~我也粘贴一个,捧个场
支撑宏


老师,你这封装成的管道怎么使用?

管道不是只有一个缓冲区吗,写入与读取管道不是操作同一个缓冲区吗?为何要开两个缓冲区?

/************************疑问一*************************************/
现在我使用了你的代码,然后在stm32串口中断里调用pipe_out_write,将串口接收到的一个个字节写入缓冲区。
但是现在我要读取出数据,使用了pipe_in_read,但是读取没数据,我在你的例子中,发现写入的缓冲区与读取的缓冲区不同。
我这里是不是有问题?不理解管道使用的地方,概念也不清晰,希望指点下。谢谢。
/*************************************************************/

/************************疑问二*************************************/
你的例子是一个串口的接收与发送吗?
一个接收缓冲区,另一个发送缓冲区?
那么,我发送不需要用缓冲区发送,是不是使用一个缓冲区就好,接收缓冲区。
/*************************************************************/

出0入0汤圆

发表于 2016-12-29 15:26:10 | 显示全部楼层
参考linux kfifo   

出10入0汤圆

发表于 2017-7-2 17:52:57 | 显示全部楼层
chencc8 发表于 2013-1-11 20:04
哈哈我也有,这是最近公司给新员工办的科技论文大赛的产品,前几天为了攒车费 我也凑热闹参加了,因为时间 ...

看傻孩子的代码好难读,不是一个段位的;
你的代码可读性好多了;
看完下来,还是有很多收获;

出0入0汤圆

发表于 2017-7-31 00:16:09 | 显示全部楼层
看上去很NB的样子,有空要看看!

出0入0汤圆

发表于 2017-8-6 18:56:55 | 显示全部楼层
前几天去面试,让写一个FIFO接口,我直接悲催鸟,得要复习一下了,谢谢分享...

出0入0汤圆

发表于 2017-9-14 22:04:38 | 显示全部楼层
先做个标记,要好好消化消化

出0入0汤圆

发表于 2017-9-15 09:12:04 | 显示全部楼层
分析了一下楼主位的代码,觉得缓冲区会出现问题,可以按照如下进行测试:
定义缓冲区大小为32字节,每次in一个字节,重复31次,你会发现第32字节无法in了,因为你的full判断机制导致缓冲区最后一个空间无法使用。以下是我的测试结果:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

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

本版积分规则

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

GMT+8, 2024-7-26 19:22

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

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