嵌入式軟件配置管理可能是一項棘手的工作。今天的系統通常設計為在多種產品中為不同的客戶在很長一段時間內工作,這些系統需要能夠輕松配置,以便代碼不會成為噩夢,并最大限度地減少配置不當的機會。在這篇文章中,我們將探討嵌入式軟件配置管理的三個技巧,這些技巧可以幫助嵌入式開發人員簡化配置并最大限度地減少產品生命周期內的技術債務。
技巧1 – 使用單獨的回購
在開發嵌入式產品時,將產品的所有代碼放入單個版本控制存儲庫中可能很誘人。畢竟是一個產品,不應該把產品的所有東西都放在一個地方嗎?不!將應用程序分成多個存儲庫可以顯著改善代碼庫配置管理。
在許多情況下,一個產品代碼將用于多個產品SKU,并且在十年或更長時間內,可能會找到不同的配置來滿足客戶的要求。因此,團隊可以仔細檢查他們的產品設計并將所有配置代碼放入單獨的存儲庫中。至少,這會創建核心產品代碼和幾個配置存儲庫,用于管理核心應用程序的行為方式。這樣做的好處是,如果SKU 或特定客戶需要更改配置,它不會強制更改可能意外傳播到其他系統的應用程序。
配置不是唯一可以從放置在單獨的存儲庫中受益的組件,將應用程序的每一層放入不同的存儲庫也有好處。例如,將驅動程序、中間件和應用程序分離到單獨的存儲庫中可以迫使嵌入式開發人員更多地考慮代碼的接口和抽象,這將有助于最大限度地減少層之間的耦合。例如,在芯片短缺期間,許多團隊一直在努力更換微控制器,因為他們將應用程序與硬件緊密耦合。
技巧2 – 利用 YAML、JSON 和 XML 文件
在許多嵌入式產品中,開發人員將使用條件編譯語句來管理他們的系統配置。 例如,如果我有兩個不同的系統,一個有兩個可以控制的繼電器,另一個有四個,開發人員將編寫如下C代碼:
#if SKU == PRODUCT_1
// Custom configuration for two relays.
#elif SKU == PRODUCT_2
// Custom configuration for four relays.
#else
#error “The Product SKU has not been defined!”
#endif
如果產品很簡單,那么在代碼中散布一些條件編譯并不是什么大問題,然而,今天的系統非常復雜,可能有數千條這樣的語句分散在各處。可以想象,這將成為維護和配置的噩夢。
開發人員可以利用配置文件,而不是使用條件編譯。有兩種方式可以利用配置文件。首先,嵌入式開發人員可以只創建包含產品配置信息的C模塊配置,這些配置值被傳遞到各種應用程序、中間件和驅動程序初始化函數中。其次,基于C的配置文件易于設置和維護。
一種更現代的方法是利用 YAML、JSON 和/或 XML格式的配置文件。例如,回顧條件編譯示例,我們可以為兩個中繼配置編寫一個如下所示的YAML文件:
—
Hardware:
Relays:
0x01:GPIO01
0x02:GPIO15
四中繼配置 YAML 文件可能如下所示:
—
Hardware:
Relays:
0x01:GPIO01
0x02:GPIO15
0x03:GPIO22
0x04:GPIO23
使用YAML、JSON 和 XML文件有一個有趣的轉折,如何使用這些文件來配置 C/C 應用程序?有幾種方法,比如編寫一個腳本,讀取YAML文件,然后生成等效的C代碼。例如,該過程可能如下所示:
有些人在C之外使用配置文件并依賴腳本來構建配置感覺很復雜。但是,如果操作正確,這種技術可以成為管理系統配置的一種有價值且有益的方式。
技巧3 – 使用C/C 包管理器
嵌入式開發人員可以利用的另一個選項來幫助管理他們的產品配置是使用包管理器。包管理器允許開發人員管理他們的軟件依賴項。此外,包管理器可以集成到構建系統中,使開發人員能夠輕松地管理他們的構建,包括他們的配置管理。
有幾個包管理器可供使用C/C 的開發人員使用。例如,Microsoft C/C 團隊維護了一個免費可用的工具,稱為vcpkg,vcpkg 工具可用于集成第三方庫、框架和開源代碼或添加私有代碼。或者,conan是一個開源包管理器,也被廣泛使用。每種工具都有其優點和缺點,但無論你選擇哪一種,它們都可以非常有效地幫助管理軟件配置。
結論
很久以前,嵌入式軟件已經從簡單的小控制應用程序升級為通常需要復雜配置管理的復雜系統。條件編譯等舊技術在小型項目中可能會有所幫助,但隨著復雜性和規模的增長,嵌入式開發人員需要尋找更現代的工具。例如,包管理器和自動生成的配置文件可以極大地幫助改進系統的配置管理。但是,當然,成功使用這些工具依賴于紀律嚴明的團隊,畢竟,誰想追逐生成配置的腳本中的錯誤?
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 舉報,一經查實,本站將立刻刪除。