耗时一下午,成功编译.水平过菜,简述心路历程.
前情提要
尝试在单片机跑lua的时候被推送了xmake相关文章.粗略看介绍,感觉挺好的,国人开发,基于lua,功能强大能少装两个软件.留下第一印象.混入项目群里面潜水.
硬件环境: N76E003 1T51内核单片机.官方SDK开发板
宿主环境: windows10 21 LTSC/MAC OS Ventura
软件环境: SDCC4.2.0,xmake 2.7.2
代码很简单,基本文件结构如下.程序功能就是个点灯.
Application/bsp_delay.c bsp_uart.c
Core/main.c main.h sfr.h N76E003.c N76E003.h
Utils/compiler.h
makefile
xmake.lua
恰逢周末夜里无事,遂尝试在mac上构建.安装xmake后,随便建了main.c测试了下,能够自动识别编译链,仅需5秒就能构建了一个简单hello world环境.一瞬间很惊喜.继续尝试构建sdcc环境.提示找不到sdcc.明明就在环境变量,它就是没找到.官网上对sdcc的使用一笔带过.所有下文章似乎只有一篇SDCC+xmake的文章被四处转载,其中对使用的描述不过两行.此时也已经深了,睡觉
恰逢周末夜里无事,想起xmake遂掏出macbook尝试下.安装很简单,不赘述.初步尝试个helloworld,很惊喜,能够自动识别到mac上的gcc环境,完全没有配置任何参数即可创建简单的helloworld.
尝试sdcc,使用上面所述工程,提示找不到sdcc编译链.它明明就在那里,就在环境变量里.看来还不是那么傻瓜式,还是得去官网看文档.官网只有寥寥几行关于sdcc的描述,约等于没有,不想通读全部文档.尝试网络上找大佬文章.似乎只有一篇文章但是被转载到各处的SDCC+xmake文章.其中描述也少的可怜.拉倒,不搞了.
周一匆匆忙碌一上午工作.下午摸鱼尝试windows安装xmake.编译windows端命令行程序依旧毫无问题.尝试构建sdcc工程.
xmake f --menu
尝试图形化构建工程,未找到sdcc相关配置选项.fail
只好老老实实手动在工程根目录创建xmake.lua
文件,初次内容如下:
target("code")
set_kind("binary")
add_files("Application/*.c")
add_files("Core/*.c")
add_includedirs("Middlewares/Utils")
add_includedirs("Core")
也没啥好详细说的,基本上看名字就知道干啥的.
配置交叉编译环境
通过唯一找到的一篇文章中提到的唯一一条命令即
xmake f -p cross --toolchain=sdcc -a mcs51 --sdk="c:\program files\sdcc"
-p cross
: 指定此为交叉编译环境--toolchain=sdcc
: 指定此环境使用编译链为sdcc-a mcs51
: 指定平台.stm8的话需要改下这里--sdk=xxx
: 指定sdcc的安装路径.之前mac上报错就是没指定这个路径(即使环境变量有也得指定).xmake/
此后键入xmake
即能够看到编译成功信息
[ 14%]: cache compiling.release Application\bsp_delay.c
[ 14%]: cache compiling.release Application\bsp_uart.c
[ 14%]: cache compiling.release Core\main.c
[ 14%]: cache compiling.release Core\N76E003.c
[ 71%]: linking.release code.ihx
[100%]: build ok!
在工程目录/Build/code/cross/mcs51
下将会看到生成的bin文件.先不要高兴.首先这个bin文件并不是真bin,而应该是ihx文件.因为sdcc默认输出就是ihx,这里是xmake配置的后缀有问题.为了防止错误的将此假bin文件直接下载至mcu需要修改下配置.
修改输出文件后缀:
修改C:\Program Files\xmake\toolchains\sdcc\xmake.lua
中的set_formats("binary", "$(name).ihx")
即可.
仔细观察可以发现输出ihx文件并不符合预期这是因为没有给sdcc传入相关的编译参数和链接参数.
修改xmake.lua
增加两行参数.
add_cxflags("--model-small ...")
add_ldflags("--code-size 18432 --iram-size 256 --xram-size 768 ...")
没有找到定义和引用变量的说明,因此这里codesize等参数都直接写死,不过也没啥事,毕竟除非换芯片不然不会经常改动.
执行xmake clean
清除上次编译的中间文件(删不干净,会剩下一坨空文件夹和几个文件).使用xmake -r -v
命令编译,会输出中间指令,能够看到已经如实的传递了正确的编译参数和链接参数.
和通过makefile编译出的ihx文件对比,两者完全一致,至此基本成功.
一般的,生成ihx后还会进行一些操作,比如生成hex或者bin文件等.可以通过after_build
函数在编译后执行一些操作.这里我先尝试通过packihx来生成hex文件.翻了官方文档也没找见最终输出文件的目录变量.默认的输出目录有点深.
set_targetdir("/Build")
after_build(function (target)
os.exec("packihx Build/code.ihx > Build/code.hex")
end)
通过set_targetdir("/Build")
将code.ihx等最终文件输出到/Build/
目录内.
执行函数这里有两个os.exec
和os.run
.run是静默执行,只会输出错误消息.调试中推荐先用exec,搞定了再换成run来执行.编译可以看到packihx输出,没有报错,但是实际在/Build
目录内没有生成code.hex文件.这里我没有搞定,蹲个大佬来…
packihx失败了,暂时注释掉,换一条脚本来试试.最终xmake及make输出效果如下:
# xmake
> xmake
[ 14%]: cache compiling.release Application\bsp_delay.c
[ 14%]: cache compiling.release Application\bsp_uart.c
[ 14%]: cache compiling.release Core\main.c
[ 14%]: cache compiling.release Core\N76E003.c
[ 71%]: linking.release code.ihx
Name Start End Size Max Spare
---------------- ------ ------ ----- ----- -----------
REG BANKS 0x0000 0x0007 1 4 3
IDATA 0x0000 0x005E 95 256 161
OVERLAYS 4
STACK 0x005F 0x00FF 161 248 161
EXTERNAL RAM 0 0 0 768 768 100.0% free
ROM/EPROM/FLASH 0x0000 0x073e 1855 18432 16577 89.9% free
[100%]: build ok!
# make
> make
build Application/bsp_delay.c
build Application/bsp_uart.c
build Core/main.c
build Core/N76E003.c
create Build/Code.ihx
create Build/Code.hex
packihx: read 70 lines, wrote 124: OK.
Name Start End Size Max Spare
---------------- ------ ------ ----- ----- -----------
REG BANKS 0x0000 0x0007 1 4 3
IDATA 0x0000 0x005E 95 256 161
OVERLAYS 4
STACK 0x005F 0x00FF 161 248 161
EXTERNAL RAM 0 0 0 768 768 100.0% free
ROM/EPROM/FLASH 0x0000 0x073e 1855 18432 16577 89.9% free
可见,xmake和make输出结果一致.
这里提供一个sdcc+xmake开发环境的简单描述,希望对有需要的朋友有用.
整体而言,xmake软件体积不大,有一些很好用的自动化功能,能够减少一些工作量.但是对于单片机开发来说,有些大炮打蚊子.
相对而言,推荐至少RTOS/Linux嵌入式项目架构使用,才能真正体现性能与易用性.
当然,我仅仅尝试并使用了一下午,甚至官网文档都没读全,可能有更高大上更好用的功能还没有发现.