Tag Archives: sdcc

SDCC编译器简明使用教程

先前翻译了SDCC编译器手册第一章的内容,尝试过去翻译其他章节,不过难度似乎比我预计的要大,在google的帮助下也完成不了,现在只能结合自己的使用写点了.

本文以SDCC手册第三章内容为基础!

这里不介绍SDCC的安装过程,作为电气工程专业或者计算机嵌入式方向的学生这不是什么困难的事!安装后把SDCC的bin目录添加到path环境变量使得你能在任何目录下使用SDCC,使用archlinux和debian系统的没有这一步,安装时已经自动配置好了!我平时很少使用集成开发工具(IDE)写代码,所以编辑源代码你可以使用你最拿手的工具,任何文本编辑器都可以,我使用的是vim!

源代码与Keil C的稍许不同

对于已经习惯使用Keil C的用户需要注意一下,SDCC的源代码和Keil C有所不同,需要做一点调整才能编译通过.SDCC比较多的使用像8051.h这样的头文件(include/mcs51目录下也有reg51.h这样的头文件).

对于一些非ANSI C的关键字,SDCC均采用双下滑线开头的方式定义,如__code,__idata,__sbit......对于单片机引脚的定义SDCC采用了__at关键字和十六进制地址(用户对底层地址信息要弄清楚,不过我觉得__at关键字是一个比较有特色的改进),如下:

//SDCC                                      Keil C
__sbit __at 0x94 blackLineLeft;         sbit blackLineLeft=P1^4;
__sbit __at 0x95 blackLineRight;        sbit blackLineRight=P1^5;
__sbit __at 0x80 in1;                   sbit in1=P1^0;
__sbit __at 0x81 in2;                   sbit in2=P1^1;
__sbit __at 0x82 in3                    sbit in3=P1^2;
__sbit __at 0x83 in4;                   sbit in4=P1^3;

更多的地址信息可以查看附录

对于内嵌汇编代码,SDCC使用__asm和__endasm两个关键字,参考代码如下:

void delay0_1(uint n) {
    for(i=0;i<n;++i) {
        for(j=0;j<10000;++j) {
            __asm
              nop
              __endasm;
        }
    }
}

......

Read more »

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语句的跳转优化

......

Read more »