跳转至

TinyBench 源码解析

数据槽管理

put — 放数据到工作台

tiny_bench_err_t tiny_bench_put(tiny_bench_t *bench,
                                const char *name,
                                void *data, size_t len,
                                tiny_type_t type)

逻辑: 1. 校验参数(benchname 非空) 2. 校验名称长度(不超过 TINY_BENCH_NAME_LEN) 3. 检查是否已存在同名槽 → 返回 ERR_EXISTS 4. 找空闲槽位 → 满则返回 ERR_FULL 5. 复制名称、存指针/长度/类型 → 标记 used = true

零拷贝关键

只复制 name 到内部表,data 只存指针。调用者保证数据在 get 前有效。

get — 取数据

tiny_bench_err_t tiny_bench_get(tiny_bench_t *bench,
                                const char *name,
                                void **out_data, size_t *out_len,
                                tiny_type_t *out_type)

逻辑: 1. 查找名称匹配的 slot 2. 如果 out_dataout_lenout_type 非空,写入对应值 3. 不存在返回 ERR_NOT_FOUND

支持只查存在性:tiny_bench_get(&bench, "x", NULL, NULL, NULL)

list_data — 列出所有数据

int tiny_bench_list_data(tiny_bench_t *bench,
                         const char **names, int max_count)

遍历所有 slot,收集 used 槽的 name 指针到输出数组。返回写入数量。

工具注册管理

register_tool — 注册工具

tiny_bench_err_t tiny_bench_register_tool(tiny_bench_t *bench,
                                          const char *name,
                                          tiny_tool_fn fn,
                                          tiny_type_t in_type,
                                          tiny_type_t out_type)

逻辑: 1. 校验参数、名称长度 2. 检查重名 → ERR_EXISTS 3. 找空闲槽 → ERR_FULL 4. 记录名称、函数指针、输入/输出类型

get_tool_fn — 取工具函数指针

这是 TinyOrch 执行流程时调用的关键函数:

tiny_bench_err_t tiny_bench_get_tool_fn(tiny_bench_t *bench,
                                         const char *name,
                                         tiny_tool_fn *out_fn,
                                         tiny_type_t *out_in,
                                         tiny_type_t *out_out)

返回函数指针 + 输入/输出类型,调用者据此执行工具并做类型检查。

类型系统

const char *tiny_bench_type_name(tiny_type_t type)

将枚举值转为可读字符串。用于调试输出和 MQTT 响应。实现为一个简单的 switch-case

switch (type) {
    case TINY_TYPE_F32:      return "f32";
    case TINY_TYPE_F32_ARR:  return "f32[]";
    // ...
}

错误处理模式

所有错误码统一为 tiny_bench_err_t 枚举,与 ESP-IDF 的 esp_err_t 分离以保持模块独立。调用模式:

tiny_bench_err_t e = tiny_bench_put(&bench, "x", data, len, type);
if (e == TINY_BENCH_ERR_FULL) {
    // 工作台满了,考虑扩容或清理
}