os_mailbox_send
所属模块:通信机制 | 类型:邮箱发送函数
函数简介
os_mailbox_send 用于向邮箱写入数据,并根据等待状态唤醒接收任务。
当存在等待任务时,将优先唤醒一个任务;否则仅更新邮箱数据。
函数原型
char os_mailbox_send(u8 mid, u8 content);
参数说明
| 参数 |
说明 |
| mid |
邮箱ID(0 ~ OS_RESOURCE_MAX-1) |
| content |
发送的数据(1字节) |
源码实现
/*------------------------------------------------------------------------
| FILE DESCRIPTION |
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| - File name : mailbox_send.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 邮箱资源槽位编号。
* @param[in] content 待发送的数据。
*
* @return 操作结果。
* @retval 1 数据发送成功。
* @retval -1 邮箱资源槽位编号无效。
*
* @note 发送数据后,当存在等待接收任务时唤醒等待任务。
* 当没有任务等待时,数据保存在邮箱中,供后续接收操作读取。
*/
char os_mailbox_send(u8 mid, u8 content)
{
OS_RESOURCE *m;
u8 next;
u8 i;
if (mid >= OS_RESOURCE_MAX)
{
return -1;
}
EA = 0;
m = &OS_RES[mid];
m->value = content;
next = OS_INVALID_ID;
/* -------------------------------------------------
* 如果有任务在等待邮箱
* ------------------------------------------------- */
if(m->wait_mask)
{
for(i = 0; i < OS_MAX_TASK; i++)
{
if(m->wait_mask & ((u16)1 << i))
{
next = i;
break;
}
}
if(next != OS_INVALID_ID)
{
wake_task(next, WAIT_SIGNAL);
}
EA = 1;
return 1;
}
EA = 1;
return 1;
}
/*------------------------------------------------------------------------
| END OF FILE: mailbox_send.c |
------------------------------------------------------------------------*/
使用示例
void sender_task()
{
os_mailbox_send(0, 0x55);
}
注意事项
该函数为非阻塞发送接口,仅唤醒一个等待任务。
若无等待任务,数据将保留在邮箱中。