H HRTOS 示例
System Resource Protection

栈溢出检测

在 HRTOS v2 中,栈溢出检测通过 slab overflow 机制与 hook 回调实现,在运行时捕获任务栈越界行为, 提供实时系统保护。任务栈管理是实时系统稳定性的关键保障。

示例目标

系统运行一个测试任务,通过模拟栈增长触发溢出检测机制。 当任务栈超过 slab 分配边界时,系统触发 overflow hook 回调, 验证 HRTOS 在资源受限 MCU 中的安全保护设计。

核心API os_slab_overflow_register
检测机制 slab overflow
保护方式 hook 回调
触发条件 SP 越界

核心机制

  • Slab 边界检测
  • 溢出中断触发
  • Hook 回调机制
  • 实时捕获保护
Principle

原理说明

栈溢出检测是实时系统稳定性的关键保障

栈溢出(Stack Overflow)是指任务栈空间不足,栈指针(SP)超出分配边界, 导致数据覆盖其他任务栈或系统关键区域。在资源受限的 MCU 中, 栈空间有限,栈溢出是系统崩溃的主要原因之一。

什么是栈溢出

栈溢出是任务栈增长超过分配边界的异常状态,可能由深层递归、局部变量过大、 中断嵌套过深等原因引起。在 HRTOS 中,通过 slab 分配器自动记录栈边界。

为什么需要检测

栈溢出会导致不可预测的系统行为,包括数据损坏、任务崩溃、系统死机。 实时检测栈溢出可以及时触发保护机制,避免系统进入不可控状态, 提高嵌入式系统的可靠性和安全性。

检测机制演进

传统方法使用 canary 检测和周期扫描,只能在事后发现问题。 HRTOS v2 采用 slab 边界检测和实时 SP 越界触发,实现从"事后检测"到"实时捕获"的升级。

Hook 回调机制

用户可以注册 overflow hook 函数,在检测到栈溢出时执行自定义处理逻辑, 如点亮报警 LED、记录错误信息、进入安全模式等,提供灵活的系统保护策略。

核心判断: 栈溢出检测是 HRTOS 在资源受限 MCU 中的安全保护设计, 通过 slab overflow 机制与 hook 回调,将栈溢出从"不可控崩溃"转变为"可捕获的系统级异常事件"。
HRTOS Implementation

HRTOS 实现机制

HRTOS 如何实现栈溢出检测

在 HRTOS v2 中,栈溢出检测的实现围绕 Slab 边界检测、溢出中断触发、Hook 回调机制和实时捕获保护四个核心环节展开。 每个环节都经过精心设计,确保检测过程的高效性和可靠性。

Slab 边界检测

检测方式:任务栈基于 slab 分配器,自动记录上下边界

边界管理:每个任务栈分配时记录安全区间

监控机制:实时监控栈指针(SP)是否超出边界

设计考虑:最小化检测开销,不影响任务正常运行

溢出中断触发

触发条件:SP 超出 slab 分配的安全区间

触发方式:进入 overflow handler 中断处理

响应速度:实时触发,无需等待周期扫描

保护机制:立即停止任务,防止进一步损坏

Hook 回调机制

注册方式:通过 os_slab_overflow_register() 注册处理函数

回调时机:检测到栈溢出时立即调用

用户控制:用户可自定义处理逻辑

典型应用:点亮报警 LED、记录错误日志、进入安全模式

实时捕获保护

捕获方式:从"事后检测"升级为"实时捕获"

保护策略:及时触发保护,避免系统崩溃

状态转换:任务进入异常状态,系统进入保护模式

恢复机制:根据用户策略决定是否重启或恢复

Workflow

工作流程

从任务创建到栈溢出检测的完整执行路径

1任务创建:hrtos_main 中创建 task_stack_demo,栈由 slab 分配器管理
2Hook 注册:注册 overflow_handler 处理函数,准备异常捕获
3任务运行:任务执行 deep_call 函数,模拟栈增长
4栈压力测试:通过 SP = SP + n 模拟异常栈增长
5边界检测:slab 分配器检测到 SP 超出安全区间
6溢出触发:进入 overflow handler,执行 hook 回调
7保护执行:点亮报警 LED,系统进入安全保护状态
hrtos_main → os_slab_overflow_register → os_task_create → slab 分配栈 → 任务运行 → deep_call → SP 增长 → 边界检测 → 溢出触发 → hook 回调 → 报警保护
Core Code

核心代码

栈溢出检测的完整实现

Overflow Hook 处理函数

栈溢出时的回调处理函数,点亮报警 LED 并进入安全状态

#include "hrtos.h"

sbit LED_STACK = P1^0;

/* =========================
 * overflow hook
 * ========================= */
void overflow_handler(void)
{
    LED_STACK = 0;   // 报警常亮
    while(1);
}

栈压力测试任务

通过模拟栈增长触发溢出检测机制

/* =========================
 * 制造栈压力
 * ========================= */
void deep_call(unsigned int n)
{
    SP = SP + n;   // 模拟异常增长
    os_delay(200);
}

/* =========================
 * 测试任务
 * ========================= */
void task_stack_demo(void)
{
    while(1)
    {
        deep_call(20);
    }
}

系统初始化与 Hook 注册

hrtos_main 函数,注册 overflow hook 并创建测试任务

/* =========================
 * 系统入口
 * ========================= */
void hrtos_main(void)
{
    LED_STACK = 1;

    // 注册 overflow hook
    os_slab_overflow_register(overflow_handler);

    // 创建任务(栈由 slab 管理)
    os_task_create((unsigned int)task_stack_demo, 1, 5, 1);
}
Expected Result

运行结果

示例执行后的预期行为

LED 状态 LED_STACK 初始为熄灭状态,检测到栈溢出后常亮报警
Hook 触发 当 SP 超出 slab 边界时,overflow_handler 被调用
系统保护 系统进入安全保护状态,任务停止运行
系统本质: 本示例的核心不是 LED,而是验证 HRTOS v2 中:栈溢出不再是"不可控崩溃",而是可捕获的系统级异常事件(hook 驱动)。
Important Notes

注意事项

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

任务栈配置

任务栈大小应根据实际需求合理配置,栈空间过小容易触发溢出, 过大则浪费有限的 MCU 内存资源。本示例使用 slab 分配器自动管理栈空间。

Hook 函数设计

overflow_handler 应该简洁高效,避免在异常处理中再次触发栈溢出。 典型处理包括点亮报警 LED、记录错误信息、进入安全模式或系统重启。

检测机制选择

HRTOS v2 的 slab overflow 机制相比传统的 canary 检测具有实时性优势, 能够在栈溢出发生时立即触发保护,而不是等待周期扫描。

系统稳定性影响

栈溢出是嵌入式系统崩溃的主要原因之一,实时检测和保护机制 能够显著提高系统在资源受限环境下的稳定性和可靠性。