查看: 2414|回复: 1

Raw-os:带有内部fifo存储功能的raw queue buffer介绍

[复制链接]
  • TA的每日心情
    奋斗
    2013-7-4 23:49
  • 签到天数: 21 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2013-11-13 23:49:39 | 显示全部楼层 |阅读模式
    分享到:
    带有内部fifo存储功能的raw queue buffer

    之前介绍的queue,内部只能存储一个地址,而queue size 只能存储一个地址以及大小。这两个模块均不能存储实际的数据。有没有一个模块能存储实际的数据呢,但是肯定的,那就是raw queue buffer这个模块。

    raw queue buffer内部维护了一个fifo模块,可以压入和取出数据。raw queue buffer的优势是:

    第一,此模块关中断时间为0,传统的fifo因为要处理中断和任务之间的临界区问题,所以fifo内部必须要关中断,压入fifo的数据量一大,会急速的增大系统的最大关中断时间,对系统实时性损害很大。而raw queue buffer模块内部是不需要关中断的,只需要关抢占,所以很好的解决了这个问题。

    第二,用户再也不需要自己去维护自己的软件fifo, 直接使用就可以了,省去了初学者写fifo上的麻烦。

    下面演示一个串口例子来如何使用raw queue buffer这个模块。


    void uart_isr()
    {

        接收串口数据                                            (1)

        使用raw_queue_buffer_end_post一次性压入数据            (2)

    }



    void uart_receive_task()
    {

        while (1) {
               
    raw_queue_buffer_receive 接收数据                      (3)
    处理接收到的串口数据                                   (4)

        }

    }

    当串口外部来了数据后,就会触发中断,此时在(1)处接收串口的内部数据,然后在(2)处调用函数raw_queue_buffer_end_post把接收到的数据压入。
    串口接收任务uart_receive_task在(3)处会接收数据,如果没有数据的话,就会睡眠,一直等到串口中断压入新的数据,然后会被唤醒执行。(4)处代码会处理接收到的串口数据。

    从以上的例子来看使用raw_queue_buffer这个模块的确很方便。这个模块适合数据量不大的任务通信,因为压入数据这个过程比较缓慢。对于串口的硬件fifo来说一般在32个字节左右,所以使用这个模块是再也合适不过的,但是网卡的话在中断里使用这个模块接收数据,就不是太适合了,因为数据量比较大,会增大系统的中断延迟。

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-7-16 09:10
  • 签到天数: 361 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-11-14 08:40:16 | 显示全部楼层
    看不懂    来转转~~~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-12-25 04:03 , Processed in 0.123125 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.