|
|
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 本地打包指南
────────────────────────────────────────────────────────────────────────────────
|
2
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+2
楼主威武~
-
+2
楼主威武~
|