os_msgq_send_from_isr
所属模块:通信机制 | 类型:中断安全消息队列函数
函数简介
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版本消息队列接口禁止阻塞,仅做快速写入与调度标记。
唤醒行为由内核统一处理。