打印

VSF应用实例--解析蓝牙串口HCI(1)流驱动模型

[复制链接]
872|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vsf|  楼主 | 2018-4-16 13:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 vsf 于 2018-4-16 13:37 编辑

VSF里有一个事件驱动的流模型,在VSF中应用比较广泛,很多模块都用到了。比如,最简单的串口,就可以使用流的方式操作。当然,不仅仅是串口,VSF里的USB设备协议栈中的EP操作,也都是用流。

流模型的概念很简单,就是一个流有2个端点:一个是输入端,可以写数据到流里;另一个是输出端,可以从流里读取数据。并且,输入端在写数据到流的时候,会调用输出端设置的回调接口,通知输出端流里有新数据;输出端在读取了流里的数据后,也会调用输入端设置的回调接口,通知输入端,流里的数据被读取过了。通过这种方式,就可以具备流控的功能。

比如,以前做过的一个项目:https://bbs.21ic.com/icview-1250386-1-1.html
里面有http下载MP3,然后一边解码一边播放,整个过程就是使用流的方式操作。MP3解码器输入一个MP3流,输出一个WAV流。HTTP里实际是一个TCP流。
所以,结构是http的TCP流,接到MP3解码器的输入流,MPS3解码器的输出流,接到音频播放器的输入流。
这些组件开发好后,应用层要做的就只是把流按照上述的结构链接起来,系统自动带流控。

WAV流满了,MP3解码器自动停止工作,然后MP3流也满了(之前TCP流并没有停止工作,因为MP3流没满),最后TCP流也停止。
音频播放器从WAV流读取了一些数据后,通知MP3解码器;MP3解码器发现WAV流有空间,并且MP3流有数据,解码器开始工作,读取MP3流中的数据,解码后,放入到WAV流;MP3解码器读取MP3流之后,通过TCP流,TCP流发现MP3流里有空间,就继续接收数据。
这些模块都是使用了流的标准实现了接口,所以可以直接连接,应用层不需要为流控写任何代码,因为这些都在各个组件的流接口中实现了。

所以,VSF中的流模型可以认为只是一个流接口(类似面向对象种的接口的概念)。模块如果实现了这个流接口,那就可以链接到其他实现这个接口的模块。当然,前提是2个流接口连接,必须一个是输入端接口,一个是输出端接口。



流和fifo的区别
这个问题也有人问过我。VSF中的流只是接口,并没有规定使用的数据结构。实际上VSF中实现了3种数据结构的流,fifo是其中的一种。
不同的应用,可以使用不同数据结构的流,但是流接口不变,不影响代码。
具体使用VSF种的流的时候,使用的是对应内存结构的流,比如fifo流,multibuf流等等。

这里举一个非压缩视频流的例子:
这里使用的数据结构叫多缓冲数据结构(multibuf),类似帧缓冲,但是可以有多个帧缓冲组成的数据结构。数据流填满一个帧缓冲后,再填下一个。帧缓冲在地址空间上连续,所以可以直接拿出一个缓冲来刷屏。

使用特权

评论回复

相关帖子

发新帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

vsf

27

主题

60

帖子

6

粉丝