1 前言

开发完 MCU 软件后,通常都会生成 hex 文件或者 bin 文件,用来做固件烧录或者升级,如果用来做产品开发,就涉及到固件版本的问题,初学者通常采用固件文件重命名来区分版本。

如果需要将版本写入固件中,就需要通过一定的方式去实现,实现的方式有很多。

2 介绍

下面介绍一个自动打包固件的脚本软件,主要实现以下功能:

  • 基于 Windows 平台的单片机 MCU 固件脚本打包工具
  • 支持 hex 文件的裁剪和 hex 文件的合并
  • 可以为 hex 固件添加版本信息、Git Commit 分支和提交记录等
  • 按照版本信息命名hex固件,可生成 bin 文件等
  • 以上均可通过 ini 配置文件设置参数对 hex 文件进行操作

3 实现步骤

下面以 MDK + STM32 开发为例介绍。

3.1 __attribute__机制

首先了解一下__attribute__机制,它是个编译器指令,告诉编译器声明的特性,或者让编译器进行更多的错误检查和高级优化。
GUN C中可以使用__attribute__()给变量、函数和类型设置各种属性,而__attribute__的section选项可以改变段的特性;

其中__attribute__((section("section_name")))的作用是将该定义的函数或数据变量放入指定名为”section_name”段中。

无论是 GNU 还是 ARM 的编译器, 都支持__attribute__所指定的编译属性。

打开keil的options…,取消勾选下图所示,然后点击“Edit…”。

自动弹出“*.sct”文件(先编译通过再操作),下面就是 Keil 中 STM32 的链接文件,编译器会根据链接文件和__attribute__的section选项(可以自己添加一个段,分配地址和大小)等分配函数和数据变量在程序固件中的地址。

; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************LR_IROM1 0x08000000 0x00010000  {    ; load region size_regionER_IROM1 0x08000000 0x00010000  {  ; load address = execution address*.o (RESET, +First)*(InRoot$$Sections).ANY (+RO).ANY (+XO)}RW_IRAM1 0x20000000 0x00005000  {  ; RW data.ANY (+RW +ZI)}
}

这里不做过多介绍了,下面介绍的方式不需要自己修改“*.sct”文件,还是采用__attribute__的section选项,只不过在section选项中指定位置即可。

__attribute__ ((section(".ARM.__at_0x08000020")))

3.2 代码实现

1. 定义一个结构体,里面定义一些软件版本相关的信息

typedef struct
{char szVersion[32];    // 软件版本char szBuildDate[32];  // 程序编译日期char szBuildTime[32];  // 程序编译时间char szCommitId[32];  // git commit id
}AppInfo_t;

2. 通过__attribute__定义一个只读结构体变量(只读的目的:防止程序改变、节约RAM),赋初值(其中__DATE___TIME__是C语言中的内置宏,分别是当前的编译日期和编译时间)。

const AppInfo_t __attribute__ ((section(".ARM.__at_0x08002000"))) sg_tAppInfo =
{"STM32_TEST",__DATE__,__TIME__,""
};

注:STM32的代码起始地址是从0x08000000开始的,且存储中断向量表信息,因此在选择程序地址的时候一定要绕开,也不能太靠后,不然生成的bin文件超出了实际的代码固件大小,在实现bin文件升级的时候就会耗时太长。

3. 通过串口打印出来

int main(void)
{FML_USART_Init();USART_Printf(0, "Version  : %s\r\n", sg_tAppInfo.szVersion);USART_Printf(0, "buildTime: %s\r\n", sg_tAppInfo.szBuildDate);USART_Printf(0, "buildTime: %s\r\n", sg_tAppInfo.szBuildTime);USART_Printf(0, "commitId: %s\r\n\r\n", sg_tAppInfo.szCommitId);while(1);}

4. 提交git编译后,可以看的 git commit id 值(通过 git commit 可以迅速定位是什么时候的源码进行编译的)

3.3 固件打包

下载固件打包脚本,根据配置设置后,双击 bat 即可完成固件打包,然后点击下载验证即可。

需要通过 J-LINK 工具包或者 ST-Link 工具打开生成的固件进行烧录(通过Keil编译直接下载的没有用,我这里用的是 ST-Link 工具)。

4 配置文件内容

下面列举配置文件中的选项

; 文中的路径可采用绝对路径或者相对路径(相对于固件打包bat文件而言)
; 版本信息 Flash 起始地址 预留大小 前缀字符串
[version]
addr=0x08002000
size=32
strPrefix=; Git 信息 Flash 起始地址 预留大小
[git_commit]
addr=0x08002060
size=32[boot_file]
; Boot Hex 文件路径 文件名称
hexFilePath=.\
hexFileName=test_boot[file]
; Hex 文件路径 文件名称
hexFilePath=.\
hexFileName=test; 裁剪起始地址 保留大小
hexFileAddr=0x08000000
hexFileSize=0xFFFF; 打包文件的输出路径
outputPath=.\output[option]
; 是否合并boot固件
isMergeBootHexFile=0; 是否生成 Bin 文件
isGenerateBin=1; 是否裁剪 Hex 文件,根据(hexFileAddr hexFileSize)
isCropHexFile=1; 是否添加 Git Commit 信息
isAddGitCommit=0; 打包成功后是否清除临时文件
isClearTmpFile=1

5 下载地址

MCU固件打包脚本https://gitee.com/const-zpc/mcu-pack-script

单片机 MCU 固件打包脚本软件相关推荐

  1. 单片机MCU软硬件联调基本方法

    做MCU软件开发,离不开硬件,软硬件调试的技能也是必须掌握的,现在介绍一些软硬件联调的基本方法. 软硬件联调常使用的方法有 :分支思想.分层法.对比法.这些方法不是只属于软硬件联调可用,在软件开发过程 ...

  2. ADAS处理器集成功能安全单片机MCU

    ADAS处理器集成功能安全单片机MCU ADAS processors integrate functional safety MCU 拉斯维加斯-德州仪器公司引进了ADAS和网关处理器TDA4VM和 ...

  3. 机械臂——arduino、marlin固件、printrun软件

    最近了解到,在市面上大多数机械臂控制都采用的arduino这个开源硬件来控制的,而我发现既然会单片机,就没有必要采用arduino来控制了,arduino只是一种为了简化编程而开发一种软硬件控制平台, ...

  4. iOS 两套自动打包脚本

    黑客技术点击右侧关注,了解黑客的世界! Java开发进阶点击右侧关注,掌握进阶之路! Linux编程点击右侧关注,免费入门到精通! 作者 | Hsusue  https://juejin.im/pos ...

  5. Innosetup打包脚本常用设置大全

    文章目录 Innosetup脚本框架 指定安装包的各种属性 设置应用的开机启动 修改注册表 安装包的初始化操作 生成桌面快捷方式 调用动态库函数 Innosetup是一款常用的打包软件,可以用来制作w ...

  6. Inno Setup 打包脚本笔记

    Inno Setup 打包脚本总结 1.1. 脚本段 1.1.1. #define宏定义常量 1.1.2. [Setup] 1.1.3. AppId 1.1.3.1. ShowLanguageDial ...

  7. 02 嵌入式/单片机/MCU众包接单平台有哪些?

    嵌入式/单片机/MCU众包接单平台有哪些? 作者 将狼才鲸 创建日期 2023-02-11 CSDN文章地址:嵌入式/单片机/MCU众包接单平台有哪些? 一直想找到靠谱的嵌入式.单片机接单平台,网上搜 ...

  8. cocos2dx3.8 android打包脚本编写

    cocos集成了打包命令 cocos compile -p android 在这里并没有采用这个方案,而是编写自己的脚本, 理由如下 脚本掌握在自己手中可以第一时间解决和发现bug 游戏项目总会出现各 ...

  9. ST单片机使用ST Visual Programmer软件烧录程序简易教程

    文章原始地址: http://feotech.com/?p=100 ST单片机使用ST Visual Programmer软件烧录程序简易教程 ST Visual Programmer 是ST公司为自 ...

最新文章

  1. .NET平台开源项目速览(11)KwCombinatorics排列组合使用案例(1)
  2. 概率统计:第四章 随机变量的数字特征
  3. 使用MEF构建可扩展的Silverlight应用
  4. 我的世界java版记分板_我的世界计分板教程 计分板指令详解
  5. 服务器:浅谈 Nginx 性能调优,太实用了!
  6. 那么您想做微服务吗? 请观看微服务以防万一
  7. [渝粤教育] 中国地质大学 马克思主义基本原理 复习题
  8. Oracle Database Administrator验证模式
  9. Epic Games 携精彩作品强势登录 GMGC 2016
  10. LINUX之samba服务器的安装与配置(基于redhat 6.3发行版)
  11. 免费的SQL Server监控工具
  12. 天线基础知识(四)接收灵敏度
  13. 调用百度地图进行路线规划
  14. UE4中3DUI防遮挡显示/穿模部分透明化显示
  15. 微软内部泄露的 XP的KEY和无限次激活码
  16. Element-UI学习之旅-Layout布局
  17. 打印和显示的字体种类
  18. 计算机系统基础学习笔记(7)-缓冲区溢出攻击实验
  19. 上海房产中介面临倒闭潮
  20. java导出excel 提示文件格式或文件扩展名有误

热门文章

  1. 买iPad2 3G还是买iPhone 4S?
  2. css字体倾斜角度_字体倾斜怎么变正
  3. 墨者学院-安卓手机文件分析取证(陌陌ID号)
  4. arcgis界址点排序
  5. compilation terminated.
  6. php框架静音箱,【产品简介】be quiet!DARK BASE PRO 900 rev.2静音机箱
  7. Android wait/notify
  8. C++关键字override
  9. Redash案例之—党建
  10. 【牛客刷题】游戏行业通识(更新中)