[开发工具] 一款开源免费的编译器SDCC

[复制链接]
2059|15
 楼主| 小明的同学 发表于 2025-2-23 10:44 | 显示全部楼层 |阅读模式
SDCC(Small Device C Compiler)是一款开源的、跨平台的C语言编译器,专为嵌入式系统设计,支持多种微控制器架构,如8051、PIC、Z80等。以下是SDCC的主要特点和使用方法:

主要特点
跨平台支持:可在Windows、Linux和macOS等操作系统上运行。

多架构支持:支持8051、PIC、Z80、STM8等多种微控制器架构。

开源免费:SDCC是开源软件,遵循GPL许可证,用户可以自由使用和修改。

高效的代码生成:生成的代码效率高,适合资源有限的嵌入式系统。

丰富的库支持:提供标准C库和针对特定架构的库函数。

调试支持:支持生成调试信息,便于使用GDB等调试工具进行调试。


 楼主| 小明的同学 发表于 2025-2-23 10:47 | 显示全部楼层
编译8051单片机程序
假设有一个针对8051单片机的C程序main.c,内容如下:
  1. #include <mcs51/8051.h>

  2. void main() {
  3.     P1 = 0xFF;  // 将P1口设置为高电平
  4.     while (1) {
  5.         P1 = ~P1;  // 反转P1口的状态
  6.     }
  7. }
使用SDCC编译该程序的命令如下:
  1. sdcc -mmcs51 main.c
编译成功后,会生成适用于8051单片机的HEX文件main.ihx,可以使用编程器将其烧录到单片机中。


编译PIC单片机程序
SDCC也支持PIC单片机,但需要指定具体的PIC型号。假设有一个针对PIC16F84A的C程序main.c,内容如下:
  1. #include <pic16f84a.h>

  2. void main() {
  3.     TRISB = 0x00;  // 设置PORTB为输出
  4.     while (1) {
  5.         PORTB = 0xFF;  // 将PORTB设置为高电平
  6.         __delay_ms(500);  // 延时500ms
  7.         PORTB = 0x00;  // 将PORTB设置为低电平
  8.         __delay_ms(500);  // 延时500ms
  9.     }
  10. }
使用SDCC编译该程序的命令如下:
  1. sdcc -mpic14 -p16f84a main.c
编译成功后,会生成适用于PIC16F84A的HEX文件main.ihx,可以使用编程器将其烧录到单片机中。

调试和优化
SDCC支持生成调试信息,便于使用GDB等调试工具进行调试。编译时可以使用--debug选项生成调试信息:
  1. sdcc --debug main.c
此外,SDCC还提供了一些优化选项,如--opt-code-size用于优化代码大小,--opt-code-speed用于优化代码执行速度:
  1. sdcc --opt-code-size main.c

SDCC是一款功能强大、灵活的开源C编译器,适用于多种嵌入式系统开发。其跨平台支持和多架构兼容性使得开发者可以在不同平台上开发和调试嵌入式应用程序。通过合理使用SDCC的编译选项和优化选项,可以生成高效、紧凑的代码,满足嵌入式系统的资源限制和性能要求。

 楼主| 小明的同学 发表于 2025-2-23 10:51 | 显示全部楼层
SDCC 是一个可重定向的,优化了标准 C(ANSI C89、ISO C99、ISO C11、ISO C23)编译器套件,它 针对基于 Intel MCS51 的微处理器(8031、8032、8051、8052 等)、Maxim(前身为 Dallas)DS80C390变体、基于 Freescale(前身为 Motorola)HC08(hc08、s08)的 MCU(Z80、Z180、SM83、Rabbit 2000、2000A、3000A、TLCS-90、R800)、Padauk (pdk14、pdk15)、STMicroelectronics STM8、MOS 6502 和 WDC 65C02。 支持 Padauk pdk13 靶标的工作正在进行中;Microchip PIC16 和 PIC18 目标未维护。SDCC 可以重新定位于其他微处理器。
 楼主| 小明的同学 发表于 2025-2-23 10:51 | 显示全部楼层
该编译器支持的数据类型:
全系列数据类型:char(8 位,1 字节),short(16 位,2 字节),int(16 位,2 字节),long(32 位,4 字节),long long(64 位,8 字节),浮点(4 字节 IEEE),_Bool/bool 和 _BitInt。
dongnanxibei 发表于 2025-2-23 13:13 | 显示全部楼层
好像以前用过,挺不错的。
xinpian101 发表于 2025-2-23 16:13 | 显示全部楼层
这个不支持AVR吧
yiyigirl2014 发表于 2025-2-24 11:55 | 显示全部楼层
好像挺不错的,codeblock那个软件好像也支持。
643757107 发表于 2025-2-25 09:49 | 显示全部楼层
貌似编译器只与内核有关,与外设无关。因为都是内核在操纵外设。
dongnanxibei 发表于 2025-2-25 20:47 | 显示全部楼层
这个编译器蛮好用。
598330983 发表于 2025-2-26 10:24 | 显示全部楼层
越来越多的项目用开源工具开发了。
wahahaheihei 发表于 2025-2-26 19:24 | 显示全部楼层
那个XC不支持8051内核吧
chenqianqian 发表于 2025-2-26 19:28 来自手机 | 显示全部楼层
这个编译器和GCC比起来性能如何?
yiy 发表于 2025-2-27 19:35 | 显示全部楼层
这个工具看着蛮好用。
kmnqhaha 发表于 2025-4-25 15:35 | 显示全部楼层
SDCC是开源的,遵循GPL许可证。开发人员可以自由下载、使用并修改源代码,适应不同的需求。
一点点晚风 发表于 2025-8-29 12:46 | 显示全部楼层
SDCC 是开源免费的交叉编译器,支持 8051、STM8、PIC 等多种 MCU。兼容 ANSI C 标准,生成高效代码,可与汇编混合编程。集成调试工具,支持多种仿真器。适合嵌入式开发,尤其对低成本项目友好,社区活跃,持续更新,文档丰富,是商业编译器的经济替代方案。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

159

主题

1640

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部