工欲善其事必先利其器,开源SDCC编译器--基本介绍(搬运)
本帖最后由 xujibicool 于 2024-2-24 19:48 编辑开源SDCC编译器--基本介绍
值得收藏:sdcc man阅读笔记
一、文件说明 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 = "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")
6、__bit 变量被分配到8051存储器的可寻址区域。8051内核有16字节的可寻址RAM(0x20-02F),总共可以提供16x8=128bits寻址位。
__bitvalue;
51单片机上测试的结果是个bug,楼主应该去试试
页:
[1]