谷动谷力

标题: 【单片机嵌入式开发环境】SDCC使用教程--基础编译选项 [打印本页]

作者: sunsili    时间: 2021-11-4 00:14
标题: 【单片机嵌入式开发环境】SDCC使用教程--基础编译选项
本帖最后由 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文件可以帮助我们分析该项目对单片机存储资源的占用情况。





欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2