os_msgq_send_from_isr

所属模块:通信机制 | 类型:中断安全消息队列函数

API Metadata

函数ID:os_msgq_send_from_isr
模块:msgq
类型:isr message queue send
嵌套深度:1

函数简介

os_msgq_send_from_isr 用于在中断上下文中向消息队列写入1字节数据, 并通过延迟调度机制通知任务处理数据。

该函数属于HRTOS ISR安全IPC接口,不允许阻塞或直接调度。

函数原型

char os_msgq_send_from_isr(os_msgq_t *q, u8 obj, u8 data);

参数说明

参数 说明
q 消息队列控制块指针
obj 资源ID(绑定OS_RES)
data 待发送的1字节数据

返回值

1 - 发送成功
0 / -1 - 队列满或参数错误

源码实现

/*------------------------------------------------------------------------ | FILE DESCRIPTION | ------------------------------------------------------------------------*/ /*------------------------------------------------------------------------ | - File name : msgq_send_from_isr.c | - Author : 谭舒 | - Update date : 2026-09-19 | - Copyright(C) : 2026 HRTOS. All rights reserved. ------------------------------------------------------------------------*/ /*------------------------------------------------------------------------ | INCLUDES | ------------------------------------------------------------------------*/ #include "hrtos_internal.h" /*------------------------------------------------------------------------ | API FUNCTIONS | ------------------------------------------------------------------------*/ /** * @brief 在中断环境向指定消息队列发送 1 字节数据。 * * @param[in] q 消息队列控制块指针。 * @param[in] obj 资源槽位编号,用于关联消息队列等待资源。 * @param[in] _data 待发送的数据。 * * @return 操作结果。 * @retval 1 消息发送成功。 * @retval -1 参数无效或消息队列已满。 * * @note 该接口用于中断环境,不执行阻塞等待。 * 当消息队列有空闲空间时,数据写入队列并更新队列状态。 * 当存在等待该消息队列的任务时,设置调度请求并增加待处理信号计数, * 后续由内核统一处理调度。 * 消息队列已满时,函数立即返回,不进行等待。 */ char os_msgq_send_from_isr(os_msgq_t *q, u8 obj, u8 _data) { u8 i; /* ------------------------- * 参数检查 * q:消息队列指针 * obj:资源ID(邮箱/队列绑定对象) * ------------------------- */ if (q == NULL) { return -1; } if (obj >= OS_RESOURCE_MAX) { return -1; } /* ------------------------- * 队列满检测 * ISR中禁止阻塞,直接失败返回 * ------------------------- */ if (q->count >= q->_size) { return -1; } /* ------------------------- * 写入环形队列 * ISR安全:无锁操作(单中断上下文假设) * ------------------------- */ q->buf[q->head] = _data; q->head = (u8)((q->head + 1) % q->_size); q->count++; /* ------------------------- * 扫描等待该资源的任务 * wait_mask:bit位表示任务是否在等待该msgq * ------------------------- */ if (OS_RES[obj].wait_mask) { for (i = 0; i < OS_MAX_TASK; i++) { //if ((OS_RES[obj].wait_mask & ((u16)1 << i)) && // (OS_TASK[i].wait_type == WAIT_MSG_RECV)) if(OS_TASK[i].wait_type == WAIT_MSG_RECV) { /* 找到一个等待任务(本版本不做唤醒) */ /* 唯一调度信号 */ OS_SCHED_REASON = 1; /* 事件计数(保留语义,不做状态机) */ OS_RES[obj].pending_signal++; break; } } } return 1; } /*------------------------------------------------------------------------ | END OF FILE: msgq_send_from_isr.c | ------------------------------------------------------------------------*/

使用示例

void UART_ISR(void) { os_msgq_send_from_isr(&uart_queue, 1, RX_DATA); }

注意事项

ISR版本消息队列接口禁止阻塞,仅做快速写入与调度标记。 唤醒行为由内核统一处理。

相关推荐