管道
管道是一个内核对象,它允许一个线程向另一个线程发送一个字节流。管道可用于同步传输全部或部分的数据块。
概念
管道可以配置一个环形缓冲器,其保存已发送但尚未接收的数据;或者,管道可以没有环形缓冲器。
可以定义任意数量的管道(仅受可用RAM的限制)。每个管道都由其内存地址引用。
管道具有以下关键属性:
- size表示管道的环形缓冲区的大小的大小。请注意,大小为0定义了一个没有环形缓冲区的管道。
管道必须初始化才能使用。该管道最初为空的。
数据通过线程同步地以全部或部分的方式发送到管道中。如果不能立即满足指定的最小字节数,则操作要么立即失败,要么尝试发送尽可能多的字节,然后等待,希望以后能够完成发送。已接受的数据可以复制到管道的环缓冲区,或者直接复制到等待的读取器。
数据是由一个线程从一个管道同步接收到的。如果不能立即满足指定的最小字节数,则操作要么立即失败,要么尝试接收尽可能多的字节,然后等待,希望以后能够完成接收。可接受的数据可以从管道的环缓冲区复制,也可以直接从等待的发送者)复制。
数据也可以通过线程从管道中刷新。冲洗既可以在整个管道上进行,也只能在其环形缓冲器上进行。冲洗整个管道相当于读取环形缓冲区中的所有信息,并等待被写入一个巨大的临时缓冲区,然后被丢弃。刷新环缓冲器相当于只将环缓冲器中的数据读入临时缓冲器,然后丢弃。冲洗环形缓冲器不能保证环形缓冲器保持空;冲洗可允许暂停写入器填充环形缓冲器。
注意:
Flushing在实际中不会分配或使用额外的缓冲区。
注意:
本文介绍了Zephyr内核中的管道服务,包括管道的概念、实现、写入、读取、冲洗等操作。管道是一种用于线程间同步传输字节流的内核对象,可配置环形缓冲区。文章通过示例代码展示了如何初始化、写入、读取和冲洗管道,建议在需要线程间数据流传输时使用,特别是对于大数据项,推荐发送指针以减少复制。
订阅专栏 解锁全文
219

被折叠的 条评论
为什么被折叠?



