单片机固件中加入版本信息的方式有哪些?-1

描述

前言

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

如果需要每次上电开机通过串口或者OLED等显示版本信息,那么这种方式就无法实现

下面介绍如何在程序中加入版本信息,以MDK为例介绍。

实现方式

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

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

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

const AppInfo_t sg_tAppInfo =
{
    "STM32_V0.1.5",
    __DATE__,
    __TIME__,
};

3.在主函数添加打印,将版本信息输出到终端上。

int main(void)
{
    SystemInit();

    printf("Version  : %s\\r\\n", sg_tAppInfo.szVersion);
    printf("buildTime: %s\\r\\n", sg_tAppInfo.szBuildDate);
    printf("buildTime: %s\\r\\n", sg_tAppInfo.szBuildTime);

    while (1)
    {

    }
}

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

如果定于sg_tAppInfo变量的源文件没有修改而其它文件修改时,编译日期和编译时间还是之前的

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

mcu

5.下载程序后,通过串口工具在MCU上电就能收到版本信息的打印

mcu

扩展

从上述的实现方式可知,sg_tAppInfo只读变量在程序中的位置不固定,有一定的局限性。

如果结构体有其他的信息,无法在编译时初始化,而是需要在程序编译后的hex文件中添加或者修改信息,但由于只读变量在程序中的位置不固定,不能保证每次编译后在固定的位置添加或者修改信息。

下一篇介绍通过__attribute__机制固定sg_tAppInfo只读变量在程序中的地址,同时采用映像文件工具对hex固件文件进行操作,自动将固件中的版本信息和固件文件名称关联起来。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分