找回密码
 立即注册
查看: 692|回复: 13

RMB5万辛苦费的开源项目,从 SDCC-51 到 SDCC-STC32

[复制链接]

865

主题

1万

回帖

2万

积分

管理员

积分
25122
发表于 2026-6-30 16:53:55 | 显示全部楼层 |阅读模式
SDCC is a retargettable, optimizing Standard C
(ANSI C89, ISO C99, ISO C11, ISO C23) compiler suite t
hat targets the Intel MCS51 based microprocessors
(8031, 8032, 8051, 8052, etc.)     

https://sdcc.sourceforge.net/

STC32G12K128 开源编译器最优起步路线
先明确硬件核心:STC32G 是 80251(C251)扩展架构,不是传统 8 位 MCS51,
只有 SDCC 是目前唯一成熟、可用的开源编译器,没有原生 GCC/LLVM C251 后端。
一、首选起步:SDCC(Small Device C Compiler)【唯一可行】
1. 为什么从 SDCC 出发(唯一标准答案)
===STC官方 提供 RMB5万的辛苦费

相信【中国人民 + AI】可以搞定这个不是事的事


回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
 楼主| 发表于 2026-7-12 09:25:57 | 显示全部楼层
截图202607120925537722.jpg
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
 楼主| 发表于 2026-7-12 09:26:34 | 显示全部楼层

明白了,您是想了解 ANSI C89、ISO C99、ISO C11、ISO C23

这几个 C 语言标准版本之间的主要差异对比,

以及它们在 STC 单片机开发(Keil C51 / C251 编译器) 环境下的支持情况。

作为 STC FAE,我结合 STC 开发的实际场景来为您分析。


一、C 语言标准核心差异对比

特性 C89 (ANSI C) C99 C11 C23
发布年份 1989/1990 1999 2011 2023(最新)
// 行注释 ❌ 不支持 ✅ 支持 ✅ 支持 ✅ 支持
变量声明位置 必须在函数/块开头 ✅ 允许在代码中任意位置声明 ✅ 同 C99 ✅ 同 C99
for(int i=0;...) ❌ 不支持 ✅ 支持 ✅ 支持 ✅ 支持
stdint.h (uint8_t等) ❌ 无 ✅ 引入 ✅ 保留 ✅ 保留
inline 内联函数 ❌ 无 ✅ 引入 ✅ 保留 ✅ 保留
// ❌ 无 ✅ 引入 ✅ 保留 ✅ 保留
long long (64位) ❌ 不支持 ✅ 支持 ✅ 支持 ✅ 支持
复合字面量 ❌ 无 ✅ 引入 ✅ 保留 ✅ 保留
指定初始化器 ❌ 无 ✅ 引入 ✅ 保留 ✅ 保留
_Bool / bool ❌ 无 ✅ 引入<stdbool.h> ✅ 保留 ✅ 保留
_Complex ❌ 无 ✅ 引入 ✅ 保留 ✅ 保留
可变参数宏 (VA_ARGS) ❌ 无 ✅ 引入 ✅ 保留 ✅ 保留
restrict 关键字 ❌ 无 ✅ 引入 ✅ 保留 ✅ 保留
_Static_assert ❌ 无 ❌ 无 ✅ 引入 ✅ 保留
_Generic (泛型) ❌ 无 ❌ 无 ✅ 引入 ✅ 保留
匿名结构体/联合体 ❌ 无 ❌ 无 ✅ 引入 ✅ 保留
alignas / alignof ❌ 无 ❌ 无 ✅ 引入 ✅ 保留
noreturn ❌ 无 ❌ 无 ✅ 引入 ✅ 保留
constexpr ❌ 无 ❌ 无 ❌ 无 ✅ 引入
auto 类型推导 ❌ 无 ❌ 无 ❌ 无 ✅ 引入
typeof ❌ 无 ❌ 无 ❌ 无 ✅ 引入
#elifdef / #elifndef ❌ 无 ❌ 无 ❌ 无 ✅ 引入
二进制字面量 0b... ❌ 无 ❌ 无 ❌ 无 ✅ 引入
nullptr ❌ 无 ❌ 无 ❌ 无 ✅ 引入
bool 成为关键字 ❌ 无 ❌ 无 ❌ 无 ✅ 引入

二、在 STC 单片机开发中的实际影响

1. Keil C51 编译器(用于 STC8/STC15 等 8 位 8051 系列)

Keil C51 主要支持 C89 + 部分 C99 特性,具体来说:

特性 Keil C51 支持情况
// 行注释 ✅ 支持
变量在代码中间声明 ✅ 支持(C51 扩展允许)
for(int i=0;...) 不支持,必须在外层声明
stdint.h (uint8_t 等) ✅ 支持(需包含头文件)
long long (64位) 不支持,C51 中 long 为 32 位
inline ✅ 支持(C51 扩展关键字)
_Bool / bool ❌ 不支持原生,可用 bituint8_t 替代
复合字面量 ❌ 不支持
指定初始化器 ❌ 不支持
可变参数宏 ❌ 不支持
restrict ❌ 不支持

实际开发建议(Keil C51):

  • 变量统一在函数开头声明
  • 循环变量在函数开头声明,不要写在 for()
  • 使用 unsigned char / unsigned int 等传统类型,或包含 `` 使用 STC 头文件定义的类型
  • 64 位运算需用软件模拟,效率很低,尽量避免

2. Keil C251 编译器(用于 STC32G/Ai8051U 等 32 位 80251 系列)

Keil C251 同样主要支持 C89 + 部分 C99 特性,与 C51 类似:

特性 Keil C251 支持情况
// 行注释 ✅ 支持
变量在代码中间声明 ✅ 支持
for(int i=0;...) 不支持
stdint.h ✅ 支持
long long (64位) 支持(C251 为 32 位架构,支持 64 位)
inline ✅ 支持
_Bool / bool ❌ 不支持原生

3. SDCC 编译器(开源,可用于 STC 单片机)

SDCC 对 C99 的支持比 Keil 更好,部分支持 C11 特性。但作为 STC 官方推荐,主力开发环境仍是 Keil C51/C251


三、STC 开发中实际使用的 C 语言风格

根据 STC 官方数据手册和示例程序,实际工程中推荐的做法是 以 C89 为主,兼容部分 C99 语法。以下是一个典型的 STC 代码风格示例:

/* 文件名: main.c
 * 功能: STC8H 串口1 发送 "Hello STC!"
 * 硬件: STC8H8K64U, 内部IRC 24MHz, 串口1(P3.0/P3.1) 115200bps
 * 编译: Keil C51, Memory Model: Large
 */

#include "STC8H.h"      // STC 官方头文件
#include <stdio.h>      // 用于 sprintf

// 函数声明(C89 风格:所有声明在文件开头)
void UART1_Init(void);
void UART1_SendString(unsigned char *str);
void Delay500ms(void);

void main(void)
{
    unsigned char buf[64];  // 变量统一在函数开头声明(C89 风格)
  
    UART1_Init();
    EA = 1;                 // 打开总中断
  
    while(1)
    {
        sprintf((char *)buf, "Hello STC! System Freq: %lu Hz\r\n", 
                (unsigned long)MAIN_Fosc);
        UART1_SendString(buf);
        Delay500ms();
    }
}

void UART1_Init(void)
{
    SCON = 0x50;            // 8位可变波特率,无奇偶校验
    TMOD = 0x00;            // 定时器1模式0(16位自动重载)
    TL1 = (unsigned char)((65536UL - (MAIN_Fosc / 4 / 115200)) & 0xFF);
    TH1 = (unsigned char)((65536UL - (MAIN_Fosc / 4 / 115200)) >> 8);
    TR1 = 1;                // 启动定时器1
    ES = 1;                 // 使能串口1中断
}

void UART1_SendString(unsigned char *str)
{
    while(*str)
    {
        SBUF = *str++;
        while(TI == 0);     // 等待发送完成
        TI = 0;
    }
}

void Delay500ms(void)       // @24.000MHz
{
    unsigned long i;
    for(i = 0; i < 3000000; i++);
}

四、总结与建议

您的需求 推荐做法
在 Keil C51/C251 下开发 STC 单片机 使用C89 风格,变量在函数开头声明,for 循环变量在外层声明
希望使用较新的 C 语法 可有限使用 C99 特性(// 注释、stdint.hinline),但避免使用 C11/C23 新特性
使用 SDCC 编译器 可支持更多 C99 特性,但需注意 SDCC 与 Keil 在中断、位寻址等语法上的差异
跨平台/通用代码 坚持 C89 标准,兼容性最好
学习 C 语言本身 建议学习C11 作为基础,了解 C23 的新特性趋势

如果您有具体的 STC 芯片型号和想要实现的功能,请告诉我,我可以为您提供针对性的代码示例和配置指导!


? 搜索 "Standard C (ANSI C89 ISO C99 ISO C11"

? 相关论坛讨论

  1. RMB5万辛苦费的开源项目,从 SDCC-51 到 SDCC-STC32
  2. sdcc编译选项,AI翻译的,蹩脚英语自己脑补
  3. IAR入门指南之嵌入式工作台工具概述

⏱️ 查找用时 0.5s | 总回答用时 22.2s

回复

使用道具 举报 送花

21

主题

89

回帖

549

积分

高级会员

积分
549
发表于 2026-8-7 13:41:24 | 显示全部楼层
请问非sdcc可以吗? 我前段时间做了一个基于tinycc的, 最近在验证stc32g的仓库代码, 支持c11等

点评

现在 3组高手在做, 内部1组,C11, 放弃 SDCC 内部2组, C23, 放弃 SDCC 泽文,SDCC 您这如能在第3个实用,开源后,我们支持部分辛苦费  详情 回复 发表于 2026-8-7 13:47
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
 楼主| 发表于 2026-8-7 13:47:34 | 显示全部楼层
peiti*** 发表于 2026-8-7 13:41
请问非sdcc可以吗? 我前段时间做了一个基于tinycc的, 最近在验证stc32g的仓库代码, 支持c11等
...

现在 3组高手在做,
内部1组,C11, 放弃 SDCC,估计 2026/8月底实用状态;
内部2组,  C23, 放弃 SDCC,估计 2026/9月底实用状态;
泽文,SDCC,估计 可能会山高路远水且深......;

您这如能在第3个实用,开源后,我们支持部分辛苦费
估计第一组会在2026/8月,进入实用状态,
已测试过 10多个STC32G12K128实验箱程序
回复

使用道具 举报 送花

21

主题

89

回帖

549

积分

高级会员

积分
549
发表于 2026-8-7 13:51:33 | 显示全部楼层
神*** 发表于 2026-8-7 13:47
现在 3组高手在做,
内部1组,C11, 放弃 SDCC
内部2组,  C23, 放弃 SDCC

ok
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
 楼主| 发表于 2026-8-7 13:54:56 | 显示全部楼层
您如第一个实用,空间/时间 效率不低于 KEIL C251,110%,可以支持全额辛苦费

可以 先放出来,挂在 VSCode 下面 / 或 KEIL 下面,让大家来测试,暴露Bug

截图202608071358407402.jpg

我们 第一组,C11,  自己测试还有Bug, 不好放出来
回复

使用道具 举报 送花

21

主题

89

回帖

549

积分

高级会员

积分
549
发表于 2026-8-7 14:30:49 | 显示全部楼层
神*** 发表于 2026-8-7 13:54
您如第一个实用,空间/时间 效率不低于 KEIL C251,110%,可以支持全额辛苦费

可以 先放出来,挂在 VSCode ...

我也是这样想得, 大概下周我会放出来给大家测试, 我先自测一下
回复

使用道具 举报 送花

21

主题

89

回帖

549

积分

高级会员

积分
549
发表于 2026-8-7 14:32:40 | 显示全部楼层
神*** 发表于 2026-8-7 13:54
您如第一个实用,空间/时间 效率不低于 KEIL C251,110%,可以支持全额辛苦费

可以 先放出来,挂在 VSCode ...

挂在vscode/keil下边是什么意思? 我可能会给一个exe, 加一个说明文档, 我没做过vscode插件
回复

使用道具 举报 送花

865

主题

1万

回帖

2万

积分

管理员

积分
25122
 楼主| 发表于 2026-8-7 15:45:32 | 显示全部楼层
截图202608071543458377.jpg

深圳国芯人工智能有限公司-实验箱

您跟我们客服 要 【免费包邮送】的这2个实验箱,
测试其中的大部分程序过了,再放出来,问题就少了


回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-9-23 16:10 , Processed in 0.077203 second(s), 87 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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