# libtask — 任务框架 API 参考 ## 模块概述 libtask 是嵌入式装置的通用任务调度框架,包含三个子系统: - **定时器**:基于 timerfd + epoll 精确毫秒级定时 - **事件**:基于位图 + pthread 条件变量的同步原语 - **消息队列**:基于环形缓冲区的线程安全 FIFO ## 常量与类型 ### 定时器标志 | 宏 | 值 | 说明 | |----|-----|------| | `TASK_TIMER_FLAG_ONCE` | 0x01 | 单次触发 | | `TASK_TIMER_FLAG_PERIODIC` | 0x02 | 周期触发 | ### 事件标志 | 宏 | 值 | 说明 | |----|-----|------| | `TASK_EVENT_WAIT_FOREVER` | 0xFFFFFFFF | 永久等待 | | `TASK_EVENT_FLAG_AND` | 0x01 | AND 模式(所有位都置位) | | `TASK_EVENT_FLAG_OR` | 0x02 | OR 模式(任意位置位) | | `TASK_EVENT_FLAG_CLEAR` | 0x04 | 接收后自动清除 | ### 回调类型 ```c typedef void (*timer_func_cb)(void *arg); ``` ### 不透明句柄 ```c typedef void *stru_task_timer_t; typedef void *stru_task_event_t; typedef void *stru_task_msg_queue_t; ``` ## 接口函数 ### 通用延时 #### task_sleep_ms(ms) 毫秒级精度延时(内部使用 nanosleep)。 ### 定时器 | 函数 | 说明 | |------|------| | `task_timer_create(name, cb, arg, timeout_ms, flags)` | 创建定时器(不自动启动) | | `task_timer_start(pt)` | 启动 | | `task_timer_stop(pt)` | 停止 | | `task_timer_restart(pt, timeout_ms)` | 重启(可改周期) | | `task_timer_destroy(pt)` | 销毁 | | `task_timer_is_active(pt)` | 查询运行状态 | ### 事件 | 函数 | 说明 | |------|------| | `task_event_create(name)` | 创建事件对象 | | `task_event_destroy(pe)` | 销毁 | | `task_event_send(pe, bits)` | 发送(置位+广播) | | `task_event_recv(pe, set, opt, timeout_ms, recved)` | 等待 | | `task_event_clear(pe, bits)` | 清除位 | | `task_event_query(pe)` | 查询当前位(非阻塞) | ### 消息队列 | 函数 | 说明 | |------|------| | `task_msg_queue_create(name, msg_size, msg_num)` | 创建 | | `task_msg_queue_destroy(pq)` | 销毁 | | `task_msg_queue_send(pq, msg, size)` | 发送(阻塞) | | `task_msg_queue_send_timeout(pq, msg, size, timeout_ms)` | 发送(超时) | | `task_msg_queue_recv(pq, msg, size, timeout_ms)` | 接收(超时) | | `task_msg_queue_try_recv(pq, msg, size)` | 非阻塞接收 | | `task_msg_queue_get_count(pq)` | 获取消息数 | | `task_msg_queue_space(pq)` | 获取剩余空间 | ## 使用示例 ### 定时器 ```c #include "myTask.h" #include static int tick_count = 0; void on_tick(void *arg) { tick_count++; printf("定时器触发: %d 次\n", tick_count); } int main(void) { // 创建周期定时器:每 100ms 触发一次 stru_task_timer_t pt = task_timer_create( "heartbeat", on_tick, NULL, 100, TASK_TIMER_FLAG_PERIODIC ); task_timer_start(pt); task_sleep_ms(500); // 等待 500ms(预计触发 5 次) task_timer_destroy(pt); return 0; } ``` ### 事件 ```c stru_task_event_t pe = task_event_create("ev1"); // 线程 A: 发送事件 task_event_send(pe, 0x03); // 设置 bit0 和 bit1 // 线程 B: 等待事件(OR 模式 + 自动清除) uint32_t recved = 0; task_event_recv(pe, 0x03, TASK_EVENT_FLAG_OR | TASK_EVENT_FLAG_CLEAR, TASK_EVENT_WAIT_FOREVER, &recved); printf("收到事件: 0x%02X\n", recved); // 0x03 task_event_destroy(pe); ``` ### 消息队列 ```c // 创建队列:每条 64 字节,容量 10 条 stru_task_msg_queue_t pq = task_msg_queue_create("q1", 64, 10); char tx[] = "Hello"; char rx[64]; task_msg_queue_send(pq, tx, 6); // 发送 task_msg_queue_recv(pq, rx, 64, 1000); // 接收(1 秒超时) printf("收到: %s, 队列中: %u 条\n", rx, task_msg_queue_get_count(pq)); task_msg_queue_destroy(pq); ``` ## 依赖关系 - **依赖**: liblog (错误日志) - **系统依赖**: ``, ``, ``, `` - **被依赖**: 所有需要定时/同步/通讯的模块