【導(dǎo)讀】作為嵌入式工程師,版本號(hào)管理絕不是簡(jiǎn)單的數(shù)字編號(hào),而是把控產(chǎn)品迭代節(jié)奏、定位問(wèn)題根源、保障產(chǎn)品質(zhì)量的核心抓手。嵌入式軟件升級(jí)常牽扯硬件驅(qū)動(dòng)、硬件適配等關(guān)鍵環(huán)節(jié),版本管理混亂極易引發(fā)適配沖突,讓問(wèn)題溯源難上加難。本文從嵌入式開(kāi)發(fā)的實(shí)際需求出發(fā),結(jié)合具體場(chǎng)景講解各版本號(hào)的變更邏輯,給出可直接落地的C語(yǔ)言版本號(hào)定義代碼與應(yīng)用示例,幫你建立一套易理解、可落地的版本號(hào)管理規(guī)范,讓嵌入式軟件迭代更有序,問(wèn)題追溯更高效。
在嵌入式軟件開(kāi)發(fā)里面,經(jīng)常會(huì)涉及到軟件和固件的版本號(hào)管理,版本號(hào)并不只是一個(gè)簡(jiǎn)單的編號(hào),而是把控迭代節(jié)奏、快速查找問(wèn)題根源、穩(wěn)住產(chǎn)品質(zhì)量的重要手段。
嵌入式軟件的升級(jí),有時(shí)候會(huì)牽扯到硬件底層驅(qū)動(dòng)、硬件適配等幾個(gè)方面,如果版本管理亂成了一鍋粥,就很容易會(huì)出現(xiàn)適配沖突,會(huì)容易找不到問(wèn)題產(chǎn)生的源頭。
所以,搞一套容易理解并且又能科學(xué)管理軟件版本號(hào)的規(guī)則,對(duì)于嵌入式軟件開(kāi)發(fā)甚至產(chǎn)品運(yùn)維來(lái)說(shuō),都顯得非常重要!
在軟件行業(yè)里面,最常用的是四級(jí)語(yǔ)義化版本結(jié)構(gòu),也就是“主版本號(hào) . 次版本號(hào) . 修訂號(hào) . 構(gòu)建號(hào)”。
主版本號(hào)(Major):主要用來(lái)標(biāo)記互不兼容的大版本改動(dòng),一般從1開(kāi)始計(jì)算。比如,某款工業(yè)網(wǎng)關(guān)設(shè)備軟件版本是V1.2.3.007,后來(lái)因?yàn)橹匦逻m配了CPU和設(shè)計(jì)了驅(qū)動(dòng)程序,這種大變動(dòng)之后,版本號(hào)要改為V2.0.0.0。
主版本號(hào)如果發(fā)生改變,就要跟很多部門同步這個(gè)更新信息,也要跟用戶描述清楚新舊版本的兼容情況。
如果是在研發(fā)階段而非量產(chǎn)階段,主版本號(hào)就設(shè)置為0,比如V0.1.2.345,這樣很容易直觀看出該版本還沒(méi)有量產(chǎn)發(fā)布。
次版本號(hào)(Minor):對(duì)應(yīng)新增功能,并且這些功能與同一個(gè)主版本號(hào)的新舊版本兼容,次版本號(hào)一般從0開(kāi)始,每更新一次就代表增加了新的功能或做了重要的優(yōu)化。
比如,某款傳感器的固件V2.1.1.123已經(jīng)支持了藍(lán)牙通信,后來(lái)要增加Wi-Fi通信(不改動(dòng)硬件),在固件開(kāi)發(fā)完成之后,版本號(hào)就改為V2.2.0.1了。
需要注意的是,這次的改版只增加功能,但不能動(dòng)核心模塊的接口,這樣用戶才能進(jìn)行增量迭代升級(jí),而不用折騰硬件配置。
修訂號(hào)(Patch):主要用來(lái)修復(fù)bug,不增加新的功能,并且還需要兼容新舊的主版本號(hào)和次版本號(hào),修訂號(hào)也是從0開(kāi)始增加的,最常見(jiàn)的用途就是修復(fù)bug、優(yōu)化性能、微調(diào)穩(wěn)定性參數(shù),等等。
比如,用戶反饋產(chǎn)品的藍(lán)牙通信容易斷開(kāi)連接,工程師找到問(wèn)題所在并修復(fù)了bug,沒(méi)有改動(dòng)任何的功能模塊,這樣就可以在修訂號(hào)上進(jìn)行升級(jí),例如從V3.2.1.309升級(jí)到V3.2.2.315。
注意,更改修訂號(hào)的時(shí)候,需要在版本日志里面注明修改了哪個(gè)bug,影響范圍有多大,測(cè)試結(jié)果怎樣,方便后續(xù)繼續(xù)追溯問(wèn)題。
構(gòu)建號(hào)(Build):這是在嵌入式場(chǎng)景里面額外增加的版本號(hào)字段,是用來(lái)標(biāo)記同一個(gè)版本的不同編譯次數(shù)的,一般由腳本工具自動(dòng)生成,不需要工程師手動(dòng)更改。
它的主要作用是方便研發(fā)團(tuán)隊(duì)內(nèi)部更新測(cè)試固件,比如,某款模組第一版測(cè)試時(shí)版本號(hào)是V0.1.1.102,然后下一次構(gòu)建就變成了V0.1.1.103.
構(gòu)建號(hào)不影響版本的兼容性,并且只在研發(fā)團(tuán)隊(duì)內(nèi)部使用,在正式量產(chǎn)發(fā)布的時(shí)候,需要把構(gòu)建號(hào)進(jìn)行固定,不能出現(xiàn)一個(gè)正式版本對(duì)應(yīng)多個(gè)構(gòu)建版本的情況。
還有一點(diǎn)就是,對(duì)于預(yù)發(fā)布版本,可以加一個(gè)后綴來(lái)進(jìn)行狀態(tài)區(qū)分,比如某款路由器固件,可以先出一個(gè)內(nèi)測(cè)版本V1.1.0.123-beta給內(nèi)部使用,內(nèi)測(cè)完成之后再出一個(gè)V1.1.0.135-rc1候選版,最終沒(méi)有問(wèn)題就發(fā)布V1.1.0.135。
在嵌入式軟件里面,通常在頭文件里面確定版本號(hào)的宏定義,這樣既能方便業(yè)務(wù)邏輯調(diào)用和日志打印,還能用來(lái)校驗(yàn)固件升級(jí)。
以下是直接可用的C語(yǔ)言代碼,頭文件 version.h

具體應(yīng)用案例,源文件 main.c

上述的示例代碼,版本號(hào)是用宏定義的方式進(jìn)行編寫(xiě)的,方便編譯腳本自動(dòng)更新構(gòu)建號(hào)和構(gòu)建日期,構(gòu)建日期采用的是YYMMDD_HHMMSS這種標(biāo)準(zhǔn)格式,可以用Makefile或者IDE腳本自動(dòng)獲取固件的編譯時(shí)間。
版本號(hào)貫穿嵌入式軟件開(kāi)發(fā)的每一個(gè)環(huán)節(jié),開(kāi)發(fā)分支要對(duì)應(yīng)明確的版本范圍,測(cè)試時(shí)要記錄清楚每一個(gè)測(cè)試用例對(duì)應(yīng)的版本,量產(chǎn)時(shí)要把版本號(hào)和生產(chǎn)批次進(jìn)行綁定。
上面介紹的四級(jí)版本號(hào)結(jié)構(gòu)還可以進(jìn)行靈活調(diào)整,可以簡(jiǎn)化為三個(gè)級(jí)別的版本號(hào)結(jié)構(gòu),但核心要點(diǎn)還是要整個(gè)軟件流程保持一致,不能亂定義版本號(hào)的層級(jí)。
總的來(lái)說(shuō),嵌入式軟件需要有一套規(guī)范的版本號(hào)管理規(guī)則,然后再加上代碼的編程規(guī)范,這樣能讓嵌入式軟件迭代得更有條理,出現(xiàn)問(wèn)題的時(shí)候也能快速進(jìn)行回溯。




