os_mailbox_receive

所属模块:通信机制 | 类型:邮箱阻塞接收函数

API Metadata

函数ID:os_mailbox_receive
模块:mailbox
类型:mailbox receive
嵌套深度:2

函数简介

os_mailbox_receive 用于从邮箱中接收数据, 支持“快速路径返回 + 阻塞等待”两种执行模式。

当邮箱有数据时立即返回;当邮箱为空时, 任务进入 WAIT_MAILBOX 状态,由调度器唤醒。

函数原型

int os_mailbox_receive(u8 mid);

参数说明

参数 说明
mid 邮箱ID(0 ~ OS_RESOURCE_MAX-1)

返回值

≥0 - 成功接收数据
-1 - 参数错误

源码实现

/*------------------------------------------------------------------------ | FILE DESCRIPTION | ------------------------------------------------------------------------*/ /*------------------------------------------------------------------------ | - File name : mailbox_receive.c | - Author : 谭舒 | - Update date : 2026-09-19 | - Copyright(C) : 2026 HRTOS. All rights reserved. ------------------------------------------------------------------------*/ /*------------------------------------------------------------------------ | INCLUDES | ------------------------------------------------------------------------*/ #include "hrtos_internal.h" /*------------------------------------------------------------------------ | API FUNCTIONS | ------------------------------------------------------------------------*/ /** * @brief 从指定邮箱接收数据。 * * @param[in] mid 邮箱资源槽位编号。 * * @return 接收到的数据。 * @retval -1 邮箱资源槽位编号无效。 * @retval 其他 接收到的邮箱数据。 * * @note 当邮箱中存在数据时,直接读取并清空邮箱内容。 * 当邮箱为空时,当前任务进入邮箱等待状态。 * 该接口采用阻塞等待方式获取邮箱数据。 */ int os_mailbox_receive(u8 mid) { OS_RESOURCE *m; u8 tid; int _data; if (mid >= OS_RESOURCE_MAX) { return -1; } EA = 0; m = &OS_RES[mid]; tid = OS_CURRENT_TASK; if(m->value == 0) { EA = 1; os_wait(WAIT_MAILBOX, mid, 0); } /* ------------------------------------------------- * 快路径:有数据直接读取 * ------------------------------------------------- */ if(m->value != 0) { _data = m->value; m->value = 0; EA = 1; return _data; } EA = 1; /* ------------------------------------------------- * 慢路径:进入统一等待 * ------------------------------------------------- */ //os_wait(WAIT_MAILBOX, mid, 0); /* 被唤醒后重新读取 */ return m->value; } /*------------------------------------------------------------------------ | END OF FILE: mailbox_receive.c | ------------------------------------------------------------------------*/

使用示例

void task() { int data = os_mailbox_receive(0); if(data >= 0) { // 处理接收数据 } }

注意事项

该函数在无数据时会进入阻塞状态,由调度器统一唤醒。 属于典型“快路径 + 慢路径”混合设计。

相关推荐