嵌入式系統設計通常不僅需要了解硬件,還需要了解軟件如何影響硬件并與之交互。設計硬件需要一定的工程范例,這可能與設計軟件截然相反。在嵌入式開發中,當從硬件設計過渡到軟件設計時,硬件工程師在開始開發軟件時應該記住十個軟件技巧。
技巧1——首先是流程圖,其次是實現當一個工程師*次踏入軟件開發的領域時,有一種強烈的誘惑讓他立即投入并開始編寫代碼。這種思維模式相當于在原理圖完成之前就試圖設計PCB。坐下來開發軟件時,忽略開始編寫代碼的沖動,而是使用流程圖來開發軟件的架構圖,這一點至關重要。這將使開發人員了解應用程序所需的不同部件和組件,就像原理圖告訴工程師需要什么硬件組件一樣。通過這樣做,整個程序將有更好的機會被很好地組織和思考,從長遠來看,這將通過減少調試時間來節省時間和頭痛。
技巧2——使用狀態機來控制程序流程20世紀*偉大的軟件發明之一就是狀態機。一個應用程序通常可以分解成多個狀態機,每個狀態機控制應用程序的一個特定組件。這些狀態機中的每一個都有自己的內部狀態和狀態轉換,決定了軟件如何對各種激勵做出反應。使用狀態機設計軟件將使模塊化、可維護和易于理解的軟件開發變得容易。存在大量展示狀態機理論和算法的資源。
技巧3——避免使用全局變量在過去的函數式編程中,函數優先于形式,嵌入式開發人員的*目標是讓程序盡可能快地按預期運行,而不考慮程序結構或可重用性。這種編程范式不擔心使用程序中任何函數都可以修改的全局變量。結果是增加了變量損壞或誤用變量的機會。在新推薦的面向對象范例中,變量應該在盡可能小的范圍內定義,并被封裝以防止其他函數誤用或破壞變量。因此,建議您限制使用全局范圍的變量的數量。在C語言中,可以通過使用extern關鍵字來標識這些變量。
技巧4——利用模塊化的優勢如果你問任何一個工程師,項目中*有可能延遲交付和超出預算的部分,答案將是軟件。軟件通常很復雜,很難開發和維護,尤其是當整個應用程序駐留在一個文件或多個松散關聯的文件中時。為了簡化可維護性、可重用性和復雜性,強烈建議利用現代編程語言的模塊化,將常見功能分解為模塊。通過以這種方式分解代碼,程序員可以開始構建函數庫和特性庫,這些函數庫和特性庫可以從一個應用程序重用到下一個應用程序,從而通過連續測試提高代碼質量,并減少時間和開發成本。
技巧5–保持中斷服務例程簡單中斷服務例程用于從當前正在執行的代碼分支中中斷處理器,以便處理中斷剛剛被觸發的外設。每當執行中斷時,都需要一定量的開銷來保存當前程序狀態,運行中斷,然后將處理器返回到原始程序狀態。現代處理器比幾年前快得多,但仍需要考慮這種開銷。一般來說,為了不干擾主代碼分支,嵌入式開發人員希望盡量減少中斷時間。這意味著中斷應該短而簡單。不應從中斷中調用函數。此外,如果中斷開始變得太復雜或花費太多時間,則應該使用該中斷來完成當時所需的*少任務,例如將數據加載到緩沖區并設置一個標志,然后允許主分支處理傳入的數據。這樣做可以確保處理器的大部分周期都用于運行應用程序,而不僅僅是處理中斷。
技巧6——使用處理器示例代碼試驗外設在設計硬件時,構建原型測試電路總是有幫助的,這樣可以確保工程師在布局電路板之前對電路的理解是正確的。寫軟件也可以這樣。硅制造商通常有示例代碼,可以用來測試微處理器的部件,以便工程師可以了解部件的工作原理。這允許洞察軟件架構應該如何組織以及可能遇到的任何潛在問題。在設計過程的早期識別潛在的障礙,而不是在發貨前的*后幾個小時才發現。這是預先測試代碼片段的好方法,但是要注意,制造商代碼通常不是模塊化的,在實際應用中不需要大量修改就可以輕松使用。隨著時間的推移,這種情況一直在改變,也許有*會從芯片提供商那里得到生產就緒的代碼。
技巧7——當處理任何復雜的任務時,*簡單的方法是把它分成更小更簡單的任務,這樣更容易處理。隨著任務或功能變得越來越復雜,人類越來越難跟蹤所有細節而不出錯。當一個函數被寫出來的時候,它的復雜性在當時看起來是合適的,但是當它需要在六個月后被維護的時候,工程師將會如何看待它應該被考慮。有很多方法可以測量函數的復雜度,比如圈復雜度。有一些工具可以自動計算函數的圈復雜度。一般經驗表明,圈復雜度低于10的函數是理想的。
技巧8——使用源代碼庫并提交經常犯錯是人類的一部分,當人類編寫代碼時,他們不會奇跡般地改變。這就是嵌入式開發人員使用源代碼庫至關重要的原因。源代碼庫允許開發人員簽入一個好的代碼版本,并描述對代碼庫做了哪些更改。這使得開發人員不僅可以恢復或回到舊版本的代碼,還可以比較以前版本的變化。如果開發人員做了一堆改變,然后破壞了系統,回到一個好的代碼版本只是一個點擊!請記住,如果代碼沒有被頻繁地提交,那么存儲庫將不會像預期的那樣工作。如果進行了不可逆轉的更改,等待兩周提交代碼然后返回將會損失大量的工作和時間!
技巧9——徹底記錄代碼在軟件開發的激烈競爭中,很容易只關注代碼的編寫和調試,而忽略記錄。文檔經常成為項目任務的結尾,因為當有壓力時,它是開發人員*不想做的事情。然而,重要的是當代碼在你的腦海中還清晰的時候,記錄下來,這樣將來的開發人員或者你自己就可以閱讀注釋并理解代碼是如何工作的。
技巧10——使用敏捷開發過程當進行任何類型的工程設計時,總是建議定義并遵循某種過程,其結果是一致的質量、成本和按時交付。嵌入式開發人員已經成功地使用敏捷開發過程來開發高質量的軟件。該流程允許開發具有優先級的需求。*高優先級的任務首先在一個被稱為迭代的預定時間段內執行。該過程的美妙之處在于它允許軟件開發過程是流動的,允許需求和任務根據客戶的結果和需求隨著每次迭代而適應和改變。