一、文件说明
1、sdcc compiler
这个是编译器,可以单纯编译代码,但是没有对生成文件进行链接
2、sdcpp prepocessor
这个是预处理器,可以对头文件和相关宏进行预处理
3、sdas assemblers and sdld linker
这个是汇编语言处理器和链接器,可以编译汇编语言,并且链接所有的生成文件,生成ihx格式的烧录文件。
4、sdbinutils utilties(sdar,sdranlib,sdnm,sdobjcopy)
这个主要是由GUN Binutils分离出来的,比如可以用sdobject进行反汇编。
5、ucsim simulator
这是软件仿真器
6、sdcdb debugger
这个是代码调试器
7、Packihx
这个工具可以把ihx后缀的文件转换成hex后缀的文件
8、makebin
这个工具可以将ihx文件转换成bin文件
9、SDCC run-time libraries
二、SDCC源码编译说明
./configure--disable-pic14-port --disable-pic16-port --prefix=/opt/SDCC/
1、缺少bison
configure:error: Cannot find required program bison
解决方法:sudo apt-get install flex bison
2、找不到adjacency_list.hpp
configure:error: boost library not found (boost/graph/adjacency_list.hpp).
解决方法:sudo apt-get installlibboost-date-time-dev libboost-program-options-dev libboost-system-devlibboost-filesystem-dev libboost-iostreams-dev
3、没有PIC14、PIC16设备
failedfor device/lib/pic14
解决方法:./configure --disable-pic14-port--disable-pic16-port
4、fatal error: zlib.h:
解决方法: sudo apt-get install zlib1g-dev
三、生成文件说明
sourcefile.asm - 由编译器创建的汇编文件
sourcefile.lst - 由汇编器创建的汇编链接文件
sourcefile.rst - 由链接编辑器创建的具有链接信息更新的汇编链接文件
sourcefile.sym - 由汇编器创建的源文件链接标识
sourcefile.rel - 由汇编器产生的目标文件,可以作链接编辑器的输入
sourcefile.map - 由链接器创建的加载模块的内存映射
sourcefile.mem - 带有内存使用情况的文件
sourcefile.ihx - 以Intel hex forma格式的加载模块
四、编译选项
sdcc--code-loc 0x2000 source.c,可以指定程序从0x2000开始存放
sdcc--opt-code-speed source.c,可以让SDCC对代码的运行速度做优化
Sdcc--model-large source.c,可以指定单片机的数据存储模型为large。
sdcc-mmcs51 source.c可以选择目标处理器为MCS51,这个也是SDCC的默认选项,可以不用指定。但是如果要编译STM8单片机的源文件,则要sdcc -mstm8 source.c,指定STM8。为目标处理器。
五、存储类型
1、__data/__near 这个是默认的存储类型,声明变量被分配到8051内存存储器RAM的可直接寻址的地址空间data里。访问此类型变量也是速度最快的
__dataunsigned char value;
2、__xdata/__far 变量被分配到外部存储器RAM(xdata)中去,这个是large数据存储模型单片机的默认地址分配(意思就是如果指定-model-large数据存储模型,定义变量就算不加__xdata,变量也会被自动分配到外部存储器RAM(xdata)中)
__xdataunsigned char value;
3、__idata 这种存储器类型的声明被分配到8051内部存储器RAM的间接寻址空间(idata)
__idataunsigned char value;
4、__pdata 变量被分配到外部存储器RAM(xdata)的前256字节空间去,这个是medium数据存储模型单片机的默认地址分配。
__pdataunsigned char value;
5、__code 变量被分配到代码存储区,这种类型的变量是只读的,常用__code来声明一些常量,比如查表数据等
__codeunsigned char value;
6、__bit 变量被分配到8051存储器的可寻址区域。8051内核有16字节的可寻址RAM(0x20-02F),总共可以提供16x8=128bits寻址位。
__bitvalue;
7、__sfr / __sfr16 / __sfr32 / __sbit 特殊功能寄存器,可以以位、字节和字访问
__sfr__at (0x80) P0 //端口P0
__sbit__at (0x80+1) //端口P0_1
六、绝对地址 通常使用__at来指派一个绝对地址,可以指定一个变量的RAM存储地址
__xdata__ar (0x2000) unsigned char value //指定变量value存放在外部RAM的0x2000到0x2001地址。
__code__at (0x3000) char name[5] = "SDCC";//字符串SDCC存放0x3000的ROM空间
七、指针
__xdataunsigned char * __data p;//内部ram的指针p指向外部ram的数据对象
__dataunsigned char * __xdata p;//外部ram的指针p指向内部ram的数据对象
__xdataunsigned char * __code p;//rom的指针p指向外部ram的数据对象
__codeunsigned char * __code p;//rom的指针p指向rom的数据对象
usignedchar * __xdata p;//位于xdata空间的普通指针
unsignedchar * p;//位于默认存储空间的普通指针
char(* __data fp) (void);//位于data空间的函数指针
八、中断服务例程
void函数名 (void)__interrupt (n) __using(n)
九、使用内嵌汇编代码
第一种:__asm __endasm
第二种:__asm__("inline_assembler_code")