选择数据传递方式
本页依据 文档基线与后续更新 中记录的 Zephyr main 快照更新。
数据传递需要同时明确消息边界、复制方式、容量和缓冲区所有权。
对象 |
数据与次序 |
存储方式 |
典型用途 |
|---|---|---|---|
任意大小对象;先进先出或后进先出 |
排队对象指针;普通 put 使用对象首字作为链接 |
转移缓冲区所有权 |
|
|
固定容量的本机字宽数组 |
整数或空闲对象地址池 |
|
固定长度消息 |
复制消息内容到队列或接收者 |
小型命令、采样记录 |
|
可变长消息,支持发送/接收线程匹配 |
描述符协调双方的数据交换 |
有匹配或完成确认要求的线程通信 |
|
字节流,没有固有消息边界 |
环形缓冲区或线程间直接传递 |
流式数据 |
容量、阻塞与上下文
FIFO 的队列本身没有固定条数上限,但可用数据对象仍受内存限制;msgq、stack 和 pipe 显式受容量约束。设计生产者快于消费者时的策略:等待、丢弃新数据、覆盖旧状态或流控。 不能让 ISR 阻塞等待空间。
FIFO/LIFO、消息队列和 stack 有允许 ISR 调用的操作,带超时的操作在 ISR 中用
K_NO_WAIT。邮箱面向线程;管道按其当前接口说明在线程中使用。
传指针不会自动复制对象,也不会延长局部变量生命周期。传输包含指针的结构体时, 即便结构体经过 msgq 复制,其指向的数据仍需独立管理。跨线程共享可变内容时,应定义 接收者何时归还缓冲区,避免重复入队、提前复用或释放。