找回密码
 立即注册
查看: 110|回复: 4

开源:Zig 编译器 MCS-51/251 后端

[复制链接]
已绑定手机

1

主题

8

回帖

113

积分

注册会员

积分
113
发表于 6 天前 | 显示全部楼层 |阅读模式

开源:Zig 编译器 MCS-51/251 后端

用 AI 把 Zig 编译器移植到 8051 / 80251(MCS-51 / MCS-251):自托管后端已在真机跑通,已开源求共建

一句话:现在可以用 Zig 写程序、直接编译成 8051/80251 的汇编(ASxxxx),
再和 SDCC 编译的 C 一起用 sdas/sdld 链接成同一个固件;GPIO / UART / 定时器中断二进制日志 / USB-CDC 等已在 AI8051U-34K64 真机验证。代码全部开源,想借助各位大佬把剩下的坑补完。
项目地址:github


一、背景与目的

  • 目标芯片:STC 系列(Intel 8051 / 80251,即 MCS-51 / MCS-251)。
  • 动机:
    1. Zig(现代语言、内存安全、编译期计算)也能用在 8051/251 上;
    2. 顺便验证 AI 能否胜任“编译器后端移植”这种繁重工作——从语言前端到指令选择、寄存器/栈帧、ABI、中断、链接,全部由 AI 辅助完成并由人在真机上逐项排错。
  • 分工(如实说明):本项目绝大多数代码由 AI 助手(DeepSeek 4.1 Flash)编写
    (后端移植、构建/链接脚本、示例、文档、排错),笔者主要负责提供移植思路与方向决策、真机验证与硬件支持
  • 结果:Zig 的自托管(self-hosted)后端已经能产出可用的 8051/251 汇编,
    与 SDCC 的 C 工具链共用同一套 ASxxxx 汇编/链接流程。

为什么选 Zig(选型思考)

嵌入式可用的语言其实不少(汇编 / C / C++,早期的 Java / Python / Go,新兴的 Rust / Zig / C3 等),
每种都有其擅长之处与活跃的社区;这里只是结合本项目的情况谈一点个人取舍,无意比较优劣。

就本项目而言,我觉得比较合适的是 C / Rust / Zig,最终选了 Zig

  • 最吸引我的是 编译期计算(comptime):希望「编译期运行 + 宏系统 + 内存安全」
    能同时成立——对 HAL 层保持人类友好,又保留寄存器级编程的高效,并有机会把内存安全
    带进嵌入式这种对稳定性要求极高的环境;
  • 论内存安全,Rust 的成熟度其实更高,也非常值得学习;没有移植 Rust,主要还是没有预算——
    Rust 的功能与生态都很庞大、代码量也大得多,以有限的资源去做移植,成本会高不少,权衡之后选了更轻量的 Zig;
  • 另一个动机,是想验证新兴语言能否让老牌平台(8051/251)也享受到内存安全的红利

需要说明的是,Zig 仍在快速迭代:0.17 相对本项目所基于的 0.16.1 已有语法变化
(0.16 编不过 0.17 的移植版本),因此若项目持续发展,可能与 Zig 主线出现一定脱节,直到 1.0。
对嵌入式而言,语言频繁调整语法是双刃剑——这大概也是新的 C/C++ 标准在嵌入式里不那么流行、
以及暂未选择更年轻的 C3(目前在 0.8,社区仍在成长)的原因之一。

以上仅为个人看法,欢迎指正与交流。

二、上游项目与许可

上游 地址 许可 本项目改动
Zig https://codeberg.org/ziglang/zig MIT 新增 MCS 自托管后端
SDCC https://sourceforge.net/projects/sdcc/ GPLv2 为主的混合协议 使用其 mcs251 端口
sdcc-c251 https://github.com/gevico/sdcc-c251 同上 未修改任何 SDCC 源码
STC 官方示例/资料 STC 官网 STC 版权 仅作寄存器/外设参考

许可说明:Zig 后端沿用上游 MIT;SDCC 系 GPL-2.0;本项目的集成仓/示例/文档以
Apache-2.0 发布,三方各自独立、互不混合。

三、现在能做什么(现状)

1. 三段式管线

Zig 源 --(Zig 自托管后端)--> .asm --(sdas251/sdas8051)--> .rel
C 源 --(sdcc -mmcs251)--> .rel
--(sdld + 运行库 + crt0/中断向量)--> .ihx

2. Zig 后端能力(自托管,非 LLVM)

  • 目标:mcs51 / mcs251,输出 ASxxxx 汇编文本;
  • 变量按空间分配:data / idata / xdatalinksection 指定);
  • 运行期下标、运行期指针、切片、结构体字段访问;
  • 中断:ISR 采用“无栈帧 + 内联汇编 + reti”约定,向量表可自定义;
  • SFR 直接寻址、内联汇编、@ptrFromInt 固定地址访问;
  • C ↔ Zig ABI 互操作:与 SDCC --stack-auto 对接,支持 3 字节指针、大端标量、多参数;
  • AI8051U 复位于 FF:0000--code-loc 0xff0000)。

3. 真机验证(AI8051U-34K64)

  • P1.1 闪灯、UART1 打印 / 接收中断回环;
  • 定时器 T0 1ms 中断(每秒打印一行);
  • COBS 二进制日志(真机 821 帧解码通过);
  • USB-CDC(hello world 每秒一行);
  • 硬件 MDU 乘除、CORDIC 定点,与 C 参考实现对拍;
  • data/idata/xdata 各空间读写自检。

4. 8 位 mcs51

  • 8 位目标可在软件仿真(ucsim)里跑通自检工程 at89c52_sim(无板验证)。

5. 设备描述表

  • 收录 176 款 STC/AI 型号的存储/SFR/中断矩阵(TOML),
  • 编译器按所选芯片自动决定变量放置,链接脚本也从设备表生成。

6. 体积优化

  • 后端本身支持 -Dmcs-only、条件融合等;
  • 构建层提供汇编瘦身/死代码回收工具(实测 CSEG 降 12%~40%)。

7. 便携工具链(零环境变量)

  • 自带 zig + sdcc + 构建工具,不需要 Python、不需要配环境变量
  • 含 4 个示例(C 的 USB-CDC、纯 Zig 的日志 / 定时器打印 / UART 回环),build.cmd all 一键构建。

四、仓库地址

  • 集成仓(工具链 / 示例 / 设备表 / 文档):https://github.com/manniuP/mcs8051
  • Zig 后端(分支 mcs251-backend:https://github.com/manniuP/zig-mcs51-backend
  • SDCC(MCS-251):https://github.com/manniuP/sdcc-c251
    (本仓仅作“以后要让 SDCC 支持新特性”的克隆基底,当前未改 SDCC 源码
  • STC 官方示例整理后另传 GitHub/Gitee。

五、快速上手(PowerShell)

# 1) 取集成仓(含两个编译器子模块)
git clone --recurse-submodules https://github.com/manniuP/mcs8051.git
cd mcs8051

# 2) 用系统 zig(0.16.0) 构建 MCS 后端
cd compiler
zig build -Doptimize=ReleaseFast -Dno-lib -Dmcs-only --zig-lib-dir lib
# 产物:compiler\zig-out\bin\zig.exe

# 3) 编 Zig 示例(C 目标走 SDCC)
cd ..
xmake f --mcs_arch=mcs251
xmake build ziglog

也可以直接下载仓库 CI 生成的便携包(Actions 产物 / Release 附件):解压后运行 build.cmd all,无需任何环境变量。

六、想请各位大佬一起做的事

  1. 真机覆盖:更多型号/外设的实测(STC8 / STC32 / AI8 系列等),帮助项目发现边界问题;
  2. 调试支持(目前基本没有)
    • Windows 版 SDCC 包默认禁用了 ucsim/sdcdb,且 MCS-251 在 ucsim 里没有模型
    • Zig 后端目前不输出调试信息(DWARF/CDB);
    • 真机(AI8051U)无 JTAG/SWD,只能靠串口打印/日志。
      希望一起做:Zig 后端生成调试信息、补 251 仿真模型,或做基于 UART 的简易调试/单步通道。
  3. 后端功能补缺const → code 放置、更多语言特性、代码尺寸/速度优化;
  4. C 运行库:STC 的 USB / MDU / DSP 只提供 Keil/IAR 二进制库,
    在 SDCC/Zig 下需要替代实现或移植;
  5. 8 位(mcs51)完善与仿真回归;
  6. 文档、示例、CI、翻译;
  7. 欢迎提 Issue / PR,或在帖子里反馈你遇到的问题与建议。

七、已知限制

  • C 只能走 SDCCzig cc 目前无法为 MCS 生成目标码),C++ 暂不支持
  • 无源码级调试:没有可用的调试器/单步(见「六、2」);
  • 251 核无法用 ucsim 仿真,必须真机验证;
  • 后端仍有未实现的 Zig 语言特性(细节见仓库 docs/)。

八、致谢

感谢上游 ziglang/zig、SDCC
与 gevico/sdcc-c251 的工作,以及 STC 官方公开的寄存器/外设资料。


本项目绝大多数代码由 AI 助手 DeepSeek 4.1 Flash 编写;笔者提供移植思路、方向决策与真机验证。欢迎大佬们在帖子下交流和批评指正。

2 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

113

积分

注册会员

积分
113
 楼主| 发表于 6 天前 | 显示全部楼层
感谢大佬们开发的sdcc-c251,
【全网首发】SDCC 支持 MCS-251
https://www.stcaimcu.com/thread-25076-1-1.html
(出处: 国芯人工智能技术交流网站)
回复

使用道具 举报 送花

已绑定手机

19

主题

3551

回帖

8057

积分

论坛元老

积分
8057
发表于 6 天前 | 显示全部楼层
又一个新的编译工具?
回复

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

113

积分

注册会员

积分
113
 楼主| 发表于 6 天前 | 显示全部楼层
so*** 发表于 2026-9-17 20:27
又一个新的编译工具?

对的,应该是第一个非C的编译器
回复

使用道具 举报 送花

已绑定手机

1

主题

8

回帖

113

积分

注册会员

积分
113
 楼主| 发表于 5 天前 | 显示全部楼层
构建的最小运行环境,刚重装的Windows也能跑

ai8051u.zip

80.24 MB, 下载次数: 3

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-23 15:04 , Processed in 0.071807 second(s), 63 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表