良许Linux教程网 干货合集 单片机加入版本信息的常见方法

单片机加入版本信息的常见方法

我们公司的产品会根据客户的需求和建议进行定期升级,包括优化bug和增加或删除功能。因此,软件版本变得非常重要。

你们在开发项目中是否在软件中添加了版本信息呢?最近我看到一些人在讨论相关问题,所以我想简单分享一下。

其实,有很多方法可以实现这个功能,但基本原理都是将软件版本信息写入到指定的存储区域(例如Flash)中。我将介绍其中一种比较常见的方法。

实现方法

在本文中,我将分享一种常用且基础的小技巧,它适用于在Keil MDK环境中通过软件代码直接将信息映射到并存储在Flash的指定地址。

代码示例包括软件版本、编译日期和编译时间,如下所示:

#define VERINFO_ADDR_BASE   (0x0800FF00) //存放FLASH的地址

const char Software_Ver[] __attribute__((at(VERINFO_ADDR_BASE + 0x00)))  = "Software: 1.0.0";
const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;

这个代码大家能看懂么?

原理很简单,也有类似其他写入Flash地址的方法(这里暂不讲述)。

这里面包含几个重要知识点,下面给大家描述一下。

attribute 语法

attribute,翻译为“属性”,在C语言中,是一个关键字,语法格式为:

__attribute__ ((attribute-list))

attribute 可以设置函数属性(Function Attribute )、变量属性(Variable Attribute )和类型属性(Type Attribute )。

这部分内容,大家可以不用深入理解,知道这么用即可。要深入理解,网上也有很多学习资源。

C语言标准定义

在代码中:

const char Compiler_Date[] __attribute__((at(VERINFO_ADDR_BASE + 0x40))) = "Date: "__DATE__;
const char Compiler_Time[] __attribute__((at(VERINFO_ADDR_BASE + 0x60))) = "Time: "__TIME__;

你会看到__DATE__ 和 __TIME__表示的日期和时间。

其实,这两个是C语言特殊的标准定义。

**DATE**:编译时刻的日期字符串 如“Apr 13 2021”

**TIME**:编译时刻的时间字符串 如”20:00:00“

除了这两个,其实还有很多类似的标准定义,比如:

FILE :正在编译文件的文件名

LINE :正在编译文件的行号

**STDC**:判断该文件是不是标准C程序

这部分内容,可以参看我的文章:**C语言几种特殊标准定义和用法**

**【总是编译*】*版本文件

在Keil MDK中,默认情况下,源文件不修改,只编译一次。

因此,为了编译版本、日期和时间正确,需要进行设置:总是编译

如下设置:

image-20231022221751571
image-20231022221751571

固件大小

生成的Hex文件会对没有使用的Falsh用0x00进行填充,比如:

image-20231022221754792
image-20231022221754792

填充0x00之后,这个hex就相对很大,因此,有两种方法减少hex固件大小。

1.存放FLASH的地址,要设置在合适的位置,如果代码量只有1K,你这只在偏移50K地址,这样偏移太多。

#define VERINFO_ADDR_BASE   (0x0800FF00) //存放FLASH的地址

2.网上还有一个方法,修改“ROM大小”:

image-20231022221758402
image-20231022221758402

该小之后,发现真的把0x00去掉了:

image-20231022221801717
image-20231022221801717

这两种方法,其实有一定风险的,如果代码量不断增加,可能会出现问题。所以,大家要主要设置Flash地址。

这里其实也有一个关于Hex文件格式的内容,推荐阅读文章:轻松理解bin、hex、axf和elf文件格式

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部