一、前言
最近打算写一些单片机程序,因此买了一块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/libinstalldir/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安装:
- sudo apt-get install vim
如果不喜欢在终端里写代码,可以使用gVim。
- sudo apt-get install vim-gnome
IDE的话,强烈推荐MCU8051,功能极其丰富,并且有友好的中文界面。类似Windows下的Keil。
在Ubuntu_Software_Center中可直接安装。
3.编译
SDCC全称“Smell Devic C Compiler”。
安装:
- sudo apt-get sdcc sdcc-doc
在终端下使用它编译C文件很简单:
- sdcc file.c
而MCU8051中自带的编译器就是SDCC,因此直接按F11就可以编译。
这里要注意的是,SDCC和Keil的源代码有些不同,
- <span style="color:#ff0000;">“非ANSI C的关键字,SDCC均采用双下滑线开头的方式定义,如__code,__idata,__sbit”</span>
——引用自《SDCC编译器简明使用教程》
这篇文章中说得比较详细,我也正是通过它才顺利通过编译。
还有一点,SDCC使用的C标准是C99,因此不可出现
- __sbit __at P1_0 A
这样的申明,否则会报错:
- <span style="color:#ff0000;">Initializer element is not constant</span>
应该如此申明:
- __sbit __at (0x90) A
因为在8051.h头文件中,
- __sbit __at (0x90) P1_0
具体可参看《C C++全局变量初始化 initializer element is not constant 错误 c++中为什么不能对全局变量在函数外赋值》
4.烧录
SDCC编译后的文件为.hex,但是烧录时需要用.bin文件,因此在终端中cd进编译后的文件目录,输入:
- objcopy -I ihex -O binary file.hex file.bin
如果使用USB转r232的话,不用担心驱动问题,Ubuntu中集成了pl2303的驱动,只要在终端中输入:
- dmesg | tail
就可以查看自己板子所接的端口名:
接下来开始烧录:
STC官方只有Windows下的烧录软件(而且还不好用),这边我发现一个很棒的STC89C52烧录软件,叫kSTCISP,作者是个高中生。
下载地址:http://rgwan.byethost10.com/archives/1196
下载过程也很简单,选择端口、.bin文件,先按下载,再给板子上电。大功告成!