硬體工程師必學的10種軟體小撇步

作者 : Jacob Beningo,嵌入式系統設計講師兼顧問

嵌入式系統設計不僅需要瞭解硬體,還必須掌握軟體如何影響硬體及其如何互動。當從硬體設計轉向包含軟體的設計時,硬體工程師必須學會十種軟體開發的小撇步...

嵌入式系統設計通常不僅需要瞭解硬體,還必須掌握軟體如何影響硬體及其間如何相互作用。設計硬體所需的特定工程典範可能與設計軟體完全相反。當從硬體設計轉向包含軟體的設計時,硬體工程師應思考以下十個軟體開發小技巧。

技巧#1:流程圖優先,實作次之

當工程師首次邁入軟體開發領域時,會有一種強烈的誘惑力使其立刻投入工作並開始編寫程式碼。這種做法就好像在電路原理圖尚未完成前就試圖設計印刷電路板(PCB)。在著手開發軟體時,抑制一上來就想寫程式碼的衝動至關重要,更重要的應該是先用流程圖制定一個軟體架構圖。這樣的方法將會讓開發人員對於應用所需的不同部份與元件形成一個概念,就像電路原理圖可以告訴工程師需要哪些硬體元件一樣。這樣可以確保程式整體建立在良好的組織和深思熟慮之上,以減少除錯時間,從長期來看,這樣做還可以節省時間與麻煩。

技巧#2:使用狀態機控制程式設計流程

狀態機(state machine)是20世紀最重要的軟體發明之一。一項應用往往可以被分為多個狀態機,其中每個都控制該應用的特定組成。這些狀態機都擁有自己的內部狀態和狀態轉換,從中可看出軟體如何與各種激勵相互作用。利用狀態機來設計軟體,可簡化軟體的開發,使之模組化、可維護且易於理解。現在已經有多種資源可用於展示狀態機理論和演算法。

技巧#3:避免使用全域變數

在函數編程的年代,函數要先於形式,程式設計師的唯一目標是盡可能地讓程式按預期方式快速運行,而無需考慮程式結構或再使用性。這種程式設計範式會毫無顧慮地使用全域變數,程式中的任何函數都可能修改它。其結果就造成了變數被破壞的機率增加或變數被誤用。在新推薦的物件導向範式中,應在最小的範圍內定義變數並加以封裝,以防止其他函數的誤用或破壞。因此,建議限制使用全域變數的數量。在C語言中可用外部關鍵字標識這些變數。

技巧#4:充份利用模組化特性

無論問哪一位工程師,專案的哪個部份最可能延遲交付並超出預算,答案都是軟體。軟體往往極其複雜,而且難以開發和維護,尤其是當整個應用都存在於單一檔案或多個鬆散關聯的檔案時。為了改善可維護性、再使用性及複雜性,強烈建議程式設計者充份利用現代程式設計語言的模組化特性,將常用功能分解成模組。以這樣的方式分解程式碼,程式設計人員就能著手建立函數庫與特性庫,然後在一個接一個的應用中重複使用,從而透過連續測試而改善程式碼品質,同時減少開發時間,並降低成本。

技巧#5:保持中斷處理程式的簡單性

中斷服務常式(Interrupt Service Routine;ISR)用於中斷處理器對當前程式碼的執行,以便處理剛剛觸發中斷的週邊設備。無論何時執行中斷,都需要一定的開銷,用於保存當前程式的狀態並執行中斷,然後將處理器回歸原程式狀態。現代處理器要比多年前的處理器快得多,但仍需要考慮其開銷。一般情況下,程式設計人員都想把中斷執行時間降至最低,以避免干擾主程式碼。這意味著中斷應該短而簡單,而且不應調用函數。此外,如果中斷變得過於複雜或耗時,那麼就應該只在必要時利用中斷做最少量的工作,例如,將資料載入緩衝區並設置一個標誌,然後讓主程式碼處理輸入的資料。這樣做可確保大多數處理器的時間用於執行,而不是處理中斷。

技巧#6:使用處理器示例程式碼進行測試

當設計硬體時,建構原型測試電路極其有利,如此可確保工程師對電路有正確的理解,然後再做電路板佈局。這在設計軟體時也同樣適用。晶片製造商通常都有程式碼示例,可用來測試微處理器的各個部份,這樣工程師們就可以判定該部份的工作情況。此方法有助於明確地知道如何設計軟體體系架構,以及可能碰到的任何問題。在設計初期瞭解可能存在的障礙,比在產品交付前的最後幾小時才發現問題更重要。這是預先測試一段程式碼的好方法,但值得注意的是,製造商的程式碼往往不是模組化的,必須經過徹底的修改才可用於實際應用。隨著技術的進步,也許某一天晶片供應商可提供生產就緒的程式碼。

技巧#7:限制功能複雜度

工程學中有句俗諺說得好——「保持簡單且直接」(Keep It Simple Silly;KISS)。無論在處理何種複雜的工作時,最簡單的方法就是把它分解為更小、更簡單且更易處理的任務。隨著任務或功能變得越來越複雜,人們要準確無誤地記錄所有的細節也變得更困難。在編寫函數時,其複雜度在當時看似適中,然而還必須考慮到6個月後,當工程師進行維護時如何查看程式碼。測量函數複雜度(如迴圈複雜度)的方法很多,現在已經有工具可以自動計算某個函數的迴圈複雜度。由經驗法則可知,函數的迴圈複雜度保持在10以下是最理想的。

技巧#8:使用原始碼儲存庫並頻繁提交程式碼

人都會犯錯誤的,寫程式碼時也一樣會弄錯。這就是為什麼開發人員使用原始碼儲存庫如此重要。原始碼儲存庫讓開發人員「存入」好的程式碼版本,並描述對該基礎程式碼所做的修改。這不僅讓開發人員得以復原或追溯到的舊版程式碼,還可以比較新舊版程式碼之間的不同。如果開發人員做的一系列修改破壞了系統,只需點擊一下即可恢復好程式碼版本!請謹記,如果不頻繁提交程式碼,儲存庫就無法達到預期目的。如果做了不可修復的改變,過兩週才提交程式碼再恢復,就可能造成大量工作和時間的損失!

技巧#9:徹底記錄程式碼

在緊張的軟體開發時,開發人員很容易把注意力集中在編寫和除錯程式碼上,而忽略做詳細的記錄。在壓力之下,記錄工作往往拖到最後,因為開發人員認為這到最後再做即可。然而,趁著程式碼在你腦中記憶猶新時就做記錄是至關重要的,這樣做可以讓其他開發人員或自己日後易於瞭解程式碼如何運作。

技巧#10:使用Agile開發流程

無論進行哪一種類型的工程設計,建議都應該先定義並遵守某種流程,以便能讓品質和成本都保持穩定以及按時交付。軟體開發人員已經成功地使用Agile開發流程來開發高品質軟體,這一流程可按照任務的優先順序來進行開發。最高優先級的任務必須最先在指定時間內完成,這被稱為反覆運算。這種方法的好處是讓軟體開發流程保持流暢,還可以根據結果和客戶的需要,使需求和任務適應每一次反覆運算並進行相應的修改。

編譯:Jenny Liao

(參考原文:10 software tips for hardware engineers, by Jacob Beningo)

加入LINE@,最新消息一手掌握!

發表評論

  1. markscat Yang表示:

    為什麼硬體工程師要會寫程式?