os_mailbox_receive
所属模块:通信机制 | 类型:邮箱阻塞接收函数
函数简介
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)
{
// 处理接收数据
}
}
注意事项
该函数在无数据时会进入阻塞状态,由调度器统一唤醒。
属于典型“快路径 + 慢路径”混合设计。