|
xt-sdk 文档 v1.0.3
xt-sdk 嵌入式 SDK API 参考
|
版本:0.1 | 日期:2026-07-03 | 路径: platforms/components/xtiny/xt_safe/
xt_safe 是 xtiny 平台的中断管理与临界区模块,提供关中断/开中断/查询中断状态三个基础函数,以及一套简洁的临界区宏。在资源竞争敏感的场景中,通过短暂关闭全局中断来保护共享数据的原子性。
设计理念: 最小接口 + 平台可覆写宏 。平台只需实现三个函数,其余通过宏封装。宏全部使用 #if !defined() 模式,允许平台或上层组件注入自定义实现。
仅依赖 xt_utils.h (基本类型定义)。不依赖任何 OS 原语。
xt_safe 将临界区拆成三个宏,分别对应声明、加锁、解锁:
这种分离设计让代码结构清晰——声明区、临界区入口、出口各司其职,也避免了 save = disable(); /* ... */ enable(save); 手写变量声明的重复劳动。
xt_safe_disable_irq 返回的是 调用前的状态 而非"已关闭"标记。因此以下嵌套是安全的:
| 平台 | 关中断粒度 | 说明 |
|---|---|---|
| 默认实现 | 关全局中断 | 简单可靠,但会延迟所有中断响应 |
| 可定制 | 仅关某优先级中断 | 通过覆写 XT_CRIT_ENTRY / XT_CRIT_EXIT 实现 |
以下为函数签名大纲,完整的参数说明、返回值、注意事项请查看 xt_safe(安全功能) 。
| 函数签名 | 说明 |
|---|---|
| xt_cpu_base_t xt_safe_disable_irq(void) | 关闭全局中断,返回关闭前的中断状态 |
| void xt_safe_enable_irq(xt_cpu_base_t level) | 恢复中断到指定状态 |
| xt_cpu_base_t xt_safe_irq_is_enable(void) | 查询当前中断是否使能(非 0 为使能,0 为关闭) |
| 类型签名 | 说明 |
|---|---|
| xt_cpu_base_t | 中断状态保存类型,默认 uint32_t 。定义 XT_SAFE_CPU_BASE_64BITS 后为 uint64_t |
| 宏 | 说明 |
|---|---|
| XT_CRIT_STAT() | 声明局部变量 __l_irq_rest ,保存中断状态用 |
| XT_CRIT_ENTRY() | 关中断并保存状态 |
| XT_CRIT_EXIT() | 恢复中断状态 |
| xt_disable_irq() | xt_safe_disable_irq() 的简化别名 |
| xt_enable_irq(level) | xt_safe_enable_irq(level) 的简化别名 |
| xt_irq_is_enable() | xt_safe_irq_is_enable() 的简化别名 |
所有宏均采用 #if !defined() 模式,可在 xmake 中覆盖。
| 宏 | 默认值 | 说明 |
|---|---|---|
| XT_SAFE_CPU_BASE_64BITS | 未定义 | 定义后 xt_cpu_base_t 为 uint64_t |
| XT_CRIT_STAT | xt_cpu_base_t __l_irq_rest | 临界区状态声明,可覆写 |
| XT_CRIT_ENTRY | 关中断并保存 | 临界区入口,可覆写 |
| XT_CRIT_EXIT | 恢复中断 | 临界区出口,可覆写 |
在 XT_CRIT_ENTRY 和 XT_CRIT_EXIT 之间的 任何 提前返回路径都必须先调用 XT_CRIT_EXIT ,否则中断永远不会恢复。
通常建议使用宏而非直调函数——宏名明确表达了临界区的语义边界。
| 反模式 | 问题 | 正确做法 |
|---|---|---|
| XT_CRIT_ENTRY 后忘记 XT_CRIT_EXIT | 中断永久关闭,系统瘫痪 | 确保所有出口都调用 XT_CRIT_EXIT |
| 不保存返回值直接 xt_safe_disable_irq | 无法恢复到原来的中断状态 | 必须保存返回值并传入 enable_irq |
| 临界区内执行耗时操作 | 中断延迟大,影响实时性 | 临界区只做最必要的共享数据访问 |
| XT_CRIT_ENTRY 和 EXIT 不在同一函数 | 跨函数配对极易遗漏 | 永远在同一函数内配对 |