Skip to content

Releases: BunnyDeny/LinCLI

LinCLI v1.20.0

Choose a tag to compare

@BunnyDeny BunnyDeny released this 04 Jun 08:20

🎉 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\ncli_printk 内容不以 \n 结尾时自动补全
  • 🔧 log_output_set_ring 段错误 — 修复拷贝未初始化 kfifo 导致的崩溃
  • 🔧 kfifo 内存屏障 — 对齐 Linux 内核实现,确保 SPSC 安全
  • 🔧 batch_begin 进批量模式时清一次行 — 避免行首残留

🛠️ 重构与改进

  • ♻️ 日志系统全面重写 — 移除旧式 sys_printkcli_vsnprintf 模块
  • ♻️ kfifo 硬依赖 — 移除 LOG_OUTPUT_HAVE_KFIFO 条件编译开关
  • ♻️ log_term_opslog_output_hooks — 钩子结构体通用化重命名
  • ♻️ 移除 in_atomic 钩子 — 语义重复,用户可在钩子内部自行判断
  • ♻️ 移除 log_output_set_ring 无用 ring 参数 — API 精简
  • ♻️ 移除 in 队列临界区 — 改用 kfifo 无锁 SPSC 模式
  • 📏 基线工程 Flash 测量 — 增加 snprintf dummy 调用以正确反映真实 Flash 占用

📝 文档

  • 📚 新增 log_output.h API 文档 — 每个函数包含动机说明、参数表、返回值、示例
  • 📚 新增移植指南 — 如何在 MCU 项目中集成 log_output
  • 📚 新增 LinCLI 集成章节 — 说明 cli_term.c 的适配原理
  • 📚 清理第三方文档 — 删除 cli_vsnprintfcli_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

Choose a tag to compare

@BunnyDeny BunnyDeny released this 23 May 10:40

🎉 LinCLI v1.19.0 发布说明

📅 发布日期:2026-05-23
🏷️ 版本号:v1.19.0
🌿 合并分支:devmain


🎯 版本概览

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

Choose a tag to compare

@BunnyDeny BunnyDeny released this 15 May 03:30

🎉 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 大幅精简

  • ✅ 移除 list INTERFACE 库的冗余定义
  • ✅ 将 workqueue / hexdump 第三方组件并入 src 统一管理
  • ✅ 删除 3 个冗余的 CMakeLists.txt
  • ✅ 提取公共构建逻辑到 cmake/lincli_build.cmake
  • src/CMakeLists.txttests/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

Choose a tag to compare

@BunnyDeny BunnyDeny released this 14 May 03:35

🎯 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

Choose a tag to compare

@BunnyDeny BunnyDeny released this 11 May 06:46

🚀 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_COMMANDCLI_COMMAND_ASYNCCLI_COMMAND_NO_STRUCT 等宏签名更干净

🐛 修复与改进

🛠️ Kconfig 配置修复

  • ✅ 补充 CLI_ENABLE_RAW_COMMAND Kconfig 主开关(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。


📦 升级指南

对于现有项目

  1. 无需新增任何源文件 — Raw 命令功能全部内嵌在现有框架中
  2. 如需使用 Raw 命令
    • .config / Kconfig 中启用 CLI_ENABLE_RAW_COMMAND=y
    • CLI_RAW_COMMAND(...)CLI_RAW_COMMAND_ASYNC(...) 注册命令
  3. 注意宏签名变化CLI_RAW_COMMAND 现在需要传入 USAGE(...) 参数

对于 validator 字段的移除

  • 🚨 破坏性变更cli_command_tvalidator 字段已被删除
  • 若你的代码直接访问了该字段,编译会报错,请移除相关逻辑

🙏 贡献者

感谢所有提交、测试和反馈的朋友!🎉


完整提交历史: git log v1.15.2..v1.16.0

LinCLI v1.15.0

Choose a tag to compare

@BunnyDeny BunnyDeny released this 11 May 02:23

🚀 LinCLI v1.15.0 发布说明

⭐ 引入第三方工作队列组件,协议全面 MIT 化


🎯 版本概览

项目 内容
版本号 v1.15.0
发布日期 2026-05-09
协议 MIT 🎉
合并分支 devmain

🆕 新功能

🔌 第三方工作队列组件(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

Choose a tag to compare

@BunnyDeny BunnyDeny released this 09 May 02:24

🚀 LinCLI v1.14.0 发布说明

✨ 从 GPL v3 迈向 MIT,更开放的嵌入式 CLI 框架


🎯 版本概览

项目 内容
版本号 v1.14.0
发布日期 2026-05-08
协议变更 GPL v3 ➜ MIT 🎉
合并分支 devmain

🆕 重磅更新

📜 协议全面更换为 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

Choose a tag to compare

@BunnyDeny BunnyDeny released this 08 May 09:19

🚀 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/Kconfigsrc/lib/Kconfigtests/Kconfig
  • ✅ 新增 configs/lincli_defconfig 默认配置快照,新用户首次 make 自动复制
  • ✅ 新增 make menuconfig / make oldconfig / make savedefconfig / make defconfig 全套配置管理命令
  • .configbuild/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 menuconfigTests & Demos 按需开启

✨ 架构与构建改进

🔧 CMake 重构

  • ✅ 恢复 v1.7.0 风格的统一极简 CMake 模板:file(GLOB_RECURSE) + OBJECT
  • tests/commands/tests/unit/ 各自使用独立 CMake 模板
  • ✅ 根 CMakeLists.txt 增加 .configcli_kconfig.h 时间戳比对,彻底消除每次 make 全量重编
  • tools/config_to_header.py 增加生成内容比对,未变化时不写入磁盘

📁 预置 cli_kconfig.h 兼容方案

  • ✅ 每个示例工程目录下各放一份 cli_kconfig.hexamples/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 返回 -41CLI_ERR_FIFO_EMPTY),后续字符持续触发错误的问题
  • ✅ 错误返回前自动调用 state_switch() 重置状态机,避免卡死

🔤 AC5 编译兼容

  • ✅ 修复 cli_string.cwhile ((*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.mdcli_user.mdcli_var.mdcli_env.mdcandidates.mdtests.mdinit.mdarchitecture.mdscope_bridge.mdporting.md)中的 Kconfig 引用
  • 新增 docs/customization.md 裁剪与体积优化章节(含配置项速查表和 Flash 体积参考)
  • docs/porting.md 新增 MCU 工程 Kconfig 配置同步说明

🔧 其他改进

  • Makefilerun 目标不再隐式依赖 build,未编译时给出明确提示
  • .gitignore 新增 __pycache__.pycoutput.csv
  • menuconfig 主题切换为 Linux 风格的蓝底白亮配色

📊 体积参考

⚙️ 配置 💾 Flash
全开(默认) ~22.4 KB
关高级补全 ~17.7 KB
关高级补全 + 环境变量 + 变量导出 ~13.9 KB
关上述三项 + 帮助 + 命令链 + 自动运行 ~12.8 KB
全部关闭(仅核心骨架) ~11.5 KB

🙏 致谢

感谢所有测试和反馈!如有问题请提交 Issue 或联系维护者。

LinCLI v1.12.0

Choose a tag to compare

@BunnyDeny BunnyDeny released this 07 May 06:40

🎉 LinCLI v1.12.0 发布说明

📅 发布日期:2026-05-07
🔖 Tag:v1.12.0
🌿 合并分支:devmain


🚀 版本亮点

本版本的核心主题是 实时数据观测。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)。更高频率可能导致 CSV flush() 成为瓶颈
  • ⚠️ 实时绘图固定 50 Hz 刷新,数据全部入队但只保留最近 5000 点
  • ⚠️ LINCLI_BUILD_TEST_COMMANDS 默认 OFF,体验 scope 命令前需手动开启

🙏 感谢

感谢所有使用 LinCLI 的开发者!v1.12.0 让嵌入式调试从"盲调"变成了"看得见"的实时观测。如果你有任何问题或建议,欢迎提交 Issue 或 PR。


Happy coding! 🚀

LinCLI v1.11.0

Choose a tag to compare

@BunnyDeny BunnyDeny released this 06 May 08:13

🚀 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.out
  • LINCLI_ENABLE_INLINE_TEST:控制调度器每 50 循环打印 tick 计数(调试用)

v1.10.0 最初使用单一的 LINCLI_BUILD_TESTS,默认 OFF。但 Makefile 快捷命令中的 ctest 因此找不到测试。v1.11.0 将其拆分为两个独立开关,Unity 测试默认 ON,彻底解决了冲突。

🔗 CMake 与 C 宏自动同步

CLI_ENABLE_TESTSINLINE_TEST_EN 两个 C 宏由 CMake 自动注入:

  • tests_commands 目标自动获得 CLI_ENABLE_TESTS=1
  • lincli_objLINCLI_ENABLE_INLINE_TEST=ON 时获得 INLINE_TEST_EN=1
  • cli_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.md Unity 测试框架使用指南
  • 🔄 全量路径更新: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 测试选项并修复了相关工具脚本。