众寻他千百度,得来全不费工夫! 寻寻觅觅的找了一个月,结果Sir里的兄弟一句话就搞定了——SDCC
话说SDCC是Linux下的开源编译器, 可以用于编译嵌入式系统的代码哦。粗略的看了一下,ARM和PIC、AVR都可以,最重要的是MSC-51系列的也可以。ARM和AVR、PIC在Linux下本来就有很多,不过51的貌似我就发现了这一个。
来看看怎么用SDCC
单个文件
只有一个源代码文件的话,只需执行 sdcc foo.c 命令,就可将源代码编译成符合intel hex格式的代码了。
期间sdcc会产生下列的输出文件:
- foo.asm 汇编代码,由编译器创建
- foo.lst 汇编列表文件,由汇编器创建
- foo.rst 更新过的列表文件,由链接器创建
- foo.sym 符号列表文件,由汇编器创建
- foo.rel/foo.o 就是obj文件
- foo.map 内存映射文件
- foo.mem 内存使用统计文件
- foo.ihx intel hex格式的代码
如果使用了调试模式,还会有:
- foo.adb 用于创建.cdb文件的含有调试信息的中间文件
- foo.cdb 用于调试的文件,有一个专门的文档讲这种文件的格式
- foo. Absolute Object Module Format(AOMF)文件
- foo.dump 用于调试编译器本身的dump文件
多文件工程
假设main函数在foomain.c中,另外还有foo1.c和foo2.c,那么可以这样编译:
sdcc -c foo1.c
sdcc -c foo2.c
sdcc foomain.c foo1.rel foo2.rel
第三条命令也可以换成下面的两条命令:
sdcc -c foomain.c
sdcc foomain.rel foo1.rel foo2.rel
如果是写成后面这种形式,最后一条命令中的第一个rel文件必须包含main函数
ihx文件的后处理
.ihx文件不能直接用于miniICP的输入往LPC900里面烧,要经过一步处理:
pachihx foo.ihx > foo.hex
这样foo.hex就可以拿去烧了
使用lib库
如果要用到标准库之外的lib库,可以写这样的命令:
sdcc foomain.c foolib.lib -L mylib
-L选项指定库的搜索路径,可以是相对路径,也可以是绝对路径
sdcc的lib文件都是纯文本,自带的标准库的内容是相关rel文件的列表
用sdcclib做出来的lib是一种带标签的纯文本
用sdcclib制作库
假设一个库libfoo.lib包括libfoo1.c和libfoo2.c两个源代码文件,可以这样来生成libfoo.lib:
sdcc -c libfoo1.c
sdcc -c libfoo2.c
sdcclib libfoo.lib libfoo1.rel
sdcclib libfoo.lib libfoo2.rel
这样得到libfoo.lib以后,还可以用
sdcclib -s libfoo.lib
查看库中包含的符号,或者用
sdcclib -m libfoo.lib
查看库中包含的rel文件的名字