Releases: BunnyDeny/LinCLI
Release list
LinCLI v1.20.0
🎉 LinCLI v1.20.0 发布公告
🌟 概述
v1.20.0 是 LinCLI 自 v1.19.0 以来的重大更新版本,核心变化是日志系统全面重构——将内联打印逻辑从 cli_io.c 解耦为独立日志库 log_output(即 tinypr),并深度集成到 LinCLI 的交互框架中。
🚀 新特性
-
🎯 独立日志库
log_output- 从
cli_io.c解耦出零 CLI 依赖的独立日志层 - 提供通用生命周期钩子:
output_begin/output_end - 支持 kfifo 环形缓冲(硬依赖),所有输出先入环再
flush() - 支持级别过滤、着色、批量模式、续批模式、截断、压力测试
- 从
-
✨ 续批模式(KERN_CONT 风格)
- 新增
log_batch_begin_cont()/pr_cont宏 - 允许跨多次调用的续行打印,首条带前缀,后续隐藏
- 已集成到调度器尾行打印(tick 打印不再出现重复时间戳前缀)
- 新增
-
🆕
cli_term.c终端适配层- 桥接
log_output与 LinCLI 交互状态 - 输出前自动清提示符行(
\r\033[K),输出结束后恢复
- 桥接
🐛 Bug 修复
- 🔧 交互模式提示符修复 —
cli_printk_batch_end仅在交互态恢复提示符,避免key命令等非交互场景残留提示符 - 🔧 ISR 打印修复 — 首次调用推
\r\n避开提示符行,后续调用不推以支持跨行输出 - 🔧 ISR 中保留
\r仅跳过\033[K— 避免光标位置错乱 - 🔧 非换行结尾自动补
\r\n—cli_printk内容不以\n结尾时自动补全 - 🔧
log_output_set_ring段错误 — 修复拷贝未初始化 kfifo 导致的崩溃 - 🔧 kfifo 内存屏障 — 对齐 Linux 内核实现,确保 SPSC 安全
- 🔧 batch_begin 进批量模式时清一次行 — 避免行首残留
🛠️ 重构与改进
- ♻️ 日志系统全面重写 — 移除旧式
sys_printk和cli_vsnprintf模块 - ♻️ kfifo 硬依赖 — 移除
LOG_OUTPUT_HAVE_KFIFO条件编译开关 - ♻️
log_term_ops→log_output_hooks— 钩子结构体通用化重命名 - ♻️ 移除
in_atomic钩子 — 语义重复,用户可在钩子内部自行判断 - ♻️ 移除
log_output_set_ring无用ring参数 — API 精简 - ♻️ 移除
in队列临界区 — 改用 kfifo 无锁 SPSC 模式 - 📏 基线工程 Flash 测量 — 增加 snprintf dummy 调用以正确反映真实 Flash 占用
📝 文档
- 📚 新增
log_output.hAPI 文档 — 每个函数包含动机说明、参数表、返回值、示例 - 📚 新增移植指南 — 如何在 MCU 项目中集成
log_output - 📚 新增 LinCLI 集成章节 — 说明
cli_term.c的适配原理 - 📚 清理第三方文档 — 删除
cli_vsnprintf和cli_kconfig.h相关文档
🧪 测试
- ✅ 13 组测试用例,40+ 断言全部通过
- ✅ 覆盖:基本输出、级别过滤、直通输出、原始输出、终端钩子、临界区、批量模式、续批、环形缓冲、截断、压力测试(1000 次调用)
- ✅ LinCLI 全功能配置编译测试通过
⚡ 性能与体积
| 指标 | 变化 |
|---|---|
| 📉 代码行数 | -828 行(删除旧 vsnprintf、sys_printk) |
| 🪶 Flash 占用 | 基线测量反映真实占用(含 snprintf 格式化层) |
| ⚡ 吞吐 | kfifo SPSC 无锁入队,ISR 安全 |
💡 升级建议:此版本涉及底层日志系统重构,从 v1.19.x 升级时建议重新运行
make menuconfig确认 Kconfig 配置,然后执行make clean && make确保完整编译。
LinCLI v1.9.0
🎉 LinCLI v1.19.0 发布说明
📅 发布日期:2026-05-23
🏷️ 版本号:v1.19.0
🌿 合并分支:dev→main
🎯 版本概览
v1.19.0 是一个以稳定性修复和工具体验优化为主的维护版本。在 v1.18.0 引入 hexdump 第三方组件和 CMake 重构的基础上,本次更新重点修复了示例工程构建、脚本工具、编译警告等问题,同时增强了 hexdump 的运行时配置能力。
✨ 新增功能
💎 hexdump 支持运行时配置 max_len
- 🆕 新增
-L/--max-len选项,可在--config模式下设置单次 dump 的最大字节数(范围 1 ~ 4096) - 📏 配置会同步写入
hd_cfg.max_len,立即生效 - 📖 配套文档已同步更新,新增示例与依赖说明
admin@linCli> hexdump --config -m 0x00400000 -M 0x00401000 -L 512
hexdump config:
min_addr : 0x00400000
max_addr : 0x00401000
bytes_per_line : 16
max_len : 512🐛 Bug 修复
🔧 sync-kconfig 修复配置源路径
- ✅
make sync-kconfig现在从当前构建配置.config读取,而非硬编码的configs/lincli_defconfig - 📝 确保示例工程生成的
cli_kconfig.h与开发者实际构建配置一致
🔧 STM32 G431 示例工程补全
- ✅ 补充 Makefile 中缺失的源文件与头文件路径
- ✅ 移除不支持的
nano.specs链接选项,避免链接失败 - ✅ 新增
test_no_tail_pr_defconfig关联配置
🔧 消除编译警告
- ✅ 修复
src/third_party/hexdump/hexdump.c中的类型不匹配警告 - 🛡️ 提升嵌入式严格编译环境下的通过性
🔧 auto_cmd 测试用例异常失效
- ✅ 修正
tests/commands/Kconfig中缺失的依赖项 - ✅ 移除
test_auto_cmd.c中被注释掉的无效代码 - 🎯 确保
make menuconfig开启演示后自动命令正常执行
⚡ 工具与工程改进
📉 measure_size.sh 大幅简化
- 🪶 脚本行数从 ~320 行精简至 ~160 行,逻辑更清晰
- 🆕 新增
configs/max_defconfig— 开启全部可选功能的最全配置 - 🆕 新增
configs/mini_defconfig— 关闭全部可选功能的最小配置 - 📊 默认行为改为基于
.config的增量测量,结果更准确
📁 配置文件补全
- ✅
full_test_defconfig补充hexdump组件开关,与文档保持一致
📝 工程与文档
📚 文档修正
- ✅
docs/hexdump.md:修正-L/--max-len选项的依赖说明,明确其仅在--config模式下可用 - ✅ 依赖矩阵表同步更新,避免用户误用
🏗️ 工程文件
- ✅
.gitignore新增*.swp,过滤 Vim 临时文件
⚖️ 体积参考
| ⚙️ 配置 | 💾 Flash(ARM Cortex-M4, -Os, 无 LTO) |
|---|---|
| 全开(默认) | ~24.1 KB |
| 最小化(全部关闭) | ~13.1 KB |
🙏 致谢
感谢所有在 v1.18.0 发布后提交反馈、测试示例工程和文档的用户。v1.19.0 的每一项修复都源于实际使用中的真实问题。
如有问题或改进建议,欢迎提交 Issue 或 PR!
🚀 快速升级:
git fetch origin git checkout main git pull origin main make mrproper && make
LinCLI v1.18.0
🎉 LinCLI v1.18.0 Release Notes
📅 发布日期:2026-05-15
🎯 版本:v1.18.0
🚀 重磅新功能
🖨️ 新增 hexdump 第三方组件
v1.18.0 最核心的亮点 —— hexdump 内存转储工具正式上线!
- ✅ 按指定地址和长度 dump 内存内容
- ✅ 十六进制 + ASCII 双列显示
- ✅ 🔵 蓝色地址列、🔷 青色 ASCII 列的彩色终端输出
- ✅ 可配置的地址范围保护(防止误读非法地址)
- ✅ 自动表头与分隔线
- ✅
--config模式配置地址范围保护 - ✅
hexdump_default_read弱符号自定义读取,无需修改源码 - ✅ 完整组件文档:
docs/hexdump.md
admin@linCli> hexdump -a 0x00400000 -l 64 -C
addr value ascii
-------------------------------------------------------------------------------
0x00400000: 7F 45 4C 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF............|⭐ 功能增强
🔢 cli_atoi 支持十六进制解析
- ✅
cli_atoi现已支持0x/0X前缀的十六进制字符串解析 - ✅ 单元测试覆盖十六进制边界场景
🛠️ 构建系统重构
🏗️ CMake 大幅精简
- ✅ 移除
listINTERFACE 库的冗余定义 - ✅ 将
workqueue/hexdump第三方组件并入src统一管理 - ✅ 删除 3 个冗余的
CMakeLists.txt - ✅ 提取公共构建逻辑到
cmake/lincli_build.cmake - ✅
src/CMakeLists.txt、tests/commands/CMakeLists.txt统一为 3 行公共模板 - ✅
tests/unit/CMakeLists.txt保持独立完整脚本
🐛 Bug 修复
| 修复项 | 说明 |
|---|---|
| 🛡️ 弱符号函数风险 | 修复存在风险的弱符号函数实现 |
| 🖨️ hexdump 命令不可用 | 修复 hexdump 命令注册与解析问题 |
| 📋 Kconfig 层级 | 修正 hexdump Kconfig 子选项的显示层级 |
| 🔄 CLI_COMMAND 重写 | hexdump 改用标准 CLI_COMMAND 选项系统重写 |
| 🔧 弱符号读取 | 移除 hexdump.h,改用弱符号实现读取回调 |
📝 文档更新
- ✅ 新增
docs/hexdump.md— hexdump 完整使用指南 - ✅ 新增
docs/third_party_components.md— 第三方组件总览导航 - ✅ 更新
README.md— 调整第三方组件链接指向总览页
📦 配置文件
- ✅ 新增
configs/test_no_tail_pr_defconfig— 无尾行打印测试配置
⚙️ 版本号
#define CLI_VERSION_MAJOR 1
#define CLI_VERSION_MINOR 18
#define CLI_VERSION_PATCH 0🎊 感谢使用 LinCLI!如有问题欢迎提交 Issue 或 PR。
LinCLI v1.7.1
🎯 LinCLI v1.17.1 发布文档
🚀 版本概览
✨ 本次版本聚焦于 Tab 补全引擎的全面现代化重构。🎉
🔹 从单一前缀匹配升级为子字符串搜索 + 智能分组 + 颜色区分
🔹 大幅精简 cli_completion.c 重复代码,合并三套镜像逻辑
🔹 修正 README 中体积数据,使其与 tools/measure_size.sh 真实测量一致
🆕 核心功能
⚡ 全面子字符串化 Tab 补全
🔹 命令名、选项名、候选值均支持子字符串匹配
🔹 前缀匹配项优先显示,子字符串匹配项以暗淡色区分 📉
🔹 智能 LCP(最长公共前缀)计算,支持前后向扩展 🔍
🔹 候选列表支持高亮循环模式(Tab / ↓ / → 切换)🔄
🪶 cli_completion.c 大幅瘦身
🔹 合并命令 / 选项 / 值三套重复的 LCP 计算、统计、查找逻辑
🔹 合并选项与值的显示函数与列表渲染逻辑
🔹 提取通用候选匹配数组 cand_match 统一处理
🔹 代码行数:1894 → 1476 行(-22%)
🔹 全量 Flash:24.11 KB(真实测量值)
🐛 Bug 修复
🎯 Tab 补全交互修复
✅ 修复命令名补全高亮与状态残留问题
✅ 修复命令名补全删除后 Tab 无反应及高亮索引错乱
✅ 修复命令名补全高亮循环状态被重置及退格/Delete 终端未刷新
✅ 修复退格清空命令行后 Tab 补全只响铃不显示列表
✅ 修复退格后 prefix 指针被 do_delete 回填空格污染导致匹配失败
✅ 修复选项/值补全高亮及 repl_start 丢失导致追加的多个 bug
✅ 修复 log --<tab> 时只显示长选项、不显示短选项的问题
✅ 修复尾行打印(inline print)触发候选列表重绘时第一个候选被错误高亮的 bug
🧹 代码质量
✅ 移除重构引入的未使用变量编译警告
✅ 删除误提交的临时调试脚本
📚 文档
📖 用户与开发者文档
📝 新增 docs/smart_completion_impl.md — 现代化智能前缀补全实现详解
📝 新增 docs/lincli_vs_letter_shell.md — LinCLI 与 letter-shell 选型对比指南
📝 新增 docs/cli_user.md — 用户系统使用文档
📋 项目规范
📝 SKILL.md 补充交互类 Bug 调试优先原则及临时脚本处置规范
📝 新增 Markdown 文档 Emoji 使用规范
📊 体积数据修正
🔹 修正 README 中沿用 v1.16.x 的旧体积数据,更新为真实测量值
| 📊 配置 | 📉 v1.16.0 | 📈 v1.17.1 | 🎯 变化 |
|---|---|---|---|
| 📄 全量 Flash | 22.48 KB | 24.11 KB | ⬆️ +1.63 KB |
| 📄 无高级补全 Flash | 17.78 KB | 19.19 KB | ⬆️ +1.41 KB |
| 🧠 全量 RAM | 5.46 KB | 5.74 KB | ⬆️ +0.28 KB |
💡 增量来源:子字符串搜索 + 颜色分组 + 高亮循环 + cand_buf[32]
⚙️ 其他改进
🔧 CLI_DEFAULT_USER 宏支持运行时设置默认登录用户
🔧 简化 user 模块的条件编译逻辑
🔧 CLI_DEFAULT_USER 宏改为在 auto_run 完成后切换用户
📊 常用裁剪组合参考(已更新)
| ⚙️ 配置 | 💾 Flash |
|---|---|
| 全开(默认) | ~24.1 KB |
| 关高级补全 | ~19.2 KB |
| 关高级补全 + 环境变量 + 变量导出 | ~15.4 KB |
| 关上述三项 + 帮助 + 命令链 + 自动运行 | ~14.3 KB |
| 全部关闭(仅核心骨架) | ~13.1 KB |
🎓 升级建议
💡 已使用 v1.16.x 的用户可放心升级,现有命令注册方式完全向后兼容。
💡 如 Flash 预算紧张,关闭 CLI_ENABLE_ADVANCED_COMPLETION 仍可获得完整的命令名补全(仅 19.2 KB)。
💡 建议所有使用高级 Tab 补全的用户升级,享受更智能的补全体验。
🌟 感谢使用 LinCLI!如有问题请通过 GitHub Issues 反馈。
LinCLI v1.16.0
🚀 LinCLI v1.16.0 发布说明
发布日期: 2026-05-11
标签:v1.16.0
✨ 核心亮点
本版本带来了备受期待的 Raw Command(原始参数命令) 支持,让 LinCLI 在保持原有 option-parsing 范式的同时,也能优雅地支持 argc/argv 风格的 Shell 命令。🎯
🆕 新增功能
🎮 Raw 命令支持(argc/argv 模式)
- ⭐
CLI_RAW_COMMAND— 同步 raw 命令宏,支持int handler(char **argv, int argc)形式的 handler - ⭐
CLI_RAW_COMMAND_ASYNC— 异步 raw 命令宏,支持 entry/task/exit 三阶段非阻塞执行 - ⭐ 参数候选补全 — Raw 命令的参数值可直接通过 Tab 补全,复用现有补全引擎
- ⭐
CLI_ENABLE_RAW_COMMAND— Kconfig 配置开关,默认关闭,按需启用
// 示例:注册一个 cp 命令
CLI_RAW_COMMAND(cp_cmd, "cp", "Copy files",
USAGE("cp <src> <dst>"),
cp_handler,
"file1.txt", "file2.txt", "file3.txt");🧪 Raw 命令测试 Demo
- 📝
tests/commands/test_raw_cmd.c— 同步 raw 命令测试(cp) - 📝
tests/commands/test_raw_cmd_async.c— 异步 raw 命令测试(mv)
🔧 重构与优化
🗑️ 删除弃用字段
- 🧹
cli_command_t移除validator字段 — 精简命令注册宏,零新增段/字段 - 🧹 所有注册宏同步简化 —
CLI_COMMAND、CLI_COMMAND_ASYNC、CLI_COMMAND_NO_STRUCT等宏签名更干净
🐛 修复与改进
🛠️ Kconfig 配置修复
- ✅ 补充
CLI_ENABLE_RAW_COMMANDKconfig 主开关(src/cli/Kconfig) - ✅ 修正 raw command demo 的依赖关系 —
depends on改为select,menuconfig 中显示为可勾选[ ] - ✅ 修复部分 Kconfig help 信息不合理的地方
📏 工具链适配
- ✅
measure_size.sh自动检测 specs 文件 — 支持nano.specs/picolibc.specs自动降级,跨工具链环境可用 - ✅ 修正
--no-*选项失效问题 — 配置文件路径指向示例工程的cli_kconfig.h,裁剪选项真正生效
📖 帮助文档完善
- ✅
print_cmd_brief增加brief描述输出 —-h帮助不再遗漏命令说明 - ✅ Raw 命令宏增加
_usage_arr参数 — 与CLI_COMMAND参数风格一致
⚙️ 配置简化
- ✅ 清理冗余 Kconfig 配置项,合并部分重复定义
- ✅ 更新全功能测试配置文件,对齐最新宏签名
📊 体积数据
在 STM32G431 示例工程上测试(-Os,全部可选功能关闭):
| 指标 | 数值 |
|---|---|
| ⚡ Flash 增量 | 11.37 KB |
| 💾 RAM 增量 | 3.65 KB |
全部功能开启时:Flash ~23 KB,RAM ~5.46 KB。
📦 升级指南
对于现有项目
- 无需新增任何源文件 — Raw 命令功能全部内嵌在现有框架中
- 如需使用 Raw 命令:
- 在
.config/ Kconfig 中启用CLI_ENABLE_RAW_COMMAND=y - 用
CLI_RAW_COMMAND(...)或CLI_RAW_COMMAND_ASYNC(...)注册命令
- 在
- 注意宏签名变化:
CLI_RAW_COMMAND现在需要传入USAGE(...)参数
对于 validator 字段的移除
- 🚨 破坏性变更:
cli_command_t的validator字段已被删除 - 若你的代码直接访问了该字段,编译会报错,请移除相关逻辑
🙏 贡献者
感谢所有提交、测试和反馈的朋友!🎉
完整提交历史:
git log v1.15.2..v1.16.0
LinCLI v1.15.0
🚀 LinCLI v1.15.0 发布说明
⭐ 引入第三方工作队列组件,协议全面 MIT 化
🎯 版本概览
| 项目 | 内容 |
|---|---|
| 版本号 | v1.15.0 |
| 发布日期 | 2026-05-09 |
| 协议 | MIT 🎉 |
| 合并分支 | dev ➜ main |
🆕 新功能
🔌 第三方工作队列组件(workqueue)
- 🚀 新增轻量级工作队列实现,专为 MCU / 裸机环境设计
- ⏱️ 支持立即执行(
schedule_work)和延迟调度(schedule_delayed_work) - 🔄 支持取消(
cancel_work_sync)和刷新(flush_workqueue) - ⛓️ 延迟链表按到期时间升序排列,到期自动转入执行队列
- 🛡️ 使用 LinCLI 临界区保护,中断安全
- 📦 通过 Kconfig 配置开关(
Third Party Components → Enable workqueue support)
🧪 wqtest 测试命令
- ✅ 内置
wqtest命令演示 workqueue 调度效果 - 📊 展示立即执行、300 ticks 延迟、600 ticks 延迟三种任务
🐛 Bug 修复
🔧 统一 CLI_COMMAND_WITH_BUF 宏的存储类
- ✅ 去除
static修饰符,与CLI_COMMAND行为一致 - 🛡️ 同名命令重复注册时链接器会抛出多重定义错误,编译期捕获命名冲突
📜 协议变更
- 🎉 项目许可证从 GPL v3 全面迁移至 MIT
- 🌟 所有 C/H 源文件头注释统一替换为 MIT 协议声明
- 🔓
list.h+workqueue组件清除 GPL-2.0 标识,统一为 MIT - 📄 文档措辞同步调整,明确为"模仿 Linux 内核机制实现"而非"移植"
📝 文档更新
- 📖 新增
docs/third_party.md:workqueue 完整使用指南 - 💡 补充适用场景与不适用场景说明,帮助用户建立正确的心智模型
- 🎯 涵盖 API 详解、使用注意事项、完整示例、配置宏说明
📦 变更日志
1eb7e2b fix: 统一 CLI_COMMAND_WITH_BUF 选项数组存储类为全局可见
3ad57a1 license: 将项目协议从 GPL v3 迁移至 MIT
e96d391 MIT协议(LICENSE 文件)
59dde40 license: 清除 list 与 workqueue 组件中的 GPL-2.0 标识,统一为 MIT
24906f0 docs: 修正 workqueue 文档措辞,避免内核移植误解
f1a6c30 docs: 补充 workqueue 适用场景与不适用场景说明
d214b87 chore: 升级版本号至 v1.15.0,准备发布
🙏 致谢
感谢每一位关注 LinCLI 的开发者。v1.15.0 标志着项目进入了一个新的阶段——更开放的协议、更丰富的组件、更清晰的文档。
让命令注册像定义变量一样简单。🎯
LinCLI —— 面向嵌入式/MCU 的 C 语言命令行交互框架
LinCLI v1.14.0
🚀 LinCLI v1.14.0 发布说明
✨ 从 GPL v3 迈向 MIT,更开放的嵌入式 CLI 框架
🎯 版本概览
| 项目 | 内容 |
|---|---|
| 版本号 | v1.14.0 |
| 发布日期 | 2026-05-08 |
| 协议变更 | GPL v3 ➜ MIT 🎉 |
| 合并分支 | dev ➜ main |
🆕 重磅更新
📜 协议全面更换为 MIT
- 🎉 项目许可证从 GPL v3 正式迁移至 MIT
- 🌟 所有 C/H 源文件头注释统一替换为 MIT 协议声明(共 51 个文件)
- 📄
docs/lincli_promo_article.md中的 License 标注同步更新 - 🔓 大幅提升商业友好度,闭源项目可自由集成而无需开源固件
💡 背景:早期版本因包含 Linux 内核红黑树代码而不得不使用 GPL v3。现该依赖已完全移除,项目代码均为原创,故更换为更开放的 MIT 协议。
🐛 Bug 修复
🔧 统一 CLI_COMMAND_WITH_BUF 宏的存储类
- ✅
CLI_COMMAND_WITH_BUF的选项数组_cli_options_##name去掉了static修饰符 - 🛡️ 现在与
CLI_COMMAND行为一致:同名命令在多个文件中重复注册时,链接器会抛出多重定义错误 - 🚫 在编译期捕获命名冲突,防止静默覆盖或产生未定义行为
📝 变更日志
1eb7e2b fix: 统一 CLI_COMMAND_WITH_BUF 选项数组存储类为全局可见
3ad57a1 license: 将项目协议从 GPL v3 迁移至 MIT
e96d391 MIT协议(LICENSE 文件)
41e8fb0 chore: 升级版本号至 v1.14.0,准备发布
🙏 致谢
感谢每一位关注 LinCLI 的开发者。MIT 协议的切换意味着我们更加信任社区的力量——自由使用,自由修改,自由分发。
让命令注册像定义变量一样简单。🎯
LinCLI —— 面向嵌入式/MCU 的 C 语言命令行交互框架
LinCLI v1.13.0
🚀 LinCLI v1.13.0 发布说明
📅 发布日期:2026-05-08
🎯 版本概览
从 v1.12.x 到 v1.13.0,本次发布是 LinCLI 项目的一次重大架构升级——全面引入 Kconfig 配置系统,彻底替代了旧版的手动宏开关和 CMake option 方式。所有功能裁剪、参数调整均收敛到 make menuconfig 交互式界面,源码零改动即可定制 CLI 行为。
🆕 重磅新功能
🎛️ Kconfig 配置系统(全面替换旧版配置方式)
- ✅ 引入 Linux 内核同款 Kconfig 配置框架,通过
make menuconfig交互式 TUI 管理所有编译期配置 - ✅ 新增
Kconfig配置树:src/cli/Kconfig、src/lib/Kconfig、tests/Kconfig - ✅ 新增
configs/lincli_defconfig默认配置快照,新用户首次make自动复制 - ✅ 新增
make menuconfig/make oldconfig/make savedefconfig/make defconfig全套配置管理命令 - ✅
.config→build/include/cli_kconfig.h自动生成,CMake 增量编译保护避免无意义重编
📦 差异配置支持
- ✅
make defconfig DEFCONFIG=xxx支持从任意差异配置或完整配置恢复 - ✅
make xxx_defconfig自动查找configs/目录下对应文件(与 Linux 内核用法一致) - ✅
make savedefconfig生成最小差异配置,方便备份和分享 - ✅
make sync-kconfig一键同步默认配置到所有示例工程
🧪 Demo 命令独立宏
- ✅ 将单一的
CLI_ENABLE_DEMO_COMMANDS拆分为 19 个独立配置项(每个test_*.c一个宏) - ✅ 所有 Demo 命令通过
make menuconfig→Tests & Demos按需开启
✨ 架构与构建改进
🔧 CMake 重构
- ✅ 恢复 v1.7.0 风格的统一极简 CMake 模板:
file(GLOB_RECURSE)+OBJECT库 - ✅
tests/commands/和tests/unit/各自使用独立 CMake 模板 - ✅ 根
CMakeLists.txt增加.config与cli_kconfig.h时间戳比对,彻底消除每次make全量重编 - ✅
tools/config_to_header.py增加生成内容比对,未变化时不写入磁盘
📁 预置 cli_kconfig.h 兼容方案
- ✅ 每个示例工程目录下各放一份
cli_kconfig.h(examples/stm32_g431/、stm32f103_keil/、pc_linux/、external_demo/) - ✅ Keil/GCC 裸编译工程可直接编译,无需 CMake
- ✅
include/cli_config.h恢复为#include "cli_kconfig.h",避免头文件遮挡问题
🐛 Bug 修复
🛡️ ESC 状态机卡死
- ✅ 修复单独按 ESC 后
cli_cmd_line_task返回-41(CLI_ERR_FIFO_EMPTY),后续字符持续触发错误的问题 - ✅ 错误返回前自动调用
state_switch()重置状态机,避免卡死
🔤 AC5 编译兼容
- ✅ 修复
cli_string.c中while ((*d++ = *src++))赋值在条件中的警告(Keil5 AC5) - ✅ 修复
cli_completion.c中枚举类型与int隐式转换的 AC5 报错 - ✅ 修复
USER_CMDS()空参数产生非法空复合字面量的问题(AC5 不支持) - ✅ 新增
USER_CMDS_NONE宏,Root 用户统一用它代替空的USER_CMDS()
📝 文档重写
- ✅ 新增
docs/kconfig_user_guide.md— Kconfig 配置完全指南(含原理、操作步骤、常见问题) - ✅ 重写
README.md中所有#define CLI_ENABLE_XXX引用为make menuconfig菜单路径 - ✅ 统一 所有专题文档(
setup.md、cli_user.md、cli_var.md、cli_env.md、candidates.md、tests.md、init.md、architecture.md、scope_bridge.md、porting.md)中的 Kconfig 引用 - ✅ 新增
docs/customization.md裁剪与体积优化章节(含配置项速查表和 Flash 体积参考) - ✅
docs/porting.md新增 MCU 工程 Kconfig 配置同步说明
🔧 其他改进
- ✅
Makefile的run目标不再隐式依赖build,未编译时给出明确提示 - ✅
.gitignore新增__pycache__、.pyc、output.csv等 - ✅
menuconfig主题切换为 Linux 风格的蓝底白亮配色
📊 体积参考
| ⚙️ 配置 | 💾 Flash |
|---|---|
| 全开(默认) | ~22.4 KB |
| 关高级补全 | ~17.7 KB |
| 关高级补全 + 环境变量 + 变量导出 | ~13.9 KB |
| 关上述三项 + 帮助 + 命令链 + 自动运行 | ~12.8 KB |
| 全部关闭(仅核心骨架) | ~11.5 KB |
🙏 致谢
感谢所有测试和反馈!如有问题请提交 Issue 或联系维护者。
LinCLI v1.12.0
🎉 LinCLI v1.12.0 发布说明
📅 发布日期:2026-05-07
🔖 Tag:v1.12.0
🌿 合并分支:dev→main
🚀 版本亮点
本版本的核心主题是 实时数据观测。LinCLI 不再只是一个命令行解析框架,它还提供了一套零配置上上位机的实时数据桥接协议——通过内置的 scope 命令和 lincli_csv_bridge.py 脚本,你的 MCU / PC 仿真程序可以秒变实时示波器数据源。
✨ 新增功能
🎯 scope 命令 —— 实时数据示波器示例
- ✅ 新增
tests/commands/test_scope.c—— 开箱即用的异步命令示例,输出正弦波与三角波 - ✅ 64 点整数查表生成正弦波 —— 替换
sinf(),彻底移除libm依赖,节省 Flash - ✅ 支持
Ctrl+D退出 —— 在 scope 运行期间按Ctrl+D即可优雅退出 - ✅ 严格按 scheduler 周期输出 —— 撤销
time.h依赖,恢复由调度器控制打印频率
🐍 lincli_csv_bridge.py —— 官方配套桥接终端
- 🆕 新增
tools/lincli_csv_bridge.py—— 支持串口模式与 PTY 子进程模式 - 🆕 实时 matplotlib 曲线绘制 —— 收到
$SCOPE_START后自动弹出绘图窗口 - 🆕 CSV 自动记录 —— 所有数据自动落盘,支持自动表头与文件清空重建
- 🆕 ANSI 转义序列过滤 —— 解析前清除颜色码,避免 CSV 被污染
- 🆕 Ctrl+C 优雅退出 —— 按一次即退出,打印
👋 Bye!告别信息,无 traceback
🔧 改进与优化
📈 绘图与数据格式
- 📊 X 轴改为
sample index—— 与 CSV 数据行号 1:1 对应,直观无换算 - 📊 删除
timestamp列 —— C 端、CSV、曲线统一为三列(theta, speed, iq),完全对应 - 📊 恢复
_raw纯数字列表格式 —— 避免键值对格式引入的time.time()不均匀抖动 - 📊 窗口生命周期修复 —— 用户关闭窗口后不再自动重建,再次运行
scope才新建 - 📊 每次运行
scope自动清空 CSV 并重置绘图窗口 —— 通过$SCOPE_START握手协议实现
📝 文档完善
- 📚 新增
docs/scope_bridge.md—— 完整专题文档,涵盖原理、快速开始、进阶提示 - 📚 强调实时绘图是通用协议 ——
scope只是示例,任何命令发送$SCOPE_START均可触发 - 📚
docs/porting.md新增 Linux 终端工具推荐 ——lincli_csv_bridge.py作为 LinCLI 官方配套桥接终端 - 📚 统一补充测试命令编译开关说明 —— README、tests.md、setup.md、architecture.md、init.md 等文档均已更新
⚙️ 构建与工程
- 🔧 移除多余的
libm链接 —— 因scope改用查表法,不再依赖数学库 - 🔧 修复外部模块 Makefile 编译异常 —— 提升兼容性
- 🔧
.gitignore忽略 Python 缓存与 CSV 输出 —— 保持仓库整洁
🐛 Bug 修复
| 问题 | 修复 |
|---|---|
| CSV 数据为空 | 解析前清除 ANSI 转义序列,确保数据正确提取 |
| matplotlib 多线程警告 | GUI 改在主线程运行,消除 TkAgg 并发警告 |
| 桥接脚本在非交互环境崩溃 | 修复 TTY raw mode 在无终端场景下的异常 |
[CSV] 日志干扰 ` |
|
| ` 单行刷新 | 移除桥接脚本的终端日志打印,避免破坏数据帧 |
| scope 打印过快 | 严格按 scheduler 周期输出,撤销 time.h 依赖 |
| 绘图窗口关闭后自动弹出 | 改为仅在收到 $SCOPE_START 时重建,用户关闭后保持关闭 |
📋 已知限制
⚠️ lincli_csv_bridge.py建议task调度周期 ≥ 10 ms(≤ 100 Hz)。更高频率可能导致 CSVflush()成为瓶颈⚠️ 实时绘图固定 50 Hz 刷新,数据全部入队但只保留最近 5000 点⚠️ LINCLI_BUILD_TEST_COMMANDS默认OFF,体验scope命令前需手动开启
🙏 感谢
感谢所有使用 LinCLI 的开发者!v1.12.0 让嵌入式调试从"盲调"变成了"看得见"的实时观测。如果你有任何问题或建议,欢迎提交 Issue 或 PR。
Happy coding! 🚀
LinCLI v1.11.0
🚀 LinCLI v1.11.0 发布说明
说明:本文档合并了 v1.10.0 与 v1.11.0 两个版本的全部变更。由于 v1.10.0 和 v1.11.0 属于同一批次的大规模重构工作(目录重组 + 构建系统改造 + 测试体系引入),变更内容紧密关联,因此统一汇总为一份完整的 v1.11.0 发布文档。
🏗️ 目录结构重组(v1.10.0 核心变更)
将杂乱的扁平目录改造为清晰的库布局,方便外部项目通过 add_subdirectory() 集成:
lib/ → src/lib/ (字符串、内存池、状态机等基础库)
cli/Src/ → src/cli/ (CLI 核心实现)
cli/Inc/ → include/ (公共头文件,对外 API)
init/ → src/init/ (初始化与调度器)
tests/*.c → tests/commands/ (集成测试命令)
→ tests/unit/ (新增 Unity 单元测试)
Documentation/ → docs/ (全部文档)
example_project/ → examples/ (PC / STM32 GCC / Keil 示例)
✅ 外部项目现在只需一行即可集成:
add_subdirectory(LinCLI)
target_link_libraries(my_app PRIVATE lincli)🔧 构建系统重构
⚠️ STATIC → OBJECT 库
LinCLI 依赖链接器收集自定义段(.my_init_d、.cli_commands、.scheduler 等)来实现零显式注册的命令/初始化机制。但 GNU ld 处理静态库时采用按需提取,会丢弃那些"符号未被引用"的对象文件——导致 cli_logo.c(版本号打印)等模块被静默省略。
解决方案:改用 CMake OBJECT 库 + INTERFACE 包装器:
lincli_obj:内部 OBJECT 库,对象文件直接传递给链接器lincli:INTERFACE 库,对外暴露$<TARGET_OBJECTS:lincli_obj>- 消费者仍用
target_link_libraries(my_app PRIVATE lincli),API 不变
📖 详细技术原理解析已写入 docs/architecture.md。
🎛️ CMake 选项集中管理(v1.10.0 + v1.11.0)
构建选项统一放到 CMakeLists.txt 最开头,方便手动修改:
option(LINCLI_BUILD_UNITY_TESTS "Build Unity unit tests" ON)
option(LINCLI_BUILD_TEST_COMMANDS "Build interactive test commands" OFF)
option(LINCLI_ENABLE_INLINE_TEST "Enable scheduler inline test mode" OFF)LINCLI_BUILD_UNITY_TESTS(v1.11.0 拆分):默认 ON,库集成默认附带单元测试LINCLI_BUILD_TEST_COMMANDS(v1.11.0 拆分):默认 OFF,演示命令不污染a.outLINCLI_ENABLE_INLINE_TEST:控制调度器每 50 循环打印 tick 计数(调试用)
v1.10.0 最初使用单一的
LINCLI_BUILD_TESTS,默认 OFF。但Makefile快捷命令中的ctest因此找不到测试。v1.11.0 将其拆分为两个独立开关,Unity 测试默认 ON,彻底解决了冲突。
🔗 CMake 与 C 宏自动同步
CLI_ENABLE_TESTS 和 INLINE_TEST_EN 两个 C 宏由 CMake 自动注入:
tests_commands目标自动获得CLI_ENABLE_TESTS=1lincli_obj在LINCLI_ENABLE_INLINE_TEST=ON时获得INLINE_TEST_EN=1cli_config.h中用#ifndef包裹,允许 CMake 值优先- 非 CMake 环境(Keil、裸机 Makefile)仍可手动定义
🧪 Unity 单元测试框架
引入 Unity 测试框架,新增 tests/unit/ 目录,覆盖基础库核心函数:
| 模块 | 测试文件 | 测试数量 |
|---|---|---|
| cli_string | test_unit_string.c | 7 |
| cli_atoi | test_unit_atoi.c | 5 |
| cli_float | test_unit_float.c | 7 |
| cli_mpool | test_unit_mpool.c | 9 |
| tVector | test_unit_vector.c | 4 |
| cli_vsnprintf | test_unit_vsnprintf.c | 8 |
| stateM | test_unit_statem.c | 4 |
| cli_errno | test_unit_errno.c | 3 |
🎯 总计 47 个单元测试,make 编译后自动运行 ctest。
🐛 Bug 修复
| 问题 | 修复 |
|---|---|
| 🔄 ESC 死循环 | esc_read_params() 不再在 FIFO 空时死循环 |
| 📦 FIFO short-read | _cli_io_pop() 返回实际读取字节数 |
| 📝 printk 缓冲区溢出 | 三阶段输出替代危险 memmove |
| 🔁 cmd_parse_prepare 重入 | static 变量改为 ctx 参数传递 |
| 🔇 _echo 无输出 | 添加 pre_len > 0 / suffix_len > 0 守卫 |
| 💥 cli_strlen 编译器优化 | 解决 G431 测试用例复位死循环 |
| 📐 _CLI_SIZEOF_POINTEE | 消除空指针上的未定义行为 |
| 🔧 Makefile ctest 冲突 | 拆分测试选项后,make 无需硬编码选项 |
| 📁 measure_size.sh 路径 | 同步目录重组后的全部新路径 |
📚 文档更新
- 🆕
docs/architecture.md新增"为什么必须使用 OBJECT 库"完整技术解析 - 🆕
docs/unity_testing.mdUnity 测试框架使用指南 - 🔄 全量路径更新:
cli/Src/→src/cli/、Documentation/→docs/等 - 🔄
README.md所有文档链接同步到新路径 - 🔄 Skill 文件
.agents/skills/lincli-dev/SKILL.md同步 CMake 管理的新模式
⚡ 其他优化
- 🎨 优化启动体验
- ⏱️ G431 测试用例任务周期调整为 10ms
- 📏 README 补充最小化体积测量一键命令
- 🔨
make编译后自动运行ctest --output-on-failure
📦 版本信息
- 版本号:v1.11.0
- 上一个版本:v1.9.4
- 提交数:22+
- 变更文件:280+ 个(含目录移动)
💡 注:v1.10.0 为中间发布版本,其全部变更已合并到本文档中。v1.11.0 在 v1.10.0 基础上进一步拆分了 CMake 测试选项并修复了相关工具脚本。