H HRTOS 示例
Interrupt Driven Core

中断入口机制

在 HRTOS 中,中断入口采用"中断事件化"设计:ISR 仅负责投递事件,实际逻辑由高优先级任务执行。 这种设计显著降低 ISR 执行时间,提高系统实时性与可预测性。

示例目标

系统通过中断入口机制,将硬件中断事件转换为系统事件,由专门的任务处理中断逻辑。 验证从硬件触发到任务响应的完整流程,展示 HRTOS 对中断资源的统一管理方式。

核心API os_event_set_from_isr
触发方式 硬件中断
处理模式 ISR → Task
优先级 高优先级任务

核心机制

  • ISR 最小化处理
  • 事件投递机制
  • 任务接管执行
  • 中断资源统一管理
Mechanism Definition

机制定义

中断入口的核心概念

中断入口(Interrupt Entry)是 HRTOS 中断处理机制的核心,定义了从硬件中断触发到系统任务响应的完整路径。 该机制将中断处理分为两个阶段:ISR 快速响应阶段和任务处理阶段。

核心定义: Interrupt Entry = 硬件触发 → ISR最小化处理 → 事件投递 → 任务接管执行

ISR 阶段

中断服务程序(ISR)只执行最小化操作:采样硬件状态、投递系统事件、快速退出。 避免在 ISR 中执行复杂逻辑或阻塞操作。

任务阶段

高优先级任务等待事件触发,执行实际的中断处理逻辑。 任务可以调用完整的系统 API,不受 ISR 限制。

Design Principles

设计原则

中断入口的设计理念

HRTOS 中断入口机制遵循"中断事件化"的设计理念,将中断从"执行逻辑"转换为"事件触发"。 这种设计显著降低 ISR 执行时间,提高系统实时性与可预测性。

ISR 只做三件事

ISR 仅负责采样硬件状态、投递系统事件、快速退出。 任何复杂逻辑都应在任务层处理,确保 ISR 执行时间可预测。

禁止 ISR 中执行复杂逻辑

ISR 中禁止调用阻塞 API、执行耗时操作或进行复杂计算。 这些操作应在任务层完成,避免影响系统实时性。

中断逻辑统一迁移至 Task 层

所有中断相关的业务逻辑统一在任务层处理。 任务可以调用完整的系统 API,不受 ISR 环境限制。

Related APIs

相关 API(v2)

中断入口机制的核心 API

ISR 事件投递

函数:os_event_set_from_isr()

功能:在 ISR 中投递事件到任务

参数:事件 ID

调用环境:仅可在 ISR 中调用

中断状态查询

函数:os_in_isr()

功能:查询当前是否在中断上下文中

返回值:1 表示在 ISR 中,0 表示不在

用途:用于 API 的中断环境检测

中断调度请求

函数:os_schedule_request()

功能:请求调度器进行任务切换

调用时机:ISR 退出前可选调用

作用:加速高优先级任务响应

Execution Flow

执行流程

从中断触发到任务响应的完整路径

1硬件触发:外部中断信号触发 CPU 中断响应
2ISR 入口:CPU 跳转到中断向量表,执行 ISR
3事件投递:ISR 调用 os_event_set_from_isr() 投递事件
4ISR 退出:ISR 完成最小化处理,退出中断
5调度器介入:调度器检测到事件,唤醒等待任务
6任务执行:高优先级任务处理中断逻辑
IRQ Trigger → ISR Entry → os_event_set_from_isr() → ISR Exit → Scheduler → Task Run
Core Code

核心代码

中断入口机制的完整实现

中断入口完整示例

包含任务函数、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;
}
System Significance

系统意义

中断入口机制对 HRTOS 系统的价值

降低 ISR 执行时间 ISR 只执行最小化操作,显著减少中断响应时间,提高系统实时性
提高可预测性 ISR 执行时间固定且可预测,便于系统时序分析和性能调优
统一中断管理 所有中断通过事件机制统一管理,简化系统架构和调试过程
增强系统稳定性 复杂逻辑在任务层处理,避免 ISR 中的错误影响系统稳定性
系统本质: 将中断处理从"执行逻辑"转为"事件触发",显著降低 ISR 执行时间,提高系统实时性与可预测性。