找回密码
 立即注册
查看: 569|回复: 16

【全网首发】SDCC 支持 MCS-251

[复制链接]
已绑定手机

2

主题

8

回帖

98

积分

注册会员

积分
98
发表于 2026-8-1 15:13:29 | 显示全部楼层 |阅读模式

SDCC 原生只支持 MCS-51,目前上游没有对 251 进行支持。我们在下游维护了一个分支,支持了 MCS-251 架构。这意味着我们可以使用 SDCC 原生编译支持 STC32G 的程序了,不需要依赖 Keil C251。SDCC 对 MCS-251 的支持也是在兼容 MCS-51 的基础上进行扩展的,遵循 SDCC 原生的编译和关键词命名,并在此基础上实现了对 MCS-251 的 ABI 设计支持与运行库 libc 的支持。

代码仓库:https://github.com/zevorn/sdcc-c251

PS:我们扩充了 SDCC 原生的调试器,为它支持了 QEMU 的 GDB stub 远程调试。这也就意味着,你可以像传统的 GDB 一样,来调试 MCS-251 和 MCS-51 架构的程序,获得更现代化的调试体验。当前 QEMU 上,我们为它支持了对 MCS-51 和 MCS-251 的架构仿真支持,主要用于测试 SDCC-C251 的这个编译器



ChangeLog:


SDCC MCS-251 (C251) 移植版更新日志

────────────────────────────────────


版本: v4.6.0-mcs251-20260804(基于上游 SDCC 4.6.0)
下载: https://github.com/zevorn/sdcc-c251/releases/tag/v4.6.0-mcs251-20260804

一、目标支持

- 全新的 MCS-251 目标后端(Intel/STC 8 位增强型 MCU,24 位寻址空间)
- 支持 STC32G144K246 芯片,提供 QEMU 模拟器支持(stc32g144k246 机型)
- 完整 MCS-251 指令集:字节扩展指令、MOVH、原生字/双字算术
- MCS-251 汇编器(sdas251)、链接器、ELF32 输出

二、代码生成

- 独立的后端架构:gen.c 拆分为 gen.c + gen_lower.c.inc(发射原语、ASMOP、取值)
- R0-R15 固定寄存器分配:字节/字/双字寄存器元组
- MCS-251 专用寄存器追踪与窥孔优化
- 原生 MUL 乘法指令、双字加法/减法
- DPTR 值跟踪缓存:消除冗余的 24 位地址重载(mov dptr,#X; mov dpxl,#Y)
- WR 寄存器合并:字节对栈操作数合并为单条 mov wr6,@spx-N(10 字节 → 4 字节)
- 窥孔规则从 480 行扩展到 714 行(+18 条规则):WR 合并、DPTR 重载消除、push/pop 相邻消除、存储后重载消除

三、ABI 与数据模型

- 原生大端 MCS-251 ABI,32 位 size_t
- 大端寄存器元组与自动栈帧
- setjmp/longjmp 非本地跳转状态按原生字节序存储
- 为 MCS 目标定义 GNU 兼容预处理器数据模型宏(__UINT32_TYPE__ 等)

四、GNU C 扩展(C11/C17)

- C11/C17 语言模式及 GNU 方言
- 语句表达式、case 范围、__extension__
- __attribute__、__typeof__、__auto_type
- 内建函数:__builtin_expect、__builtin_constant_p
- 位运算:__builtin_popcount/clz/ctz/ffs/parity
- 字节交换:__builtin_bswap16/32/64
- 溢出检查:__builtin_add/sub/mul_overflow(通用与类型化)
- 空聚合体、替代关键字拼写
- 复合字面量、兼容的不完整数组声明、重复块作用域 extern

五、本次更新修复的问题

1. 零宽位域误报修复:支持宽位域(16/32/64 位)时,unsigned 比较把 BITVAR_PAD(-1) 转成 0xFFFFFFFF,导致 : 0 填充位域被误报 "bit-field size too wide"——已改为有符号比较
2. auto 类型推断修复:auto p = &k; 在 medium/large/huge 模型下指针空间推断错误(typeofOp 在 allocLocal 前装饰表达式)——已镜像 allocLocal 的存储类选择
3. CI 全套修复:测试脚本非 UTF-8 输出容错、GNU 预处理器 -I 缺失修复(stdint.h 找不到)、16 位 int 目标跳过 int32plus 用例(与 GCC 行为一致)
4. MCS-51 回归套件全部通过(small/medium/large/huge + stack-auto 模型)

六、CI 与发布

- MCS-51 系列 CI 全绿:编译器检查、指令编码、代码生成、语言诊断、完整回归套件、QEMU 运行时测试(64 位整数、GNU 扩展运行时、MCS-51 稳定性)
- Windows x64 二进制包(MSYS2 UCRT64 构建,约 27 MB),随 tag 自动发布 GitHub Release
- QEMU 回归测试使用确定性 icount

七、Zephyr 集成

- Zephyr hello_world 可在 STC32G 上编译运行(--model-large)
- Flash 占用约 114 KB / 246 KB(45.5%)
- 已在 QEMU stc32g144k246 模拟器上验证运行

八、文档

- MCS-251 ABI 规范与指令覆盖说明
- GNU C 与 Zephyr 兼容性状态
- 中文 SDCC 用户手册
- Windows 本地打包指南

────────────────────────────────────────────────────────────────────────────────

sdccman-zh-CN.pdf

419.8 KB, 下载次数: 44

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

使用道具 举报 送花

已绑定手机

2

主题

8

回帖

98

积分

注册会员

积分
98
 楼主| 发表于 2026-8-1 15:14:31 | 显示全部楼层
版本: v4.6.0-mcs251-20260804(基于上游 SDCC 4.6.0)
下载: https://github.com/zevorn/sdcc-c ... 6.0-mcs251-20260804
sdcc-mcs251-windows-x64-3878985d640db1e8659e051f6cdb083f478ae790.zip (25.93 MB, 下载次数: 17)

────────────────────────────────────────────────────────────────────────────────

一、目标支持

- 全新的 MCS-251 目标后端(Intel/STC 8 位增强型 MCU,24 位寻址空间)
- 支持 STC32G144K246 芯片,提供 QEMU 模拟器支持(stc32g144k246 机型)
- 完整 MCS-251 指令集:字节扩展指令、MOVH、原生字/双字算术
- MCS-251 汇编器(sdas251)、链接器、ELF32 输出

二、代码生成

- 独立的后端架构:gen.c 拆分为 gen.c + gen_lower.c.inc(发射原语、ASMOP、取值)
- R0-R15 固定寄存器分配:字节/字/双字寄存器元组
- MCS-251 专用寄存器追踪与窥孔优化
- 原生 MUL 乘法指令、双字加法/减法
- DPTR 值跟踪缓存:消除冗余的 24 位地址重载(mov dptr,#X; mov dpxl,#Y)
- WR 寄存器合并:字节对栈操作数合并为单条 mov wr6,@spx-N(10 字节 → 4 字节)
- 窥孔规则从 480 行扩展到 714 行(+18 条规则):WR 合并、DPTR 重载消除、push/pop 相邻消除、存储后重载消除

三、ABI 与数据模型

- 原生大端 MCS-251 ABI,32 位 size_t
- 大端寄存器元组与自动栈帧
- setjmp/longjmp 非本地跳转状态按原生字节序存储
- 为 MCS 目标定义 GNU 兼容预处理器数据模型宏(__UINT32_TYPE__ 等)

四、GNU C 扩展(C11/C17)

- C11/C17 语言模式及 GNU 方言
- 语句表达式、case 范围、__extension__
- __attribute__、__typeof__、__auto_type
- 内建函数:__builtin_expect、__builtin_constant_p
- 位运算:__builtin_popcount/clz/ctz/ffs/parity
- 字节交换:__builtin_bswap16/32/64
- 溢出检查:__builtin_add/sub/mul_overflow(通用与类型化)
- 空聚合体、替代关键字拼写
- 复合字面量、兼容的不完整数组声明、重复块作用域 extern
回复

使用道具 举报 送花

4

主题

245

回帖

3655

积分

论坛元老

积分
3655
发表于 2026-8-1 15:48:14 | 显示全部楼层
太强了(๑•̀ㅂ•́)و✧编译一下试试
回复

使用道具 举报 送花

已绑定手机
已实名认证

147

主题

4045

回帖

1万

积分

超级版主

积分
10681
发表于 2026-8-1 18:10:45 | 显示全部楼层
已经编译通过了

可以直接通过/examples/build_251.bat
对当前文件夹下的main.c函数产生编译
具体使用详情请参考REDME.md
sdcc_c251_编译后windows可用.zip (157.29 MB, 下载次数: 33)

## 快速上手

直接命令行使用,**无需设置任何环境变量**(工具/头文件/库自动定位):

:: MCS-251 small 模型(默认 Source mode,面向 STC32G 等)
sdcc -mmcs251 --model-small  main.c -o main.ihx

:: MCS-251 large 模型(24 位平坦 XRAM 数据空间)
sdcc -mmcs251 --model-large  main.c -o main.ihx

:: MCS-251 + 全自动变量入栈(可重入)
sdcc -mmcs251 --model-small --stack-auto  main.c -o main.ihx

:: MCS-51(经典 8051,与官方 SDCC 行为一致)
sdcc -mmcs51 --model-small  main.c -o main.ihx

点评

点赞!  发表于 2026-8-1 18:37
回复

使用道具 举报 送花

已绑定手机

32

主题

416

回帖

2721

积分

金牌会员

积分
2721
发表于 2026-8-1 19:25:39 | 显示全部楼层

又多一种方法。
学习MCU
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-8-1 20:21:13 | 显示全部楼层

前进

截图202608012020588403.jpg
回复

使用道具 举报 送花

已绑定手机

19

主题

3551

回帖

8057

积分

论坛元老

积分
8057
发表于 2026-8-1 20:46:37 | 显示全部楼层
c251又新选择了,就是头文件还要重新写
回复

使用道具 举报 送花

已绑定手机

2

主题

8

回帖

98

积分

注册会员

积分
98
 楼主| 发表于 2026-8-1 21:20:12 | 显示全部楼层
so*** 发表于 2026-8-1 20:46
c251又新选择了,就是头文件还要重新写

C251 我计划不仅仅支持 C89、C99,还会支持 C11 和 C17,
还会支持 GNU 这种语法和关键字。
这样的话,这些现代化的 RTOS 和组件框架全部都能跑在 C251 上了。
我还会继续完善 SDCC 里面调试器的体验,让它接近 GDB 的用法
1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复

使用道具 举报 送花

已绑定手机

2

主题

8

回帖

98

积分

注册会员

积分
98
 楼主| 发表于 2026-8-1 22:10:00 | 显示全部楼层

这些缺失的功能已经规划
回复

使用道具 举报 送花

已绑定手机

63

主题

2165

回帖

3431

积分

论坛元老

积分
3431
发表于 2026-8-2 10:00:45 | 显示全部楼层
大牛
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-23 16:02 , Processed in 0.078125 second(s), 90 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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