还在手动把固件重命名而后拷来拷去吗,你须要了解这个

一.前言

前面几篇文章写了一下关于cmake改造嵌入式编程的体验,点击查看
摆脱MDK,用cmake改造嵌入式软件开发体验
用IDE配置并运行cmake工程
读者反响不错,至今已有3个赞了,给了我很大的鼓舞(手动滑稽),今天就来分享一下嵌入式开发中最重要的环节,固件发布,毕竟,程序写的再溜,不出固件,老板拿什么卖钱嘛.python

二.普通作法

首先说明一下通常你们作嵌入式发布程序的通常流程:程序猿在MDK编好固件以后,在工程目录的build的文件夹会产生编译出来的hex文件,以下图:
image.png
而后程序猿就把固件拷贝到一个新建的文件夹,从新命个名(由于mdk里生成的固件名称是固定的),通常是写上产品名称,版本号啊而后有一些特殊的定义也会加上(好比什么至尊版,增强版,普通版之类的区分同一产品的不一样价位或者功能),再编写一个changlist或者版本记录,而后把版本记录也拷贝一份到文件夹内,而后再压缩发给测试人员或者生产负责人.shell

二.高级作法1.0

高级作法是编写一个脚本,好比python脚本或者bat(shell)脚本,在脚本里面执行一些拷贝或者某些系统命令,好比nrf52832带sdk的程序就须要把sdk合并到最终的hex文件里去.
好比这样:
image.png
这种方式比手动修改就要高级一些,咱们称为高级1.0,可是这种作法有一个弊端,无法根据固件编译时的参数去定制固件的名称,却是有一个方法,在build文件夹下有一个.dep文件能够利用python脚本去解析里面的特定字符,好比:
image.png
好比我须要知道固件编译的时候有没有定义TIANYI这个宏,能够这样写:
image.png
这样的话能够作到针对某个编译参数生成特定名称的固件,能够算是一个提升吧,用MDK的话就能够采起这种方式编程

三.高级方法2.0

高级作法2.0是高级作法1.0的升级版,前提是须要搭建好cmake的编译环境,闲话少说,上法宝:
image.png
这段代码是cmake里面添加编译期间定义的语句,结合前面的cmake环境搭建教程,结合语句按字面意思应该不难理解,首先咱们定义了这么一些编译参数,而后咱们把全部的编译参数获取出来,造成一个叫defs的数组(cmake语法里的数组类型,这里不用理解这个数组到底怎么存储的)
在cmake里面添加一个目标,叫作merge,名字能够随便取:
image.png
这段代码能够理解为:若是我须要产生一个merge的目标,就调用后面的cmd命令行语句,这个语句的做用是用python来启动一个脚本,启动脚本的时候会带上相应的参数,这个参数就是咱们提取出来的defs,而后在python脚本里面把参数打印出来会是这样会是这样:
image.png
image.png
看到没有,刚刚咱们定义的宏定义在python文件里面获取到了,可是有一点不太好,好比咱们cmake文件里面SOFT_VER=809,在python里面也是这样子显示的,不利于咱们把真实的数据提取出来,没事,python这么先进的语言,这还不是小事一桩,盘他:
image.png
如上图所示,咱们花分把钟(专业人员,请勿羡慕)把解析函数写出来,造成一个字典(dict,python的一种数据结构):
image.png
字典是一种键值对的数据结构,能够理解成不用数字作下标的数组,可是python的类型很灵活,不理解的同窗能够研究一下python
接下来的事就太简单了,咱们只须要把字典的键和值分别取出来就好了,对于有的参数,没有值的说明我们不须要他的值,看图:
image.png
这样的操做就把以前咱们复杂的须要把.dep文件打开而后一行一行的找对应的宏有没有来的简便,并且效率也更高(不须要读文件了)
你觉得到这就完事了,错,接下来咱们还有合并固件,而后把全部相关文件压缩成压缩包,单独存储,而你只须要点一个按钮
好比个人工程里,除了要把hex生成出来,还要生成一个用于ota升级的固件包,同时编译的源hex也要保存,以方便追溯问题,请上眼:
image.png
对,就是这么短短的几行语句,你以前须要花好几分钟还不必定不出错的步骤,咱们用几行脚本语句就实现了,接下来就是运行脚本了,怎么运行:
打开cmd命令行,输入:
`
cmake --build .build --target merge
`
就等着电脑帮你打包吧,若是还想简单一点,qtcreater,clion,包括mdk都有一个外部工具能够建立,建立完以后点击运行就ok了:
这是clion的
image.png
这是qtcreater的
image.png
这是mdk的
image.pngjson

---------19-12-10更新-----------segmentfault

四.高级版MDK版

最近发现MDK一样能够作到clion或者qtcreater一样的高级方法,共享以下,本质上仍是运用python脚本,python真的能够作好多事情,配置如图:
image.png
很简单,就是调用python去执行merge.py脚本,那么如何实现获取编译的时候定义的各类参数呢,一种方法是上面讲的读取.dep文件,这是最简单高效的,另外附上高级用法:
1).高级获取宏定义方法一
mdk编译的时候有一个选项是misc_ctrl,如图,在这里加上一行:
--via defines.opt
image.png
而后在工程目录下建立一个defines.opt文件,用文本编辑器打开,填入形如-DSOFTVERSION=101 -DUSE_UART这样的宏定义就行,例如:
image.png
那这个文件起什么做用呢,用过MAKEFILE的童鞋可能反应过来了,由于makefile里面就是这样的语法,这个文件这样写的做用跟编译的时候指定的宏定义效果是同样的,好比这样:
image.png
同窗们能够实验一下,用这个文件编译的话在程序里面定义-D以后的变量能够读取到,那既然有文件就好办了,用python解析一下文件不就造成了定义字典了吗,好比:
image.png
仍是熟悉的正则,仍是熟悉的py,换汤不换药,这里注意一下里面有个re.sub函数,这个函数是替换'""这样的字符的由于opt文件的语法缘由直接定义某个字符串会致使程序没法正确识别,必须用''把""里面的内容括起来才能让程序识别成字符串.
后面的事情就清楚了,跟高级版3.0同样,固件打包神马的都同样,愿意研究的同窗自行研究就行
2).高级获取宏定义方法二
这种方法要用到xml文件解析,咱们都知道每一个MDK项目都是由一个.uvprojx文件管理的(mdk四是.uvproj),咱们尝试用文本编辑器看一下里面是什么:
image.png
喔吼吼,这不就是xml文件嘛,再看看里面有什么具体内容:
image.png
哦吼吼吼,怎么这么眼熟呢,原来,咱们在编辑器上宏定义的东西都在这里,看这里:
image.png
理解不了的同窗本身把宏定义改几个而后编译一下或者退出mdk而后从新打开就能看到效果了
嗯,接下来还不是py一把梭:
image.png
这段代码也很简单,无非就是打开xml文件,而后读取tag,attr和text,不熟悉XML文件的同窗自行百度一下就知道了,比json难不到哪去,
利用python咱们仍是很容易的就得到了咱们定义的宏定义,接下来的事就不用多说了,不过值得一提的是,若是在这种方法定义的宏包含字符串的话须要处理一下,好比:
PRODUCT="S350N",不用像opt文件那样用单引号包起来,可是程序里面要使用的话得这样:
image.png
也不是很难理解,具体为何我就不讲了,同窗们照着个人葫芦能画出来瓢就行.数组

以上就是更新的内容,最近发现MDk也不是那么的烂,仍是算比较灵活的,后面一篇搞几个MDK高级操做,列位看官请上眼.数据结构

五.总结

目前,关于固件生成的批量化就简单研究到这里了,若是同窗们还有什么需求能够一块儿探讨.文章有错误在所不免,欢迎指正.编辑器

相关文章
相关标签/搜索