一、前言

最近打算写一些单片机程序,因此买了一块51开发板,打算写几个有趣的程序。

出于将学习和娱乐分开的目的,我把编程工作放在linux下来进行。

在linux下进行单片机的软件开发,要先安装专用的交叉编译器sdcc。接下来我会阅读sdcc的man文档,再结合一些简单的实验,来了解一下这款编译器。其目的有三,一是复习一些单片机的知识,为编程做点准备。二是理清sdcc的编译选项,好用来写makefile。三是弄明白sdcc和keil编译器的不同,这样可以把keil c的代码移植过来直接使用。

二、sdcc的安装

1.1 在ubuntun下安装sdcc

由于我的系统是ubuntun,因此可以直接使用apt-get命令来进行安装

1
$sudo apt-get install sdcc

 

1.2 用其他方式安装sdcc

非ubuntun环境下,可以下载sdcc源码并编译生成sdcc,这样可以得到目前的最高版本。

sdcc源码的下载地址是 http://sdcc.sourceforge.net/snap.php 。

1
2
3
4
5
6
$tar -xvjf sdcc-src-yyyymmdd-rrrr.tar.bz2

$cd sdcc
$./configure
$make
$make install

sdcc man文件下载地址 http://sdcc.sourceforge.net/doc/sdccman.pdf

三、sdcc包含的内容

安装完sdcc后可以分析一下sdcc一共包含哪些组成部分。

2.1 头文件和库文件

sdcc的头文件和库文件在 installdir/share/sdcc目录下,除此之外的所有bin文件包含在/bin目录下。

installdir/share/sdcc/include
installdir/share/sdcc/lib

installdir/bin

installdir默认的值为/usr。

2.2 编译程序sdcc

编译程序sdcc,最常用到的命令,它所做的其实就是轮流调用预处理器、汇编器、连接器来完成编译工作。

2.3 预处理程序sdccp

这个预编译程序sdccp是直接用gcc的预编译程序的源码修改而来的,它被用来在编译前处理#include #define 这些预编译指令。

2.4 汇编程序和链接程序sdas, sdld

sdas用来将C源码编译成汇编指令,sdld用来链接各目标文件的符号表。顺带一提man文档上说这两个程序都是基于Alan Baldwin的开源代码修改的,现在用的是它的2.0版本。Alan Baldwin已经将它的5.0版本开源,该老兄一直致力于编译器的研发工作。

2.5 仿真器

sdcc集成的仿真器包含s51, sz80 shc08 and sstm8系统,由Daniel Drotos开发,在他的网站上有详细的说明:

http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51

2.6 debug工具 sdcdb

sdcc用Daniel Drotos的仿真器进行debug,由于我有开发板,可以直接把程序烧上去。而且该款单片机没有j-tag接口,所以等有时间再来研究这个debug工具吧。

总结

  • 在linux下进行单片机开发可以使用交叉编译器sdcc
  • sdcc包含有一个编译程序、预处理程序、汇编程序和链接程序。
  • sdcc还包含有一个集成的仿真器和debug工具。

 

半年前折腾过一次Ubuntu,但是因为锐捷的校园网封锁了Mentohus之类的第三方客户端,所以放弃了Linux。之后一些Linux下的用户向网络管理员反映,终于开放了第三方客户端。这也使我重拾勇气,得以在Linux中畅游。正巧这段时间在学习C51,因此必须在Linux这个平台上找到合适的替代品,花了一天的时间,总算完成了基本的配置。好的,进入正题。

 

1.基本环境

操作系统:Ubuntu_12.04_LTS

文本编辑器:Vim_7.3

编译器:SDCC_2.9

烧录工具:kSTCISP

C51芯片:STC89C52

 

2.编辑器

为了强迫自己在键盘上操作,我选择了被不少人称之为“神器”的Vim。

Debian/Ubuntu安装:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. sudo apt-get install vim  

 

 

如果不喜欢在终端里写代码,可以使用gVim。

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. sudo apt-get install vim-gnome  


 

 

IDE的话,强烈推荐MCU8051,功能极其丰富,并且有友好的中文界面。类似Windows下的Keil。

在Ubuntu_Software_Center中可直接安装。

 

3.编译

SDCC全称“Smell Devic C Compiler”。

安装:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. sudo apt-get sdcc sdcc-doc  


 

 

在终端下使用它编译C文件很简单:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. sdcc file.c  

 

 

而MCU8051中自带的编译器就是SDCC,因此直接按F11就可以编译。

这里要注意的是,SDCC和Keil的源代码有些不同,

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <span style="color:#ff0000;">“非ANSI C的关键字,SDCC均采用双下滑线开头的方式定义,如__code,__idata,__sbit”</span>  

——引用自《SDCC编译器简明使用教程》

 

这篇文章中说得比较详细,我也正是通过它才顺利通过编译。

 

还有一点,SDCC使用的C标准是C99,因此不可出现

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. __sbit __at P1_0 A  


这样的申明,否则会报错:

 

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <span style="color:#ff0000;">Initializer element is not constant</span>  

 

 

应该如此申明:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. __sbit __at (0x90) A  


因为在8051.h头文件中,

 

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. __sbit __at (0x90) P1_0  

 

 

具体可参看《C C++全局变量初始化 initializer element is not constant 错误 c++中为什么不能对全局变量在函数外赋值》

 

4.烧录

SDCC编译后的文件为.hex,但是烧录时需要用.bin文件,因此在终端中cd进编译后的文件目录,输入:

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. objcopy -I ihex -O binary file.hex file.bin  


如果使用USB转r232的话,不用担心驱动问题,Ubuntu中集成了pl2303的驱动,只要在终端中输入:

 

 

[plain] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. dmesg | tail  


就可以查看自己板子所接的端口名:

 

接下来开始烧录:

STC官方只有Windows下的烧录软件(而且还不好用),这边我发现一个很棒的STC89C52烧录软件,叫kSTCISP,作者是个高中生。

下载地址:http://rgwan.byethost10.com/archives/1196
 

下载过程也很简单,选择端口、.bin文件,先按下载,再给板子上电。大功告成!