H HRTOS 示例
Interrupt Driven Core

中断延迟测试

在 HRTOS v2 中,中断延迟测试用于评估从 ISR 触发到任务响应的系统级延迟。 通过事件驱动模型,测量在不同负载条件下的调度延迟稳定性,验证实时系统的性能指标。

示例目标

系统运行三个任务:ISR 极简处理、response_task 响应中断事件、load_task 模拟调度压力。 通过统计 ISR 计数和任务计数,测量中断触发到任务响应的延迟时间。 验证 HRTOS 在不同负载下的实时性能和调度稳定性。

核心API os_event_set_from_isr
测试指标 ISR → Task 延迟
压力模拟 负载任务
性能验证 调度延迟稳定性

核心机制

  • ISR 极简处理
  • 事件投递机制
  • 延迟测量统计
  • 负载压力模拟
Principle

原理说明

中断延迟是实时系统性能验证的核心指标

中断延迟(Interrupt Latency)是指从硬件中断触发到任务开始执行响应逻辑之间的时间间隔。 在 HRTOS 中,延迟包含 ISR 执行时间、事件投递时间、调度器切换时间和任务唤醒时间。 低延迟是实时系统的关键要求,直接影响系统的实时性和可预测性。

什么是中断延迟

中断延迟是从中断触发到任务响应的完整时间链,包括 ISR 处理、事件投递、调度切换、任务唤醒等阶段。 在事件驱动模型中,延迟 = ISR 触发 → event 投递 → task 唤醒 → task 执行。

为什么需要测试延迟

实时系统对响应时间有严格要求,延迟过高会导致系统无法及时响应外部事件。 通过延迟测试,可以评估系统在不同负载下的性能表现,验证调度器的实时性和稳定性。

影响延迟的关键因素

延迟受多个因素影响:ISR 执行时间、调度器算法、任务优先级、系统负载、中断嵌套等。 通过优化这些因素,可以显著降低中断延迟,提高系统的实时响应能力。

HRTOS 的低延迟设计

HRTOS 通过 ISR 最小化、高效调度算法、优先级抢占等设计,实现低延迟响应。 事件驱动模型确保中断处理快速完成,任务层执行复杂逻辑,平衡实时性和功能性。

核心判断: 中断延迟测试是实时系统性能验证的核心指标,通过测量 ISR 到任务的响应时间, 评估系统在不同负载下的实时性能和调度稳定性。
HRTOS Implementation

HRTOS 实现机制

HRTOS 如何实现中断延迟测试

在 HRTOS v2 中,中断延迟测试的实现围绕 ISR 极简处理、事件投递机制、延迟测量统计和负载压力模拟四个核心环节展开。 每个环节都经过精心设计,确保测试结果的准确性和可靠性。

ISR 极简处理

处理内容:统计 ISR 计数、翻转 LED、投递事件

处理原则:最小化 ISR 执行时间

执行限制:不执行复杂逻辑

设计目标:减少 ISR 对延迟的影响

事件投递机制

投递方式:通过 os_event_set_from_isr() 投递事件

事件类型:使用 EVENT_IRQ 标志位

唤醒机制:自动唤醒等待的任务

通信模型:ISR 到任务的异步通信

延迟测量统计

测量方法:统计 ISR 计数和任务计数

计数变量:isr_cnt 和 task_cnt

延迟计算:通过计数差值评估延迟

LED 指示:通过 LED 翻转观察响应

负载压力模拟

负载任务:load_task 执行计算循环

压力来源:占用 CPU 时间

测试目的:模拟系统高负载场景

验证目标:评估负载对延迟的影响

Workflow

工作流程

中断延迟测试的完整执行路径

1系统初始化:hrtos_main 初始化事件、使能中断、创建三个任务
2负载运行:load_task 执行计算循环,模拟系统压力
3中断触发:外部中断 INT0 触发,CPU 跳转到 ISR
4ISR 执行:INT0_ISR 统计计数、翻转 LED、投递事件
5事件投递:通过 os_event_set_from_isr() 投递 EVENT_IRQ
6任务响应:response_task 被唤醒,统计计数并翻转 LED
系统初始化 → 负载任务运行 → 中断触发 → ISR 执行 → 事件投递 → 调度器切换 → 任务唤醒 → 延迟测量统计
Core Code

核心代码

中断延迟测试的完整实现

中断服务程序

INT0_ISR 中断服务程序,极简处理并投递事件

#include "hrtos.h"

sbit LED_ISR  = P1^0;
sbit LED_TASK = P1^1;
sbit LED_LOAD = P1^2;

#define EVENT_IRQ 1

static u16 isr_cnt = 0;
static u16 task_cnt = 0;

/* ISR(极简) */
void INT0_ISR(void)
{
    isr_cnt++;

    LED_ISR = ~LED_ISR;

    os_event_set_from_isr(EVENT_IRQ);
}

响应任务实现

response_task 任务函数,等待中断事件并统计延迟

/* 响应任务(测延迟点) */
void response_task(void)
{
    while(1)
    {
        os_event_wait(EVENT_IRQ, 0);

        task_cnt++;

        LED_TASK = ~LED_TASK;
    }
}

负载任务实现

load_task 任务函数,模拟系统调度压力

/* 负载任务(压力测试) */
void load_task(void)
{
    volatile u16 i;

    while(1)
    {
        LED_LOAD = ~LED_LOAD;

        for(i = 0; i < 20000; i++);
    }
}

系统初始化

hrtos_main 函数,初始化事件、使能中断并创建任务

/* 系统入口 */
void hrtos_main(void)
{
    os_event_init(EVENT_IRQ);

    IT0 = 1;
    EX0 = 1;

    os_task_create(INT0_ISR, 1, 9, 5);
    os_task_create(response_task, 2, 5, 5);
    os_task_create(load_task, 3, 3, 5);
}
Expected Result

运行结果

示例执行后的预期行为

LED 状态 LED_ISR 在 ISR 中翻转,LED_TASK 在任务中翻转,LED_LOAD 在负载任务中翻转
计数统计 isr_cnt 和 task_cnt 统计中断触发次数和任务响应次数,用于评估延迟
延迟表现 在不同负载下,观察任务响应的及时性,评估调度延迟稳定性
系统本质: 本示例的核心不是 LED,而是验证 HRTOS v2 中:从中断触发到任务响应的系统级延迟, 评估系统在不同负载下的实时性能和调度稳定性。
Important Notes

注意事项

使用本示例时需要关注的关键点

ISR 执行时间

ISR 必须保持极简,仅执行必要的统计和事件投递。 ISR 执行时间过长会直接影响延迟测量结果,无法准确评估系统的实时性能。

任务优先级设置

response_task 使用中等优先级(优先级 5),load_task 使用低优先级(优先级 3)。 优先级设置需要合理,确保负载任务不会阻塞响应任务的及时执行。

负载任务配置

load_task 的计算循环次数需要根据实际硬件调整,以模拟合适的系统负载。 负载过轻无法体现调度压力,负载过重可能导致系统响应过慢。

延迟测量方法

本示例通过计数统计评估延迟,实际应用中可以使用硬件定时器或高精度时钟进行精确测量。 计数方法适用于相对延迟评估,精确测量需要更专业的工具。