os_mailbox_receive
所属模块:通信机制 | 类型:邮箱阻塞接收函数
函数简介
os_mailbox_receive 用于从邮箱中接收数据,
支持“快速路径返回 + 阻塞等待”两种执行模式。
当邮箱有数据时立即返回;当邮箱为空时,
任务进入 WAIT_MAILBOX 状态,由调度器唤醒。
函数原型
int os_mailbox_receive(u8 mid);
参数说明
| 参数 |
说明 |
| mid |
邮箱ID(0 ~ OS_RESOURCE_MAX-1) |
返回值
≥0 - 成功接收数据
-1 - 参数错误
源码实现
#include "hrtos_internal.h"
/*
* 邮箱接收(Receive)
* 语义:
* 1. 有数据 -> 直接取走
* 2. 无数据 -> 进入 WAIT_MAILBOX
*/
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;
/* -------------------------
* 慢路径:被唤醒后读取
* ------------------------- */
return m->value;
}
使用示例
void task()
{
int data = os_mailbox_receive(0);
if(data >= 0)
{
// 处理接收数据
}
}
注意事项
该函数在无数据时会进入阻塞状态,由调度器统一唤醒。
属于典型“快路径 + 慢路径”混合设计。