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

前情提要

尝试在单片机跑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.ihxName              Start    End  Size   Max Spare---------------- ------ ------ ----- ----- -----------REG BANKS        0x0000 0x0007     1     4     3IDATA            0x0000 0x005E    95   256   161OVERLAYS                           4STACK            0x005F 0x00FF   161   248   161EXTERNAL RAM           0     0     0   768   768 100.0% freeROM/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     3IDATA            0x0000 0x005E    95   256   161OVERLAYS                           4STACK            0x005F 0x00FF   161   248   161EXTERNAL RAM           0     0     0   768   768 100.0% freeROM/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嵌入式项目架构使用,才能真正体现性能与易用性.

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

SDCC+xmake环境尝试单片机N76E003点灯相关推荐

  1. 单片机入门学习笔记6:新唐单片机N76E003

    学习新唐单片机是从2018年3月开始的,之前一点也不懂这一块单片机,之后脉络变的越来越清晰. 由于N76E003档次太低,新塘科技官方的管脚配置,芯片选型--都没有这一块芯片,资料唯独只有:芯片的数据 ...

  2. 英飞凌TC265双核单片机入门——点灯和发CAN(FD)报文

    本文记录和总结了我初步学习英飞凌TC265这款单片机的过程,主要有以下内容: 1.如何新建一个工程并使用英飞凌的iLLD底层驱动库: 2.点亮一个LED灯(Ports的使用): 3.发送CAN(FD) ...

  3. 51单片机(一)软硬件环境和单片机介绍

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分:建议先学习51单片机,其是STM32等高级单片机的基础:这样再学习STM32时才能融会贯通. ☀️ 专栏适 ...

  4. 单片机“花式点灯”实现方法

    关注+星标公众号,不错过精彩内容 作者 | strongerHuang 微信公众号 | strongerHuang 有初学者问了这样的问题:单片机真正开发产品和学习的时候有什么差别,平时学的LED.A ...

  5. 基于51单片机N76E003无线遥控器系统设计(毕设课设)

    51内核新唐N76E003六通道遥控器,支持双向通讯,支持电压采集回传,低电量报警.设备失联报警.设备低电量报警.OLED显示屏UI显示.手动对频配对等,功能全面,测试稳定.可用于无人机.船.小车.机 ...

  6. 51单片机LED点灯实验(闪烁,点亮,流水灯)

    led点亮 工作原理 如图,二极管阳极连接电阻,二极管阴极连接单片机引脚.D0对应P20,D1对应P21,,,,,,,都通过P2孔进行控制. 二极管: 电源正极连接到二极管阳极,负极连接到阴极,二极管 ...

  7. 单片机 N76E003 EC12 编码器

    文章目录 一.简介 二.特性 三.示例代码 四.其他 一.简介 两定位一脉冲的EC11稍微复杂一些,转动一格只会输出半个脉冲.静止时,AB触点开关可以是断开的也可以是闭合的. 若初始状态时AB都是高电 ...

  8. idata 单片机 新唐_请教新唐单片机N76E003内存空间不足的问题

    今天编译程序发现一个奇怪的问题,怎么使用中内存单元只有不到130个字节? 具体如下: 程序定义如下:#define        RECEIVE_BUFFER_SIZE 13 UINT8  Uart_ ...

  9. linux 8051 编译,[编译] 3、在Linux下搭建51单片机的开发烧写环境(makefile版)

    星期二, 10. 七月 2018 01:01上午 - beautifulzzzz 一.SDCC(Small Device C Compiler)编译环境搭建 SDCC是一个小型设备的C语言编译器,该编 ...

最新文章

  1. 基于 Prometheus 的监控系统实践
  2. mockito_Mockito 101
  3. java aio复制文件_java复制文件的4种方式及拷贝文件到另一个目录下的实例代码...
  4. 对上拉下拉电阻的作用作个总结(想了解的过来看看)(转载)
  5. 【LeetCode - 141142】环形链表(i和ii)(快慢指针,链表)
  6. 再谈Windows 2000安全技术
  7. 只存活了9天,谷歌AI伦理委员会解散了:严重低估员工的战斗力
  8. 深信服防火墙console波特率_乾颐盾之深信服防火墙------初始化教程
  9. 【数据结构笔记32】排序算法概述、简单排序(冒泡排序、插入排序)、逆序对
  10. .NET Framework 4.5 ZipArchive类压缩解压
  11. 电视动态测试软件,[4K演示] 你的电视能顶得住吗?精神污染MAX的SONY4K动态测试......
  12. THREE.JS中常用的3种材质
  13. 第一章 数字图像基础知识(图像的空间分辨率和幅度分辨率)
  14. vue如何跳转支付宝付款页面
  15. 计算机文件夹知识心得体会,计算机基础学习心得体会范文(通用3篇)
  16. Python入门第3课——变量类型(只读课堂)
  17. 苹果再推7寸超级iPhone7,iPad何去何从?
  18. 自动回复的三种形式?
  19. linux安装firefox
  20. React技术栈探究-Redux

热门文章

  1. rfcn 共享_LTE无线频谱划分及RFCN
  2. 【软件工程】常见的几种软件过程模型的比较
  3. 【学员专访】欧美卡通狂热模型师-周国超
  4. springboot 生成pdf文档
  5. 用Julia调用SCIP
  6. ArcScene三维漫游
  7. python调整图片大小,png,jpg均使用
  8. 基于newmark-beta逐步积分法计算移动力过梁问题
  9. 量化风格:风格短期切换,关注反转与估值(20210106).PDF
  10. Win7系统修改WebFreer主页