吳學偉
(珠海格力電器股份有限公司 珠海 519070)
隨著生活水平的提高,用戶對空調的需求已經逐漸從滿足簡單的制冷、制熱基本功能向舒適、節能、健康和智能等多維度需求轉變,控制器作為空調器的大腦,也隨著需求的增加而越發復雜。而由于商用空調系統復雜,對其可靠性的要求更高,控制邏輯就更加復雜。表征軟件復雜程度最直觀的是軟件需求規格書的規模,軟件需求書的規模從早期定頻空調的幾頁發展到現在智能化變頻空調超過100 頁,嵌入式軟件的代碼也增長了十倍以上,需求規模的爆炸式增加也導致了軟件的缺陷問題越來越多,軟件的可靠性已經成為空調開發進度及質量控制最為關鍵的難題。嵌入式軟件的可靠性不僅涉及到系統的穩定性和安全性,還直接影響到整個系統的可靠性和性能,例如某開發項目因一個變量未初始化,導致產品在量產后出現室外機變頻風機概率性無法正常啟動運行,嚴重影響產品可靠性。因此,如何提高嵌入式軟件的可靠性成為了一個重要的研究方向。查閱文獻資料,在嵌入式軟件可靠性方向僅有一些軍用產品負方面有一些相關的文獻和研究,家電產品目前研究較少,特別是軟件開發過程在規范性方面存在較大不足,急需從工程管理和規范方面進行系統性的研究加以規范,提升軟件產品的可靠性[1-4]。
可靠性是指產品在規定的條件下和規定的時間內完成規定功能的能力,對應到軟件,指的是軟件在規定的條件下和規定的時間內不引起系統失效的能力[5]。
從圖1可以看出,軟件故障產生的根源是由于開發人員的失誤導致,并且長期存在于產品中,但是只有在特定的環境條件下才會觸發才會產生故障,其通常具有隱蔽性,較硬件故障更難以發現;軟件還具有一致性和不變性的特征,如果軟件設計存在缺陷,則在特定環境下將百分百會在產品使用過程中出現,導致產品出現批質量事故,嚴重的缺陷甚至導致空調完全無法使用甚至損壞。

圖1 軟件故障的因果關系
軟件失效的原因都是因為在運行過程中出現了故障。故障產生有內在和外在原因,內因是開發過程中形成且未被排除的潛在缺陷,例如需求理解錯誤、算法錯誤、軟件編碼錯誤等原因。外因是軟件外部給軟件提供的各種非期望條件。
根據多年的嵌入式軟件開發經驗,空調嵌入式軟件失效的主要原因是人為的偶然失誤,統計本部門近三年的100 個嵌入式軟件開發項目軟件失效問題,發現主要原因是需求理解和軟件編碼,詳細占比如圖2。

圖2 軟件失效的原因分類
針對出現的軟件問題,統計問題的特性,發現有接近90 %的問題是重復性出現的,甚至是多次出現。包括相同的需求邏輯不同的軟件開發人員重復犯同樣的錯誤,不同的軟件開發人員犯了相似的編碼錯誤,如圖3、4所示。

圖3 軟件人為偶然失誤的原因分類

圖4 軟件問題的重復比例
大型的計算機軟件高度復雜,普遍都適用了軟件工程的方式進行開發和管理,但在相對簡單的嵌入式系統軟件開發中,很多場合還是一個或少數幾個軟件設計員包打天下,開發過程相對原始,容易把嵌入式軟件開發簡單化成編程,從而造成了軟件質量難以管理,特別是軟件規模的暴增之后,迫切需要采用軟件工程的思路進行開發管理。
空調產品屬于家用電器,但其使用年限、質量要求又近于工業產品,根據產品特點,軟件開發模型選擇了瀑布模型,主要階段包括需求分析、設計、編碼和測試。
根據前面對失效原因的統計分析,需求理解是軟件人為失效的主要原因,需求的理解錯誤往往產生于軟件開發人為對控制邏輯的想當然,對需求缺乏必要的評審以及對需求實現的過程管理,這點通過軟件工程的需求分析,以及概要設計和詳細設計可以較好的解決[6,7]。
需求分析是指對用戶需求進行分析和整理,確定系統的功能和性能要求。在嵌入式軟件開發過程中,需求分析是非常重要的一步。如果需求分析不清晰、不準確,就會導致后期的開發和測試出現問題,從而影響系統的可靠性。
為了確保需求分析的準確性,可以采用以下方法:
1)充分與用戶溝通,了解客戶的真實需求。
2)制定合理的需求文檔,明確系統的功能和性能要求。
3)對需求進行評審,確保需求的完整性和一致性。
空調主控的邏輯需求,其來源是公司內部的制冷系統工程師,其編寫邏輯的思維與程序員思維往往差異較大,簡單的一段話描述在不同的人會有多樣的理解,這些都是需要在需求分析過程中加以避免的,特別是一些復雜的,時序性強的邏輯。通過長期的經驗,筆者總結如果能夠采用如下幾種方式基本可以避免理解上的歧義:
3.2.1 格式規范和標準化
采用結構化的語言或思路進行描述,格式標準化,條件必須是獨立完整的,條件要互斥且閉合,不能通過備注的方式二次甚至多層組合,備注作用僅做解釋輔助理解(表1)。

表1 結構化語言格式
3.2.2 語言描述要求
1)語法:只使用祈使語句一種,明確的表達做什么。
2)詞匯:名稱表達要規范統一,參考各類國家標準的寫法,需要解釋的術語統一定義,如故障恢復方式。避免使用一些空洞的名詞、形容詞、副詞等,可使用一些運算符、關系符等。
3)參數:所有參數(如壓縮機連續運行時間,模式)都必須要有數值范圍、初始化值和精度,如故障檢測時間變量計時精度是0.1 s、1 s還是1 min。
4)邏輯層次:對條件較多,有“且”和“或”組合關系,用括號輔助表達層次關系。一個括號只有一種邏輯關系,括號可嵌套。
5)邏輯關系:“且” 和“或”要準確。
3.2.3 避錯設計
1)模塊化:嚴格按照功能模塊劃分,不寫與主題無關內容
如:如故障檢測邏輯只能寫檢測邏輯,不允許順帶寫負載如何控制。
2)模塊獨立:和其他模塊關聯少,不同模塊間的內容減少耦合,少跳轉
如:如功能和保護的嵌套,化霜和回油嵌套等。
3)局部化:關系緊密的邏輯盡量彼此靠近。
4)簡單化:在能實現功能的情況下條件判盡量簡化,接口參數盡量少,總參數盡量少。
針對同一功能重復出現問題,究其原因重用性低是主要原因,有完全一樣的功能重復開發,也有功能接近的需求重復開發,這除了容易造成程序質量問題,還極大的浪費了公司的開發和測試資源。
代碼可重用性是指代碼的可復用性和可移植性。盡量使用成熟經過反復驗證的可靠的功能模塊,搭建軟件CBB庫,提煉可以在不同產品之間共用的、可靠性要求高的功能模塊,可重用模塊必須經過嚴格測試和入庫評審機制才可入庫,通過制定獎勵制度鼓勵軟件開發人員積極的使用庫文件,從而提升開發效率和質量。
嵌入式軟件通常采用C語言編碼,C語言語法簡單靈活性高,靈活性高是把雙刃劍,需要在工程使用中進行嚴格的限制,最大限度的規范化使用,避免出現代碼千人千面,難以維護。
C語言可靠性設計在標準上沒有明確的標準規范,但在一些可靠性要求較高的行業有一些成熟的規則可供借用,如MISRA C Coding Standard[5],這是被認為工業標準的C編程規范,包括了一百多條C語言編碼標準,如果能夠完全遵守這些標準,則你的C代碼是易讀、可靠、可移植和易于維護的。企業可以在MISRA的基礎上,再根據自身產品的實際代碼特點,結合設計開發過程出現的突出問題不斷進行總結完善,形成公司級的編碼規范。舉例如下:
3.4.1 排版
排版不直接影響軟件的質量,但不好的排版風格可能誘發可靠性問題,一個項目團隊應該有統一的風格,包括縮進、空行、分行、大小括號使用等等都需要有規范并且嚴格執行。
3.4.2 注釋
注釋量不低于語句的20 %,注釋的表達要規范。
3.4.3 可讀性
變量命名盡量自解釋,不能用拼音;常量命名要大寫等。
3.4.4 編碼可靠性規則
這是影響代碼可靠性的最核心部分,也是所有編程人員應該熟記并強制執行的規則,如變量初始化問題,所有變量和寄存器都要有初始化,即使上電有默認值也要初始化。
隨著芯片、通訊和人工智能等技術的迅猛發展,嵌入式軟件的應用將會越來越廣,軟件規模越來越大,復雜度越來越高,因軟件故障造成的產品可靠性問題也將更加突出,急需引起重視。通過對軟件工程化管理、需求分析、代碼編寫規范和提高代碼的重用率等方面進行規范化標準化設計,可以有效地提高嵌入式軟件的可靠性,項目團隊在通過以上措施之后,每個項目的軟件平均缺陷下降23 %,重復性問題下降33 %,效果顯著。