SDCC第一章手册翻译

最近开始使用SDCC编译器,本来想详细写点SDCC的文章,不过一直没有解决单片机在Linux平台下的烧录问题,所以计划暂时停止了.没事干,先翻译一下 SDCC Manual 第一章的内容!希望对大家有所帮助.不过我这人做事常常有头无尾,所以不太可能把整个手册都翻译好!

SDCC开发比较活跃,不同时期的Manual可能会有些变化,我这翻译的时候Revision是6253.新版本可能会略有一些变化,总体变化不会很大.我的英语不是很好,既不是英语专业的也不是计算机专业的,还不是电气专业的,翻译中难免(可能性很大)会出现的错误,优先建议你去读SDCC Manual的原文,英语不好再考虑对照这篇文章读原文,迫不得已再直接读我的中文翻译.

Chapter 1

简介

1.1 关于SDCC

SDCC(Small Device C Compiler)是 Sandeep Dutta 为8位微处理器设计的开源,可重用,经过优化的ANSI-C交叉编译器.当前版本的目标平台为Intel MCS51兼容单片机(8031, 8032, 8051, 8052系列), Dallas 的 DS80C390 及其衍生产品, Freescale(原属于 Motorola)的 HC08 和基于 Zilog Z80 的兼容单片机.SDCC 也可支持其他单片机,PIC 支持正在开发中.整个编译器源代码在GNU通用公共许可证(GPL)下发布. SDCC 使用 ASXXXX 和 ASLINK 的修改版本作为交叉编译工具和链接工具. SDCC 针对各种单片机进行有效的拓展,可以更好的使用基本的硬件资源.

此外,SDCC 对单片机做了大量标准优化,例如:

  • 全局表达式消除
  • 循环优化(无操作循环优化,归纳变量循环优化,你循环优化)
  • 重复常量合并
  • 复制传播
  • 无效代码清楚
  • switch语句的跳转优化

为了更好的满足其他8位单片机,SDCC 交叉编译器后端使用全局寄存器分配算法.

基于独立规则的监视口优化器

支持的数据类型有:

type
width
default
signed range
unsigned range
bool
1 bit
unsigned
-
0, 1
char
8 bits, 1 byte
signed
-128, +127
0, +255
short
16 bits, 2 bytes
signed
-32.768, +32.767
0, +65.535
int
16 bits, 2 bytes
signed
-32.768, +32.767
0, +65.535
long
32 bits, 4 bytes
signed
-2.147.483.648, +2.147.483.647
0, +4.294.967.295
float
4 bytes IEEE 754
signed
1.175494351E-38, 3.402823466E+38
pointer
1, 2, 3 or 4 bytes
generic

允许在函数的任何位置内联汇编代码.

SDCC 也提供了 --cyclomatic 参数帮助分析函数复杂度,以决定哪些部分可以进行进一步的优化,或用汇编改写.

SDCC 还带有一个源代码级调试器 SDCDB.目前调试器使用 ucSim (为 8051 和其他微控制器开发的开源仿真软件)

最新版的 SDCC 编译器可以从 http://sdcc.sourceforge.net/snap.php下载.

注意: 编译器可能会先于文档有一些变化.

1.2 开放源代码

SDCC 编译器的所有部分均是开放源代码的.预处理器,汇编器,链接器等的源代码与编译器一同发布.本文档一直使用开源字处理软件 LyX.

本软件是自由软件,你可以在自由软件基金会的 GNU通用公共许可证(GPL) 下修改发布你自己的版本.发布这个软件是希望对你有所帮助,但我们对软件自身的错误以及软件所造成的错误不能做任何担保.更多细节请参阅GNU通用公共许可证(GPL).GNU通用公共许可证(GPL) 已经和本软件一同发布,如果没有,写信到这个地址:59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.向只有软件基金会索取.我们非常欢迎你使用,分享和改善该软件.但你修改了软件后给其他人使用你也必须开放你对软件的修改!请拒绝软件囤积!

1.3 排版规制

在本手册中,我们使用如下约定.命令使用 "sans serif" 字体.代码使用印刷字体.术语和条目使用斜体.

1.4 与以前版本的兼容性

新版一般会修复许多旧版中的 Bug.但有时也会有一些和旧版不兼容.并不是为了给你制造麻烦,而是让编译器更稳定,高效以及符合 ANSI标准(详情见8.2节ANSI-Compliance)

  • short 类型现在与 int 类型相同占用16位空间,它曾经与 char 类型相同占用8位空间但是不符合 ANSI标准.为了兼容在编译器下编写的代码,新编译时可以使用 --short-is-8bits 参数编译原来的代码((see lyx:-short-is-8bits).
  • 使用GCC从源代码编译安装,那默认的 include, library 和documentation 将会存储在/usr/local/share目录下.
  • 如果没有使用 --std-c89--std-c99 命令行编译选项,char类型可作为整型数据处理.例如:
    char a=3;
    printf (%d %c\n, a, (char)a);

    a变量分别作为整型和字符类型.

  • 同上,如果没有使用 --std-c89--std-c99 命令行编译选项,在哈佛架构(如MCS51的,ds390)上指针参数将被作为普通指针对待.
  • --regextend --noregparms --stack-after-data 三个选项已经被废弃使用.
  • bit和sbit类型现在开始采用类似C99中 _Bool类型的定义方式.这一改变带来的不兼容主要是按位取反语句,例如:
      bit b;
      b = ~b; /* equivalent to b=1 instead of toggling b */
      b = !b; /* toggles b */

    在旧版中,两种都进行了取反操作.

  • 在旧版中,预处理过程中是调用 --std-c99 规制,无论使用哪种 --std-xxx 设置.这个问题不会再出现,并且它容易导致一些编译失败,像"//"单行注释采用C99预处理,但使用 --std-c89 选项编译.
  • 在2.8.4之前版本,pic16的 *printf() 和 printf_tiny() 库函数采用的 %b, %hb 和 %lb 这种不合标准的二进制格式在新版中默认是禁止的.可以通过在 device/lib/pic16/libc/stdio/vfprintf.c 和 device/lib/pic16/libc/stdio/printf_tiny.c 两个文件中定义 BINARY_SPECIFIER 宏并重新编译库文件打开.
  • 在2.8.5之前的版本中对未命名结构体成员初始化是不符合 ISO/IEC 9899:1999标准的 (见6.7.8节 )
    2.8.5之前的版本:

    struct {
        int a : 2;
        char  : 2;
        int b : 2;
      } s = {1, 2, 3};
    /* s.a = 1, s.b = 3 */

    新版:

     struct {
        int a : 2;
        char  : 2;
        int b : 2;
      } s = {1, 2};
    /* s.a = 1, s.b = 2 */
  • 2.9.0版本及以后版本库文件和头文件采用ar格式.见3.1.6节.
  • 在3.0及以后版本中 SDCC 的特殊关键字将采用双下划线开头.见8.2节.
  • 在3.0及以后版本中 xa51 和 avr 架构默认将不被支持.
  • 在3.0及以后版本中 sdldgb 和 sdldz80 这两种 GameBoy 镜像格式将不在被支持. GameBoy 上使用 makebin 工具能方便的支持 intel 的 Hex 格式.
  • 在3.0及以后版本中 sdldgb 和 sdldz80 格式地图文件以及没有$符号的文件格式将不再被 rrgb(GameBoy模拟器)支持.使用 as2gbmap 工具可以很方便的使用.
  • 1.5 系统要求

    在安装 SDCC 之前你是否清楚你需要的是什么?一台电脑,并希望来计算.首选的安装的方法是使用 GNU 的 gcc 和 make 工具从源代码编译安装 SDCC .对于 Windows 用户,我们提供了预编译的二进制版本.当然,你应该有一些命令行工具和编译器的使用经验.

    1.6 其他资源

    SDCC 的官方网站http://sdcc.sourceforge.net/是个获取资源的好地方.在这里你还可以找到用户邮件列表的链接,他会帮助你解决问题并且和其他 SDCC 用户讨论问题.还有一些 SDCC 相关网站的链接也可以在这里找到.本手册的 HTML 副本已经放在 SDCC 安装目录的 DOC 文件夹下.PDF 格式的在http://sdcc.sourceforge.net/doc/sdccman.pdf可以找到.源代码包中已经包含了 SDCC 使用的其他一些工具(仿真器和汇编器)的源代码.如果你想获取最新的还未发布的版本,可以通过 Subversion 工具直接从https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc. 获取.

    1.7 Wishes for the future

    There are (and always will be) some things that could be done. Here are some I can think of:

    char KernelFunction3(char p) at 0x340;
     
    better code banking support for mcs51

    If you can think of some more, please see the section 7.2 about filing feature requests.


    总算大功告成了,没想到排版比翻译还累.

    如果翻译里面有什么错误,希望大家及时联系我,互相交流使人进步.再次希望这篇翻译能对大家有所帮助.

    » 本博客采用署名 2.5 中国大陆许可协议进行许可,本文版权归作者所有,欢迎转载,但必须在明显位置给出原文连接。
    anyShare分享到:
发表评论?

4 条评论。

  1. “循环优化(无操作循环优化,归纳变量循环优化,【你】循环优化)”?

  2. 51单片机在linux烧录的问题我已经解决了,配合sdcc的Makefile我也已经写了,不过只适合单文件的c工程,如果你有需要,我们可以交流一下

    • 我已经有3年没有玩单片机了,我不是电气专业的,也不是计算机专业的,当年玩51就是个人兴趣,现在毕业了,时间越来越少了,哎。。。。。。
      今天突然看到有人在我三年前的博客上发表评论,挺高兴的。希望我的文章对你有帮助,C51对我是一段蛮好的回忆!

发表评论

注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>