目录
一、前言
工程达到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];
}