|
xt-sdk 文档 v1.0.3
xt-sdk 嵌入式 SDK API 参考
|
基于 LC(Local Continuation)+ timer2 + event 的轻量级协程任务调度 更多...
专题 | |
| xt_event(事件管理) | |
| 事件发布订阅模块接口(去重匹配、dispatch 上下文栈、临界区保护) | |
| xt_timer(软件定时器) | |
| XTINY 软件定时器接口(数组池、ID 索引方式) | |
| xt_timer2(硬件定时器) | |
| 新版软件定时器接口(对象化、单链表、new/delete 生命周期) | |
结构体 | |
| struct | xt_task |
| 任务控制块结构体 更多... | |
宏定义 | |
| #define | XT_TASK_INLIVAD_ID 0xff |
| 无效父任务 ID(0xff),表示无父任务的独立根任务 | |
| #define | XT_TASK_WAIT_FOREVER 0xffffffff |
| 永不超时标记(0xffffffff),用于纯事件等待(不启动定时器,无超时限制) | |
| #define | XT_TASK_LC_INIT_VALUE 0 |
| LC(Local Continuation)机制的初始值,表示协程从起始位置重新执行 | |
| #define | xt_task_lc_init(s) |
| 初始化 lc 变量 | |
| #define | xt_task_lc_resume(s) |
| 恢复协程执行点 | |
| #define | _xt_task_lc_set(s) |
| 设置协程恢复点(内部宏) | |
| #define | xt_task_lc_end(s) |
| 结束 lc switch 块 | |
| #define | XT_TASK_BEGIN() |
| 协程任务函数开头 | |
| #define | XT_TASK_END() |
| 协程任务函数结尾 | |
| #define | xt_task_delay(ms) |
| 延时等待若干毫秒后继续执行 | |
| #define | xt_task_wait_event(event_id, event_param) |
| 等待指定事件(永不超时) | |
| #define | xt_task_wait_until(event_id, timeout) |
| 等待指定事件或超时 | |
| #define | xt_task_call_subtask(entry, user_data) |
| 调用子任务并等待其完成 | |
类型定义 | |
| typedef void(* | xt_task_entry_t) (void *user_data) |
| 协程任务入口函数类型 | |
| typedef struct xt_task | xt_task_t |
| 协程任务句柄 | |
函数 | |
| void | xt_task_timer_start (uint32_t timeout_ms) |
| 启动当前 task 的定时器 | |
| void | xt_task_event_subscribe (xt_event_id_t event_id, uint32_t timeout_ms) |
| 为当前 task 订阅事件 | |
| void | xt_task_event_handler (xt_event_id_t event_id) |
| 事件到达分发入口 | |
任务生命周期与控制 | |
| xt_err_t | xt_task_setup (void) |
| 初始化 task 子系统 | |
| xt_task_t * | xt_task_start (xt_task_entry_t entry, void *user_data) |
| 启动一个协程任务 | |
| xt_task_t * | xt_task_running (void) |
| 获取当前正在运行的 task | |
| bool | xt_task_is_running (xt_task_t *task) |
| 检查 task 是否在运行 | |
| void | xt_task_sys_reset (void) |
| 重置 task 子系统(仅测试用) | |
基于 LC(Local Continuation)+ timer2 + event 的轻量级协程任务调度
| #define _xt_task_lc_set | ( | s | ) |
| #define XT_TASK_BEGIN | ( | ) |
协程任务函数开头
必须在每个 task 入口函数的最顶部使用,与 XT_TASK_END() 配对。 声明局部 yield 标志变量 XT_TASK_YIELD_FLAG,并通过 xt_task_lc_resume 恢复协程执行点。 首次进入时 lc == 0,从 case 0 进入;yield 后 lc 记录行号,resume 时跳转到对应位置。 通过 _Pragma("GCC diagnostic ignored \"-Wimplicit-fallthrough\"") 抑制 lc case fallthrough 警告。 _Pragma 是 C99 标准预处理运算符,在 -std=gnu99 下可用。
| #define xt_task_call_subtask | ( | entry, | |
| user_data ) |
调用子任务并等待其完成
启动子任务 entry,当前父任务 yield 挂起直到子任务完成。 子任务在 _xt_task_call 中完成时,父任务被恢复执行。 子任务通过 parent_id 字段关联父任务(记录父任务在 xt_task_array 中的索引)。
| entry | 子任务入口函数 |
| user_data | 子任务透传数据 |
| #define xt_task_delay | ( | ms | ) |
延时等待若干毫秒后继续执行
启动当前 task 的内嵌定时器,设置延迟 ms 毫秒后恢复执行。 内部调用 xt_task_timer_start + lc 设置 + return 使协程挂起。 超时后 timer2 回调触发 _xt_task_call 重新调用 task entry 函数, lc resume 跳转到 _xt_task_lc_set 记录的 case 行号处继续执行。
| ms | 延迟毫秒数,不能超过 XT_TIMER2_TIMEOUT_MAX |
| #define XT_TASK_END | ( | ) |
协程任务函数结尾
必须在每个 task 入口函数的最底部使用,与 XT_TASK_BEGIN() 配对。 调用 xt_task_lc_end 闭合 switch 块,并重置 lc 为 XT_TASK_LC_INIT_VALUE。 作用域结束时 XT_TASK_BEGIN 的 { 与 XT_TASK_END 的 } 配对闭合。
| #define xt_task_lc_end | ( | s | ) |
| #define xt_task_lc_init | ( | s | ) |
初始化 lc 变量
将 lc 重置为 XT_TASK_LC_INIT_VALUE。 XT_TASK_END() 中调用,确保任务结束后下次重新进入时从开头执行。
| #define xt_task_lc_resume | ( | s | ) |
恢复协程执行点
生成 switch(s) 块,case XT_TASK_LC_INIT_VALUE 作为首次进入点。 若 lc 已被 _xt_task_lc_set 修改为某个行号 __LINE__,则直接跳转到对应 case 标签处继续执行。 隐式 fallthrough 警告由 XT_TASK_BEGIN/END 中的 _Pragma 抑制。
| #define xt_task_wait_event | ( | event_id, | |
| event_param ) |
等待指定事件(永不超时)
订阅 event_id 事件后通过 lc yield 挂起当前协程。 事件到达后 xt_task_event_handler 唤醒 task,lc resume 后 event_param 接收事件参数。 通过 XT_TASK_WAIT_FOREVER 标记不启动定时器,纯事件等待。
| event_id | 等待的事件 ID |
| event_param | 输出参数,接收 xt_event_get_current_event_param() 返回的事件参数 |
| #define XT_TASK_WAIT_FOREVER 0xffffffff |
| #define xt_task_wait_until | ( | event_id, | |
| timeout ) |
等待指定事件或超时
同时订阅事件并启动定时器。两种唤醒路径互斥:
唤醒后调用者需通过 xt_event_get_current_event_id() 判断唤醒原因:
| event_id | 等待的事件 ID |
| timeout | 超时毫秒数,不能超过 XT_TIMER2_TIMEOUT_MAX |
| typedef void(* xt_task_entry_t) (void *user_data) |
| void xt_task_event_handler | ( | xt_event_id_t | event_id | ) |
事件到达分发入口
遍历任务数组,唤醒等待 event_id 的任务。由 xt_event_handler 调用。
| event_id | 触发的事件 ID |
| void xt_task_event_subscribe | ( | xt_event_id_t | event_id, |
| uint32_t | timeout_ms ) |
为当前 task 订阅事件
| event_id | 事件 ID |
| timeout_ms | 超时毫秒数,XT_TASK_WAIT_FOREVER 表示永不超时 |
| bool xt_task_is_running | ( | xt_task_t * | task | ) |
检查 task 是否在运行
entry 非 NULL 表示 task 仍在运行(含 yield 等待中)。
| task | task 句柄 |
| xt_task_t * xt_task_running | ( | void | ) |
获取当前正在运行的 task
| NULL | 无 task 在运行 |
| xt_err_t xt_task_setup | ( | void | ) |
初始化 task 子系统
幂等:多次调用只执行一次。清零 task 数组,初始化 event 和 timer2 子系统。
| xt_task_t * xt_task_start | ( | xt_task_entry_t | entry, |
| void * | user_data ) |
启动一个协程任务
从 task 数组分配一个空闲槽位,设置入口函数和用户数据,然后立即第一次调用。
| entry | 任务入口函数 |
| user_data | 用户透传数据 |
| NULL | 分配失败(task 数组满) |
| void xt_task_sys_reset | ( | void | ) |
重置 task 子系统(仅测试用)
清零 task 数组,复位当前 task 指针。 不触碰 timer2 和 event 子系统(由各自 reset 函数管理)。
| void xt_task_timer_start | ( | uint32_t | timeout_ms | ) |
启动当前 task 的定时器
| timeout_ms | 超时毫秒数,不能超过 XT_TIMER2_TIMEOUT_MAX |