|
xt-sdk 文档 v1.0.3
xt-sdk 嵌入式 SDK API 参考
|
版本:0.1 | 日期:2025-07-03 | 路径: components/xt_task/xt_timer.h
一次性延时定时器,到期后在 xt_timer_handler 中触发回调。单线程环境下工作。采用 数组池 + ID 索引 方案,通过 UID 递增和 Magic 校验防止槽位复用导致的误操作。
| 依赖 | 用途 |
|---|---|
| xtiny.h | 基础类型和宏 |
| cmsis_os2.h(可选) | OS 扩展( XT_TASK_ENABLE_OS 时) |
FIRING 状态的核心作用:回调中 stop 自己时,handler 停下后检查 state != FIRING 或 uid 不匹配 ,不会重复清理已停止的定时器或错误清除被复用的槽位。
ID 编码为 (uid << 8) | slot :
UID 从 1 开始递增,跳过 0,回绕后也跳回 1。停止定时器时校验 uid 匹配,防止误删被复用的槽位。
每个槽位有 magic 字段( XT_TIMER_MAGIC = 0x584D544DU ),在 setup 时设置,之后永不改变。所有操作前校验 magic,用于检测内存踩踏。若 magic 损坏的槽位状态为 IDLE, start 会跳过它继续查找其他可用槽位。
以下为函数签名大纲,完整的参数说明、返回值、注意事项请查看 xt_timer(软件定时器) 。
| 函数签名 | 说明 |
|---|---|
| void xt_timer_setup(void) | 初始化定时器模块,清零槽位并写入 magic |
| 函数签名 | 说明 |
|---|---|
| uint32_t xt_timer_start(xt_timer_cb_t timer_cb, void *user_data, uint32_t timeout_ms) | 启动一次性定时器,返回 ID(INVALID 表示失败) |
| void xt_timer_stop_no_safe(uint32_t timer_id) | 停止定时器(不修改传入的变量) |
| uint32_t xt_timer_remain(uint32_t timeout_tick) | 计算剩余 tick 数(0 表示已到期) |
| uint32_t xt_timer_handler(void) | 主循环处理,返回下次需等待的最小 tick 数 |
xt_timer_stop(timer_id) 是宏,内部临时变量保证参数仅求值一次,停止后置 timer_id 为 XT_TIMER_INVALID_ID 。参数必须是左值(变量)。
返回 min(定时器下次超时, task 下次超时) 。主循环可将其用作延时参数:
| 行为 | 说明 |
|---|---|
| 一次性 | 触发后自动清除,非周期定时器。需要周期触发请在回调中重新 start |
| timeout 上限 | 最大 INT32_MAX ms(约 24.8 天) |
| 回调中 start timeout=0 | 新定时器可能在 同一轮 handler 中被触发(确定性行为) |
| 回调中 stop 自己 | 安全,handler 不会重复清除 |
| 回调中 stop 后 start 同槽位 | 安全,handler 的 uid 检查防止误清除新定时器 |
| 未调用 setup | 所有 magic 检查失败,start 返回 INVALID |
| 槽满 | start 返回 INVALID |
| xt_timer_stop 参数 | 必须是左值(变量),不能是函数返回值 |
| 定时器 ID | 调用方需保存返回的 ID,用于后续 stop |
| 宏 | 默认值 | 说明 |
|---|---|---|
| XT_TIMER_NUM | 10 | 定时器槽位数量(最大 256) |
| XT_TIMER_ID_SLOT_BITS | 8 | 槽位在 ID 中的位宽 |
| XT_TIMER_MAGIC | 0x584D544DU | 内存踩踏检测哨兵值 |
测试套件位于 tests/xt_timer/ :