052、Zephyr RTOS内核基础:线程通信之邮箱 Zephyr RTOS内核基础:线程通信之邮箱一、一个让我熬夜的bug去年做工业网关项目,现场设备上报数据总在凌晨3点莫名丢失。用逻辑分析仪抓了三天,发现是Zephyr邮箱的接收线程在中断上下文里被阻塞了——当时代码里写的是k_mbox_get(K_FOREVER),而中断服务程序里根本不能做阻塞等待。这个坑让我意识到:邮箱机制虽然强大,但用错场景比不用更可怕。二、邮箱是什么?别和消息队列搞混很多初学者把Zephyr的邮箱(mbox)和消息队列(message queue)混为一谈。我习惯这样区分:消息队列是“快递柜”——每个格子放固定大小的包裹;邮箱是“邮局”——可以寄不同尺寸的包裹,但需要先拆包再装包。邮箱的核心数据结构是struct k_mbox,内部维护了一个消息链表。发送方调用k_mbox_put时,会把数据复制到内核动态分配的缓冲区;接收方调用k_mbox_get时,内核会匹配发送方和接收方的“标签”(tx_block、rx_block),完成数据传递。关键区别:邮箱支持变长数据,但每次收发都需要两次内存拷贝(发送时从用户空间到内核,接收时从内核到用户空间)。消息队列是固定大小,但只有一次拷贝。如果你的数据长度固定且频繁收发,用消息队列;如果数据长度变化大(比如JSON字符串),邮箱更合适。三、API使用:那些文档没告诉你的细节