版本管理——字符串转CAN报文输出

目录

一、前言

二、txt文本定义版本号

三、mk文件定义版本号 

四、python提取版本号到mk

五、代码初始化读取版本号


一、前言

工程达到ASPICE 1级以上后可以试着一个工程适配不同项目,此时面对不同项目将输出不同的软件版本,管理好版本输出显得尤为重要!

二、txt文本定义版本号

首先在不同的客户文件夹下建立app_version.txt,用于每次代码提交修改版本号

三、mk文件定义版本号 

在mk文件中定义版本号,并通过宏定义传到编译参数命令行宏中

#version 
APP_VERSION_STR_TMP ?= 2.3.0.0

ifeq ($(APP_VERSION_STR_TMP),)
APP_VERSION_STR_TMP = 1.0.0.0
endif

APP_VERSION_STR = \"$(strip $(APP_VERSION_STR_TMP))\"

COMPILE_OPT += -DAPP_VERSION=$(APP_VERSION_STR)

四、python提取版本号到mk

每次编译将txt中的版本提取到mk文件中:

import os

version_getFile = "app_version.txt"
cusGet_inputFile = "sdk_cr.mk"
version_setFile = "firm.mk"

def main():
    dirct = os.getcwd()
    #1.get custoemr
    if(os.path.exists(cusGet_inputFile)):
        with open(cusGet_inputFile,"r") as sdkCr_f:
            sdkCrCont = sdkCr_f.readlines()
            for str_line in sdkCrCont:
                if "FIRM_CUSTOMER" in str_line:
                    cusN = str_line[str_line.find("=")+1:].rstrip('\n')
                    customerName =  cusN.strip()
                    print('FIRM_CUSTOMER:%s'%customerName)
                    break
    else:
        print('%s not exit!'%cusGet_inputFile)
        return
    #2.get app version
    if customerName == "":
        print('CustomerName Empty Error!')
        return
    app_dir = dirct+"\\firm\\customer\\" + customerName +"\\"+version_getFile
    if(os.path.exists(app_dir)):
        with open(app_dir,"r") as v_f:
            vFile =  v_f.readlines()
            for str_line in vFile:
                if "major" in str_line:
                    v = str_line[str_line.find(":")+1:]
                    v1 = v.strip()
                elif "project" in str_line:
                    v = str_line[str_line.find(":")+1:]
                    v2 = v.strip()
                elif  "firmware" in str_line:
                    v = str_line[str_line.find(":")+1:]
                    v3 = v.strip()
                elif  "algorithm" in str_line:
                    v = str_line[str_line.find(":")+1:]
                    v4 = v.strip()
                    break;
                    #TODO:get commitID
                else:
                    continue;
    else:
        print('%s not exit!'%version_getFile)
        return

    #3.set version
    if v1 == "" or v2=="" or v3=="" or v4=="" :
        print('version number Empty Error!')
        return
    else:
        print("v%s.%s.%s.%s"%(v1,v2,v3,v4))
        firmMk_dir = dirct+"\\firm\\"+version_setFile
        if(os.path.exists(firmMk_dir)):
            datafile =  open(firmMk_dir,"r")
            lines = datafile.readlines()
            lines[1]= "APP_VERSION_STR_TMP ?= "+v1+"."+v2+"."+v3+"."+v4+"\n"
            datafile = open(firmMk_dir, "w")
            datafile.writelines(lines)
            datafile.close()
        else:
            print('%s not exit!'%version_setFile)
            

if __name__ == "__main__":
    main();


在mk文件中添加运行该python脚本的shell指令

$(shell python make_version.py); 

五、代码初始化读取版本号

最后将字符串版本转换为16进制,传给对应的CAN报文,输出到CAN总线

uint8_t char2hex(uint8_t value)
{
	if(value >='0' && value <= '9')
	{
		return (value-'0');
	}
	else if(value >= 'A' && value <= 'F')
	{
		return (value-'A'+10);
	}
	else if(value >= 'a' && value <= 'f')
	{
		return (value-'a'+10);
	}
	else
	{
		return 0xFF;
	}
}
#if 0
/*app: A.B.C.D     boot: A.B.C*/
void fillABVersion(uint8_t* src,uint8_t* dst)
{
    for(int i=0,j=0;i<8;i++)
    {
    	if(src[i] == 0x2E)
    	{
    		continue;
    	}
    	else
    	{
    		dst[j++] = char2hex(src[i]);
    	}
    	if(j==sizeof(dst))
    		break;
    }
}
#else
/*app: AA.BB.CC.DD     boot: AA.BB.CC*/
void fillABVersion(uint8_t* src,uint8_t* dst)
{
	uint8_t highByte=0;
	uint8_t lowByte=0;
	uint8_t isOneWord = 1;
    for(int i=0,j=0;i<16;i++)
    {
    	if(src[i] == 0x2E || src[i] == 0)
    	{
    		dst[j++] = (highByte<<4) + (lowByte&0xF);
    		highByte=0;
    		lowByte=0;
    		isOneWord = 1;
    	}
    	else
    	{
    		if(isOneWord)
    		{
    			lowByte = char2hex(src[i]);
    			isOneWord = 0;
    		}
    		else
    		{
    			highByte = lowByte;
    			lowByte = char2hex(src[i]);
    			isOneWord = 1;
    		}
    	}
    	if(j==sizeof(dst))
    		break;
    }
}
#endif
void getFillCR_0x404Ver(struct bl_radar_can_version_t* dst)
{
    uint8_t appVer[12]={0};
    uint8_t bootVer[8]={0};
    uint8_t av[4]={0};
    uint8_t bv[3]={0};
    MemCpy(appVer, APP_VERSION, sizeof(APP_VERSION));
    nvm_getBootVersion(8, bootVer);
    fillABVersion(appVer,av);
    fillABVersion(bootVer,bv);
    dst->app_major_version = av[0];
    dst->app_minor_version  = av[1];
    dst->app_firmware_fix_version = av[2];
    dst->app_algo_fix_version = av[3];
    dst->boot_major_version = bv[0];
    dst->boot_minor_version = bv[1];
    dst->boot_firmware_fix_version = bv[2];
}

### 使用GNER工具配置CAN报文 #### 准备工作 为了成功配置CAN报文,在启动GNER工具之前,确保已经安装并设置好必要的环境。这通常包括拥有合适的硬件接口以及软件驱动程序[^1]。 #### 打开项目文件或创建新项目 当首次打开GNER应用程序时,可以选择打开现有的项目文件来继续先前的工作,或者通过点击新建按钮建立一个新的工程实例以便于从头定义所有的网络参数和节点属性[^2]。 #### 添加ECU/Node到拓扑结构中 在主界面内找到用于管理设备列表的部分,这里可以增加多个电子控制单元(ECUs),每一个代表参与通信的一个物理实体;对于每个新增加的节点而言,需指定其名称、ID以及其他特定属性以区分不同参与者之间的差异性[^3]. #### 定义消息(Message)及其信号(Signal) 针对所加入的各个节点, 接下来要做的就是规划这些节点间交换的信息格式——即所谓的“Message”。每条message由若干个signal组成; 对应实际应用中的数据项(比如温度传感器读数), 需要在编辑器里逐一设定它们的名字、起始位位置(bit offset)、长度(bits count)等细节信息[^4]. ```python # Python伪代码展示如何构建一个简单的CAN Message对象 class CANMessage: def __init__(self, id_, signals): self.id = id_ self.signals = signals # 假设signals是一个字典,键为信号名,值为对应的二进制字符串表示形式 ``` #### 设置传输方向与定时特性 除了静态描述外,还需考虑动态方面的要求:哪些node负责发送某些类型的messages?接收方又是谁呢? 这些都应在相应的对话框里面做出明确指示。另外关于周期性的广播行为或者其他基于事件触发的消息传递机制同样不可忽视,合理安排时间间隔有助于提高整个系统的效率和响应速度[^5]. #### 导入导出数据库(DBC)文件支持 考虑到兼容性和互操作性的问题,GNER允许用户导入来自其他平台的标准DBC (Description of Bus Communication) 文件作为输入源之一来进行快速初始化; 同样也提供了将当前设计成果保存成相同格式的功能方便后续分享给团队成员或其他第三方开发者使用[^6].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值