|
本帖最后由 sunsili 于 2021-12-25 00:28 编辑
【单片机嵌入式开发环境】SDCC使用教程--基础编译选项
1.1 单源文件的编译
假设目前有一个源文件led.c,用来控制开发板做流水灯循环,可以用如下命令进行编译。
$sdcc led.c
编译完之后发现目录下好多生成的编译文件。其中led.rel是类似gcc中的led.o这样用于链接的对象文件,有所不同的是,led.rel中并不包含链接用的汇编代码,它包含在led.lst中。而led.ihx是用来烧写的hex文件,它的格式是intel hex规范。实际用于烧写的文件格式要根据烧写工具来定制,这一点之后再研究。
1.2 多源文件的编译
在另外一个项目中,共有4个源文件。key.c用来控制矩阵键盘,display.c用来操作点阵屏,uart.c用来实现串行通信,而main.c用来统一调用其他源文件里的函数。这几个源文件编译的方法是先将源文件编译成库,然后再统一链接。使用编译选项 -c 表示complier only,只编译不链接。
$sdcc -c key.c
$sdcc -c display.c
$sdcc -c uart.c
$sdcc main.c key.rel display.rel uart.rel
当然也可以将最后一条命令这样做,统一编译成库在写makefile时会更方便。
$sdcc -c main.c
$sdcc main.rel key.rel display.rel uart.rel
1.3 库文件的链接
在上述的项目里,uart.c的其中一个函数用到了crc校验,它的函数原型在另外的crc.lib库文件中,编译的时候要额外链接该库文件。
$sdcc -c uart.c crc.lib
如果库文件不在当前目录要用 -L 选项制定目录
$sdcc -c uart.c -L /usr/crc.lib
将对象文件链接成目标文件,使用sdcclib命令。用sdcclib -s和 sdcclib -m可以查看lib文件的符号表和函数表。
$sdcclib led.lib led.rel
$sdcclib project.lib led.rel display.rel key.rel
二、output file
使用sdcc led.c后发现目录下一大堆编译生成的文件,来看看这些文件都是用来做什么的。
$ls
led.asm led.lst led.rst led.sym led.rel led.map led.mem
2.1 asm文件
由complier创建,是c源码文件编译成汇编后的结果。在分析一些具体问题的时候,可能会需要去查看编译出来的汇编指令。
2.2 lst文件
由assembler创建,我对比了同一个源文件生成的lst文件和asm文件,两者差不多。不同的是lst在行首有每一行的相对地址,而asm则没有,但asm有用标示符来标示一些用于跳转的地址,方便我们查看。
2.3 rst文件
由linker创建,它和lst的文件的区别是,lst行首的相对地址变更成了链接时使用的地址,将一些栈区与堆区的地址加入了文件,使原文件的指令地址发生了偏移。
2.4 sym文件
由assembler创建,该文件包含的是当前源文件的符号表。
2.5 rel文件
由assembler创建,该文件被用于链接。
2.6 map文件
由linker创建,该文件包含有最终生成的目标文件的地址图,标明了所有函数在最终目标文件里的位置,以及是从哪个模块链接过来的。
2.7 mem文件
该文件里显示目标文件运行时RAM和堆栈的使用情况。
2.8 output file 小结
sdcc会生成一大堆output文件。
lst rst rel sym文件用于编译过程,如果编译没有出现问题,可以不用去看这些文件。
asm用于显示源文件的汇编代码,在解决一些优化及疑难问题时要去查看该文件。
map和mem文件可以帮助我们分析该项目对单片机存储资源的占用情况。
|
+10
|