ISR 阶段
中断服务程序(ISR)只执行最小化操作:采样硬件状态、投递系统事件、快速退出。 避免在 ISR 中执行复杂逻辑或阻塞操作。
在 HRTOS 中,中断入口采用"中断事件化"设计:ISR 仅负责投递事件,实际逻辑由高优先级任务执行。 这种设计显著降低 ISR 执行时间,提高系统实时性与可预测性。
系统通过中断入口机制,将硬件中断事件转换为系统事件,由专门的任务处理中断逻辑。 验证从硬件触发到任务响应的完整流程,展示 HRTOS 对中断资源的统一管理方式。
中断入口的核心概念
中断入口(Interrupt Entry)是 HRTOS 中断处理机制的核心,定义了从硬件中断触发到系统任务响应的完整路径。 该机制将中断处理分为两个阶段:ISR 快速响应阶段和任务处理阶段。
中断服务程序(ISR)只执行最小化操作:采样硬件状态、投递系统事件、快速退出。 避免在 ISR 中执行复杂逻辑或阻塞操作。
高优先级任务等待事件触发,执行实际的中断处理逻辑。 任务可以调用完整的系统 API,不受 ISR 限制。
中断入口的设计理念
HRTOS 中断入口机制遵循"中断事件化"的设计理念,将中断从"执行逻辑"转换为"事件触发"。 这种设计显著降低 ISR 执行时间,提高系统实时性与可预测性。
ISR 仅负责采样硬件状态、投递系统事件、快速退出。 任何复杂逻辑都应在任务层处理,确保 ISR 执行时间可预测。
ISR 中禁止调用阻塞 API、执行耗时操作或进行复杂计算。 这些操作应在任务层完成,避免影响系统实时性。
所有中断相关的业务逻辑统一在任务层处理。 任务可以调用完整的系统 API,不受 ISR 环境限制。
中断入口机制的核心 API
从中断触发到任务响应的完整路径
中断入口机制的完整实现
包含任务函数、ISR 和系统初始化的完整实现
#include "hrtos.h"
sbit LED_INT = P1^0;
sbit LED_TASK = P1^1;
#define TASK_WAIT 1
#define TASK_INT 2
#define PRIO_WAIT 6
#define PRIO_INT 9
#define STACK_SIZE 5
#define EVENT_IRQ 1
static u16 irq_count = 0;
/* =========================
* 任务:处理IRQ事件
* ========================= */
void wait_task(void)
{
while(1)
{
os_event_wait(EVENT_IRQ, 0);
irq_count++;
LED_TASK = ~LED_TASK;
}
}
/* =========================
* INT0 ISR(极简)
* ========================= */
void INT0_ISR(void)
{
os_event_set_from_isr(EVENT_IRQ);
LED_INT = ~LED_INT;
os_schedule_request(); // 可选:请求调度
}
/* =========================
* 系统入口
* ========================= */
void hrtos_main(void)
{
LED_INT = 0;
LED_TASK = 0;
os_event_init(EVENT_IRQ);
os_task_create(wait_task, TASK_WAIT, PRIO_WAIT, STACK_SIZE);
IT0 = 1;
EX0 = 1;
}
中断入口机制对 HRTOS 系统的价值
深入学习的相关资源