选择数据传递方式

本页依据 文档基线与后续更新 中记录的 Zephyr main 快照更新。

数据传递需要同时明确消息边界、复制方式、容量和缓冲区所有权。

对象

数据与次序

存储方式

典型用途

FIFO 与 LIFO

任意大小对象;先进先出或后进先出

排队对象指针;普通 put 使用对象首字作为链接

转移缓冲区所有权

内核数据栈

stack_data_t;后进先出

固定容量的本机字宽数组

整数或空闲对象地址池

消息队列

固定长度消息

复制消息内容到队列或接收者

小型命令、采样记录

邮箱

可变长消息,支持发送/接收线程匹配

描述符协调双方的数据交换

有匹配或完成确认要求的线程通信

管道:字节流与新版 API

字节流,没有固有消息边界

环形缓冲区或线程间直接传递

流式数据

容量、阻塞与上下文

FIFO 的队列本身没有固定条数上限,但可用数据对象仍受内存限制;msgq、stack 和 pipe 显式受容量约束。设计生产者快于消费者时的策略:等待、丢弃新数据、覆盖旧状态或流控。 不能让 ISR 阻塞等待空间。

FIFO/LIFO、消息队列和 stack 有允许 ISR 调用的操作,带超时的操作在 ISR 中用 K_NO_WAIT。邮箱面向线程;管道按其当前接口说明在线程中使用。

传指针不会自动复制对象,也不会延长局部变量生命周期。传输包含指针的结构体时, 即便结构体经过 msgq 复制,其指向的数据仍需独立管理。跨线程共享可变内容时,应定义 接收者何时归还缓冲区,避免重复入队、提前复用或释放。

上游依据