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 - 队列满或参数错误

源码实现

#include "hrtos_internal.h" /* * ISR环境消息队列发送 * - 非阻塞 * - 延迟调度机制 * - 单任务唤醒模型 */ char os_msgq_send_from_isr(os_msgq_t *q, u8 obj, u8 _data) { u8 i; if (q == NULL) { return -1; } if (obj >= OS_RESOURCE_MAX) { return -1; } if (q->count >= q->_size) { return -1; } /* 写入环形队列 */ q->buf[q->head] = _data; q->head = (u8)((q->head + 1) % q->_size); q->count++; /* 扫描等待任务 */ if (OS_RES[obj].wait_mask) { for (i = 0; i < OS_MAX_TASK; i++) { if (OS_TASK[i].wait_type == WAIT_MSG_RECV) { OS_SCHED_REASON = 1; OS_RES[obj].pending_signal++; break; } } } return 1; }

使用示例

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

注意事项

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

相关推荐