• 初出茅庐的小李博客之根据编译时间生成软件版本号


    为什么要软件版本号呢?

    生成软件版本号是在软件开发和维护过程中非常重要的一项任务,它有很多意义和好处,同时也有多种常见的方法。

    1. 标识和追踪:软件版本号是唯一的标识符,用于区分不同版本的软件。这有助于开发人员和用户识别和追踪软件的不同发布版本。当出现问题时,可以更容易地确定特定版本中的错误或改进。

    2. 沟通和文档:版本号提供了一种简单而清晰的方式来与团队成员、用户和其他利益相关者进行沟通。通过版本号,人们可以明确了解到底是哪个版本的软件正在讨论,从而更容易地协作和解决问题。

    3. 发布计划:版本号可以用于制定和执行软件的发布计划。通过设定版本号,团队可以计划哪些功能和改进将包含在特定版本中,以及何时发布这些版本。

    4. 用户期望管理:版本号可以用于管理用户的期望。用户可以根据版本号了解到软件的新功能、改进和修复的问题。这有助于用户知道他们是否需要升级或采取其他行动。

    5. 软件稳定性:通过良好设计的版本号系统,可以区分主要版本、次要版本和修订版本。这有助于用户快速识别是否有可能引入不稳定性的大幅更改。

    常见生成软件版本号的方法有哪些?

    1. 语义版本号(Semantic Versioning,SemVer):SemVer 是一种流行的版本号方案,通常由三部分组成:主版本号、次版本号和修订号,例如 1.2.3。主版本号增加表示不兼容的变化,次版本号增加表示向后兼容的功能添加,修订号增加表示向后兼容的错误修复。

    2. 日期版本号:使用日期作为版本号的一部分,例如 2023.09.11,可以让人们很容易地知道软件的发布日期。这对于在特定日期之前或之后的版本上工作或测试很有用。

    3. 自定义版本号:一些团队和组织使用自定义版本号方案,根据他们的需求制定。这可能包括项目标识符、构建号码、分支信息等。

    4. 预发布版本和元数据:有时,版本号可能包括预发布版本和元数据信息,以进一步详细说明软件的状态和特性。例如,1.2.3-beta1 表示一个预发布版本,而 1.2.3+build456 表示带有构建号的版本。

    5. 语言特定的版本号:某些编程语言和工具具有自己的版本号规范,开发人员应遵循这些规范,以确保与相关工具的兼容性。

    在单片机中如何生成日期版本号?

    先介绍一下c语言常见的两个宏定义

    在C语言中,有一些特殊的宏定义,用于获取当前编译日期和时间等信息。以下是两个常见的宏定义示例:

    1. __DATE__ 宏

      printf("编译日期:%s\n", __DATE__);
      
      • 1

      这个宏会在编译时被替换为一个字符串,表示编译源代码的日期。通常,它的格式类似于"Sep 11 2023",表示月份、日期和年份。

    2. __TIME__ 宏

      printf("编译时间:%s\n", __TIME__);
      
      • 1

      这个宏会在编译时被替换为一个字符串,表示编译源代码的时间。通常,它的格式类似于"12:34:56",表示小时、分钟和秒。

    这些宏可以用于在代码中记录编译日期和时间,这在调试和版本管理中非常有用。

    具体实现

    #include "version.h"
    #include 
    #include 
    
    
    void Get_Compile_Date_Base(uint8_t *Year, uint8_t *Month, uint8_t *Day)
    {
    	//Sep 11 2023
    	const char *pMonth[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
    	const char Date[12] = __DATE__;//取编译日期
    	uint8_t i;
    	for(i = 0; i < 12; i++)if(memcmp(Date, pMonth[i], 3) == 0)*Month = i + 1, i = 12;
    	*Year = (uint8_t)atoi(Date + 9); //Date[9]为2位年份,Date[7]为完整年份
    	*Day = (uint8_t)atoi(Date + 4);
    }
    
    
    void Get_Compile_Time_Base(uint8_t *HH, uint8_t *MM, uint8_t *SS)
    {
    	//15:40:23
    	const char Time[10] = __TIME__;//取编译时间
    	*HH = (uint8_t)atoi(Time + 0);
    	*MM = (uint8_t)atoi(Time + 3);
    	*SS = (uint8_t)atoi(Time + 6);
    }
    
    char g_date_buf[10];
    char g_time_buf[10];
    char g_version_buf[20];
    char* Get_Compile_Date(void)
    {
    	uint8_t  Year, Month, Day;
    	Get_Compile_Date_Base(&Year, &Month, &Day);//取编译日期
    	sprintf(g_date_buf, "20%02d-%02d-%02d", Year, Month, Day);//任意格式化
    	return g_date_buf;
    }
    
    char* Get_Compile_Time(void)
    {
    	uint8_t  HH, MM, SS;
    	Get_Compile_Time_Base(&HH, &MM, &SS);//取编译时间
    	sprintf(g_time_buf, "%02d:%02d:%02d", HH, MM, SS);//任意格式化
    	return g_time_buf;
    }
    
    char* Get_Compile_Ver(void)
    {
    	uint8_t  Year, Month, Day;
    	uint8_t  HH, MM, SS;
    	Get_Compile_Date_Base(&Year, &Month, &Day);//取编译日期
    	Get_Compile_Time_Base(&HH, &MM, &SS);//取编译时间
    	sprintf(g_version_buf, "20%02d-%02d-%02d-%02d-%02d-%02d",Year, Month, Day, HH, MM, SS);//任意格式化
    	return g_version_buf;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    #ifndef _VERSION_H_
    #define _VERSION_H_
    
    
    #include "stm32f4xx.h"
    
    
    char* Get_Compile_Date(void);
    char* Get_Compile_Time(void);
    char* Get_Compile_Ver(void);
    
    #endif
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    实现效果

        printf("RI  QI:%s\r\n",__DATE__);
    	printf("SHI JIAN:%s\r\n",__TIME__);
        printf("#############################Test#########################\r\n");
    	printf("RI  QI:%s\r\n",Get_Compile_Date());
    	printf("SHI JIAN:%s\r\n",Get_Compile_Time());
    	printf("Soft Version:%s\r\n",Get_Compile_Ver());
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    编译时间是:
    2023年9月11日21点03分57秒(就是刚才)

    其他方式(直接宏定义实现)

    参考博客:http://t.csdn.cn/BNv0F

  • 相关阅读:
    DeSci:去中心化科学是Web3.0的新趋势?
    童装业务占比扩大,APS生产排产解决服装企业生产管理难题
    Flutter更新sdk时报错
    网规配置案例分析——国庆
    Spring中的多线程魔法:探索@Async注解的妙用
    常用代码扩展点设计方式
    【IEEE2017】RL:机器人库:一种面向对象的机器人应用程序的方法
    什么是蜘蛛池?-免费蜘蛛池搭建软件
    【计算机网络仿真】b站湖科大教书匠思科Packet Tracer——实验3 总线型以太网的特性(广播,竞争总线,冲突)
    青龙面板-闲趣赚修复版
  • 原文地址:https://blog.csdn.net/weixin_43176183/article/details/132814025