MX251 0.0170(测试):编译器与优化数学库已合并,欢迎体验
最近把 MX251 的通用编译优化和整数/浮点数学库合并成了一个可独立使用的版本,公开源码,并提供 Windows x64 的 CMake + Ninja 工具链。本帖介绍技术来源、近期实测数据和两种使用方式,方便大家判断是否适合自己的工程。
一、技术来源与适用范围
MX251 基于 SDCC 4.6.0 及现有 sdcc-c251 移植继续开发,前端、公共中间表示和大量优化继承自 SDCC,汇编/链接工具沿用 SDAS、SDLD 与 ASxxxx 体系。导入的 sdcc-c251 源码来自 gevico/sdcc-c251 的 b09075b6a93e6afe10645181e3aeff041ea37f87,相关上游历史和许可证均在仓库保留;高层数学算法也保留 SDCC 来源。
MX251 新增和扩展的部分主要是:MCS-251 原生宽整数代码生成、寄存器重叠及调用保存处理、普通与宽后端共用的最终控制流清理、函数引用闭包裁剪、原生整数/浮点内核及 ABI 桥接,以及可独立运行的 CMake/Ninja 构建与内容凭据。数学库归档本次合入 66 个成员,按实际引用参与链接,并非每个工程都强制带入整库。
当前提供的目标配置为 AI8051U-34K64(32 位模式)和 STC32G12K128。这里的“32 位”是这两个 MCS-251 目标的配置,不是 ARM 工具链,也不表示覆盖所有 STC/8051 型号。新增器件还需要核对启动、内存、地址空间、中断与 ABI。
优化依据 IR、ABI、地址空间、调用闭包及目标能力选择,不按例程编号、芯片名或函数名写答案。目的在于让满足同样条件的新工程也能获益。未知条件保留回退;部分原生数学功能需要显式选择对应 ABI。
二、近期优化:先看完整工程的真实字节
共享 CFG 清理和相同尾部合并这一阶段,17 个完整非数学工程相对各自此前冻结候选合计减少 3,678 B,覆盖 SPI、显示、USB、LIN、I²S 等。图中列出全部 17 行,包括改善后仍未达到体积目标的项目:
例如 USB 声卡 5,147 → 4,692 B,I²S 录放音 5,685 → 5,274 B,USB HID 3,812 → 3,506 B。LIN 从机与 USB 声卡新增进入同模型 Keil 120% 体积线。
这组证据包含历史 v2/v3 候选组合,基线是各工程上一份冻结结果,不是原版 SDCC,也不是宣称所有工程均已用 0.0170 重测。历史候选汇总中,75 个同模型可比工程有 38 个在 Keil 120% 体积线内,其中 18 个在 110% 内;另有 37 个仍超过 120%。这些是逐工程最好候选的组合统计,完整工程运行时间仍待测,不能算全部工程通过。
三、数学库的实板记录与当前差距
以下是 2026-11-02 数学库专项镜像的历史实测:STC32G12K128,11.0592 MHz,计时器 12 clocks/tick,每个输入执行 8 次取中位数,再汇总各输入中位数。合计 tick 不是连续运行整个应用的墙钟时间。
相对前一数学库候选 atan-flow,float-int 候选的结果:
- Math18:9,195 → 9,163 B;10,246 → 10,064 tick,计时合计减少约 1.78%,18/18 固定输入正确性通过。
- Math123:12,006 → 11,974 B;119,709 → 115,663 tick,计时合计减少约 3.38%,123/123 固定输入正确性通过。
Math18 的同条件 Keil 为 4,464 B、8,003 tick,因此这一数学专项候选仍有明显差距;Math123 缺合格的 Keil 分母,未给出相对 Keil 的结论。合计改善也不代表每个输入都加速,附件保留了逐输入计时与变慢项。上述专项实测不能直接作为当前合并镜像的实板结果。
四、0.0170 合并版实际验证了什么
已通过指定工程的正常 CMake + Ninja 编译、链接和最终机器字节/重定位核对:
- STC32G Math123:11,971 B,优化数学库已链接。
- AI8051U 跨文件数学转换工程:970 B,优化数学库已链接。
- AI8051U 完整 LIN 工程:2,001 B,镜像与合并前一致。
还检查了独立发布包在含空格的新路径下,通过 Build.cmd 正常构建。合并版这些镜像尚未重新进行实板计时与运行正确性验收,所以版本仍标 0.0170(测试),没有宣称全面达到 Keil 或完成全部 SDK 验收。
测试过程采用“固定源码/选项/工具指纹 → 完整工程构建 → 最终 CODE 机器字节计数 → 引用闭包、ABI、重定位检查 → 有对应硬件证据的专项再计时”的流程。不是统计 HEX 文本文件大小,也不把静态成本估算当成实测周期。通用机制另有改名、数据变化和不同目标配置的离线检查;未变部分复用已有证据。
本帖证据附件包含 JSON、CSV、两张原图、来源文件 SHA-256、镜像与构建收据哈希,以及计量说明。哈希用于核对对应记录,不等于独立第三方认证。
五、不使用 MCU StudioX:独立命令行构建
源码:https://github.com/XieJunHui9566/MX251
体验版下载:v0.0170-test Release
下载 MX251-0.0170-test-windows-x64.zip,完整解压,在根目录打开命令提示符:
- Build.cmd -ProjectPath ".\examples\math-casts-ai"
- Build.cmd -ProjectPath ".\examples\math-casts-stc"
复制代码
包内带有 CMake 4.4.0、Ninja 1.10.2 和 PowerShell 7.6.5,不依赖 StudioX 服务,不需要修改系统 PATH。示例把计算结果写入内存,不假定板上 LED 或屏幕接线。
产物位于对应工程的 .build\mx251\latest,包括 firmware.hex、firmware.bin、映射与 receipt.json。新项目可复制相近示例:在 CMakeLists.txt 管理源文件、头文件目录与宏,在 mx251.json 选择目标、内存模型、后端和运行库。MX251 使用项目模块及 mx251_firmware() 接口,具体直接 CMake 命令见构建文档。
当前原生数学库限定 small + stack-auto,并要求匹配的普通/显式宽 ABI;不要混用不兼容对象或套用 medium/large。默认工程和原生数学示例的配置应分别遵循各自模板。
完整构建说明 验证范围与已知限制 技术架构与继承关系
六、使用 MCU StudioX:组件与模板
本帖附带 StudioX 组件压缩包,内含:
- studiox.mx251-0.0.170-win-x64.mcutoolchain
- stc.ai8051u-mx251-0.2.171.mcupack
- stc.stc32g-mx251-0.2.171.mcupack
复制代码
其中组件编号 0.0.170 对应编译器 0.0170;器件包编号为 0.2.171。
使用步骤:
- 使用支持 MX251 SDK 构建契约的 MCU StudioX,并准备 studiox.cmake 4.4.0 组件。
- 在“开发环境组件”管理中选择“导入开发环境组件…”,导入 .mcutoolchain。
- 通过“导入器件包…”导入两个 .mcupack。
- 新建工程,在“器件与模板”选择 AI8051U-32bit/AI8051U-34K64,可选寄存器或库函数模板;STC32G/STC32G12K128 提供寄存器模板。
- 选择组件版本后编译。仍由同一套 CMake + Ninja + MX251 构建,IDE 负责工程与工具管理。
三个模板的离线构建分别为 215 B、478 B、471 B。默认 standard 运行库、ordinary-wide 后端、普通 C ABI。已有工程不会自动改写为新模板。器件包 0.2.171 修正编辑器把宿主 int 宽度误当成目标 ABI 的诊断,真实 MX251 编译仍保留宽度断言。
兼容说明:这里的附件是编译器组件和器件包,不含 IDE 本体或宿主兼容更新;旧版 StudioX 不保证仅导入包即可使用。宿主未具备相应 SDK 支持时,可先用上面的独立工具链体验。模板编译通过不等于实板运行通过,下载请按自己的准确型号、时钟和接口选择合适工具;本帖不把新接入的下载协议当作所有用户硬件已验收。
欢迎用自己的完整工程试用并在 GitHub 提交问题,附准确型号、内存模型、编译选项、原始诊断及尽量小的复现工程。后续继续优先推进跨 SDK、跨器件的共通优化,保留差距和未测项,逐步提高工程可用性。
附件:性能证据与 StudioX 体验组件
MX251-0.0170-evidence.zip
(447.47 KB, 下载次数: 9)
MX251-0.0170-StudioX-components.zip
(84.19 MB, 下载次数: 9)
|