找回密码
 立即注册
查看: 365|回复: 7

SDCC-STC32 编译器 之火,移植版更新日志, 支持 MCS251指令集

[复制链接]

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-8-5 13:44:45 | 显示全部楼层 |阅读模式
SDCC-STC32 移植版更新日志, 支持 MCS251指令集

版本: v4.6.0-mcs251-20260804(基于上游 SDCC 4.6.0)
下载: 本楼附件

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

一、目标支持

- 全新的 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 本地打包指南

sdcc-mcs251-windows-x64-3878985d640db1e8659e051f6cdb083f478ae790.zip

25.93 MB, 下载次数: 29

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

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
 楼主| 发表于 2026-8-5 13:54:10 | 显示全部楼层
STC内部移植 SDCC-51 到 SDCC-STC32, 虽然已能点灯,
但内部评估难度极大,只能先换套方法另起炉灶,期再起燎原之火。



泽文大侠,自山的那边归来,路见不平,拔刀相助
平地一声惊雷,再燃 SDCC-STC32 编译器 之火
燎原之势已飘过 长江 / 黄河......
回复

使用道具 举报 送花

已绑定手机

2

主题

8

回帖

98

积分

注册会员

积分
98
发表于 2026-8-5 14:02:58 | 显示全部楼层
感谢姚老师帮忙发帖!从 FreeRTOS for STC32G 起航,到 SDCC-STC32 新征程,希望帮社区开发者持续降低学习和使用 STC32 的门槛!
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
 楼主| 发表于 2026-8-5 14:08:44 | 显示全部楼层
感谢 泽文,不远万里前来相助,
STC32位8051 的春天来了,51的夏天来了

期待  SDCC-STC32编译器的完善,
这样可以得到最新 C语言特性的支持


我们另外启动的这个STC32-C11编译器,
只能暂时支持到 C11,并且库的支持,
编译器编译的稳定性还是 SDCC 更让人信任
截图202608051410098733.jpg

回复

使用道具 举报 送花

54

主题

397

回帖

864

积分

高级会员

积分
864
发表于 2026-8-5 17:46:55 | 显示全部楼层
神*** 发表于 2026-8-5 13:54
STC内部移植 SDCC-51 到 SDCC-STC32, 虽然已能点灯,
但评估难度极大,只能先换套方法另起炉灶,期再起燎原 ...

那就是说上面的安装包 还不能用在其他程序上,只能点灯?
回复

使用道具 举报 送花

已绑定手机

19

主题

3551

回帖

8057

积分

论坛元老

积分
8057
发表于 2026-8-5 21:48:42 | 显示全部楼层
xie2*** 发表于 2026-8-5 17:46
那就是说上面的安装包 还不能用在其他程序上,只能点灯?

可以使用所有寄存器,不止能点灯
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
 楼主| 发表于 2026-8-5 22:32:38 | 显示全部楼层

C语言正式标准化至今,主要经历了几个关键的版本。C语言标准由ISO(国际标准化组织)发布,通常被称作 ISO/IEC 9899 系列。

下面是几个主要标准及其核心特点的概览:

标准 (非正式名称) 发布时间 主要特性与变化
C89 / C90 1989 / 1990 第一个官方标准。由ANSI在1989年发布,随后被ISO采纳。它奠定了C语言的基础,包括函数原型、标准库(如 stdio.h)等。
C99 1999 一次重大更新。引入了许多现代特性,例如://单行注释、long long int类型、_Bool布尔类型、可变长数组(VLA)、restrict指针和 inline内联函数。
C11 2011 关注并发与安全。正式引入了对多线程的支持(<threads.h>)、原子操作(_Atomic)、_Generic泛型选择和 _Static_assert静态断言。
C17 / C18 2018 一个“补丁”版本。主要是对C11标准进行缺陷修复和澄清,没有引入任何重大的新语言特性。
C23 2023/2024 最新的标准。引入了 nullptrconstexpr、二进制字面量(0b1010)、typeof#embed等新特性,使语言更现代化。

名称“C18”和“C17”有时混用,本质上指代同一个标准。

一个重要的背景知识是,C89C90 通常指同一个标准,因为ANSI在1989年批准,ISO在1990年采纳,两者在技术上没有差异。

目前,大多数C语言教程和现有代码库仍主要基于C99C11标准。而现代编译器(如GCC、Clang)对新标准(如C23)的支持也日趋完善。在编写代码时,根据项目需求,可以通过编译器的 -std=c99-std=c11 等选项来指定使用哪个标准。

回复

使用道具 举报 送花

已绑定手机

284

主题

490

回帖

2566

积分

金牌会员

积分
2566
发表于 2026-8-7 23:09:03 | 显示全部楼层
SDCC没法用啊,没有主程序
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-23 15:06 , Processed in 0.079382 second(s), 76 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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