最近打算写一些单片机程序,因此买了一块开发板,打算写一些代码来复习相关的知识。第一块开发板是普通的stc90c51,出于将学习和娱乐分开的目的,我把编码工作放在linux下来进行。
在linux下进行单片机的软件开发,要先安装专用的交叉编译器sdcc。接下来我会阅读sdcc的man文档,再结合一些简单的实验,来了解一下这款编译器。其目的有三,一是复习一些单片机的知识,二是理清sdcc的编译选项,好用来写makefile,三是弄明白sdcc和keil编译器的不同,这样可以把keil c的代码移植过来直接使用。
由于我的系统是ubuntun,因此可以直接使用apt-get命令来进行安装
$sudo apt-get install sdcc
最原始的方式是下载源码并编译,这样可以得到目前的最高版本。sdcc源码的下载地址是 http://sdcc.sourceforge.net/snap.php 。下载好后用tar解包,用./configure检查编译环境,然后用make编译sdcc,再用make install复制sdcc的bin文件的lib文件和头文件到相应的目录。
$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会自动链接的头文件和库文件在安装目录的 /share/sdcc 下,默认的值为/usr,而接下来的bin文件全都包含在安装目录的/bin下。
<installdir>/share/sdcc/include
<installdir>/share/sdcc/lib
编译程序sdcc,最常用到的命令,它所做的其实就是轮流调用预处理器、汇编器、连接器来完成编译工作。
这个预编译程序sdccp是直接用gcc的预编译程序的源码修改而来的,它被用来在编译前处理#include #define 这些预编译指令。
sdas用来将C源码编译成汇编指令,sdld用来链接各目标文件的符号表。顺带一提man文档上说这两个程序都是基于Alan Baldwin的开源代码修改的,现在用的是它的2.0版本。Alan Baldwin已经将它的5.0版本开源,该老兄一直致力于编译器的研发工作。
sdcc集成的仿真器包含s51, sz80 shc08 and sstm8系统,由Daniel Drotos开发,在他的网站上有详细的说明:
http://mazsola.iit.uni-miskolc.hu/~drdani/embedded/s51
sdcc用Daniel Drotos的仿真器进行debug,由于我有开发板,可以直接把程序烧上去。而且该款单片机没有j-tag接口,所以等有时间再来研究这个debug工具吧。