当前位置: 首页 > 工具软件 > SDCC > 使用案例 >

SDCC+xmake环境尝试单片机N76E003点灯

丁高峯
2023-12-01

耗时一下午,成功编译.水平过菜,简述心路历程.

前情提要

尝试在单片机跑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初试

恰逢周末夜里无事,遂尝试在mac上构建.安装xmake后,随便建了main.c测试了下,能够自动识别编译链,仅需5秒就能构建了一个简单hello world环境.一瞬间很惊喜.继续尝试构建sdcc环境.提示找不到sdcc.明明就在环境变量,它就是没找到.官网上对sdcc的使用一笔带过.所有下文章似乎只有一篇SDCC+xmake的文章被四处转载,其中对使用的描述不过两行.此时也已经深了,睡觉

恰逢周末夜里无事,想起xmake遂掏出macbook尝试下.安装很简单,不赘述.初步尝试个helloworld,很惊喜,能够自动识别到mac上的gcc环境,完全没有配置任何参数即可创建简单的helloworld.
尝试sdcc,使用上面所述工程,提示找不到sdcc编译链.它明明就在那里,就在环境变量里.看来还不是那么傻瓜式,还是得去官网看文档.官网只有寥寥几行关于sdcc的描述,约等于没有,不想通读全部文档.尝试网络上找大佬文章.似乎只有一篇文章但是被转载到各处的SDCC+xmake文章.其中描述也少的可怜.拉倒,不搞了.

Win再试

周一匆匆忙碌一上午工作.下午摸鱼尝试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.execos.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软件体积不大,有一些很好用的自动化功能,能够减少一些工作量.但是对于单片机开发来说,有些大炮打蚊子.

  • 安装上,对于windows端,均需要预先安装sdcc.然后安装xmake或者mingw(make).没多少差异.
  • 功能上,单片机环境,可能xmake功能的10%都用不上,真正精华的比如包管理什么的基本用不上.
  • 开发上,语法相对makefile要简单不少,就是目前用户比较少,尽管有中文手册但是感觉很乱而且有些函数参数啥的我没有在官网找到说明.学习成本会低一些,不过也只是略低,毕竟单片机环境一共就那么几个文件.

相对而言,推荐至少RTOS/Linux嵌入式项目架构使用,才能真正体现性能与易用性.

当然,我仅仅尝试并使用了一下午,甚至官网文档都没读全,可能有更高大上更好用的功能还没有发现.

 类似资料: