os_mailbox_send

所属模块:通信机制 | 类型:邮箱发送函数

API Metadata

函数ID:os_mailbox_send
模块:mailbox
类型:mailbox send
嵌套深度:2

函数简介

os_mailbox_send 用于向邮箱写入数据,并根据等待状态唤醒接收任务。

当存在等待任务时,将优先唤醒一个任务;否则仅更新邮箱数据。

函数原型

char os_mailbox_send(u8 mid, u8 content);

参数说明

参数 说明
mid 邮箱ID(0 ~ OS_RESOURCE_MAX-1)
content 发送的数据(1字节)

返回值

1 - 发送成功
-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); }

注意事项

该函数为非阻塞发送接口,仅唤醒一个等待任务。 若无等待任务,数据将保留在邮箱中。

相关推荐