在匆忙推出產(chǎn)品的過程中,程序員經(jīng)常忽略應用程序的一個關鍵方面——代碼維護。
對于生命周期較短的應用程序,這種匆忙可能不會造成嚴重問題,因為一旦部署,沒有人會再次接觸代碼。
然而,嵌入式系統(tǒng)應用程序的生命周期可能長達數(shù)十年,早期的編碼錯誤可能會導致日后重大的錯誤修復和更新成本。
在為嵌入式應用程序設計和實現(xiàn)軟件期間,您必須考慮代碼的可維護性。以下的10個建議可能不是關于代碼易維護的全部,但是遵守了這幾個建議應該可以避免被看你代碼的人“罵”:
01避免匯編代碼
在低端的一些微控制器(MCU)上可能只能用匯編語言,但是在高端的處理器上(如ARM),可能就不需要匯編語言。
我們在這里不能否認匯編語言的好處,在一些情況下,許多程序員可能會使用匯編語言來提高性能或減少代碼大小。但是使用匯編語言代碼可能會使您的項目延期,關鍵的,會讓不懂匯編的人“看懵”。
當然了,有些位置或者情況你是不能避免使用匯編語言的,如果必須使用匯編語言,請包含詳細的注釋,這樣可以節(jié)省時間并減少有人遇到問題時檢查你的代碼的挫敗感。
02代碼注釋要清晰
? 代碼注釋的作用應該就不需要解釋了,好的注釋確實可以很好的保證代碼的可讀和可維護性,但是相反;不好的代碼注釋反而會增大代碼的誤解; 如下面的注釋:
//?This?function?adds?two?numbers?and?returns?the?result int multiply(int a, int b) { return a*b; }上面的代碼明明是返回兩個數(shù)字的乘積,但是注釋中注釋為范圍兩個數(shù)的和;讓你說,后人看到這樣的代碼,會不會罵人?? ? ?
?
?03不要隨意優(yōu)化代碼
?隨意優(yōu)化代碼可能會導致維護噩夢,因為優(yōu)化后的代碼通常難以理解,并且,優(yōu)化后的代碼可能執(zhí)行的效果與未優(yōu)化前的效果天壤之別;若考慮到代碼大小,內(nèi)存空間限制等因素,請?zhí)崆按_定好代碼的優(yōu)化等級;? ?
04保持中斷函數(shù)盡可能簡單
簡單的中斷服務程序 (ISR) 可提高性能并簡化維護。 因為中斷服務函數(shù)的運行是異步地,它們本質(zhì)上很難調(diào)試;所以盡量減少他們的任務。 嘗試將任何數(shù)據(jù)處理或任務處理從 ISR 移到主程序中。然后,ISR 只負責從硬件獲取數(shù)據(jù),將其放入緩沖區(qū),置位數(shù)據(jù)就緒標志并重新啟用中斷。 在主程序中通過判斷就緒標志來執(zhí)行數(shù)據(jù)的處理。? ?
05將調(diào)試代碼留在源文件中
在程序開發(fā)過程中,我們可能會添加一些專門用于調(diào)試的代如:詳細輸出、斷言、LED閃爍等。 在項目結束時,刪除調(diào)試代碼以“清理”源代碼可能很“爽”。但是,刪除調(diào)試代碼可能會在以后產(chǎn)生問題。 任何試圖維護應用程序代碼的人都可能必須重新創(chuàng)建原始代碼中包含的許多調(diào)試步驟。所以,將調(diào)試代碼保留在源文件中可以簡化維護。 如果您必須在生產(chǎn)版本中刪除調(diào)試代碼,可以使用條件編譯的方式保證在產(chǎn)生生產(chǎn)版本時不編譯相關的調(diào)試代碼。? ?
06將底層和應用層區(qū)分開
如果應用程序的代碼中涉及到太多硬件相關的操作可能會使移植到新平臺變得非常困難。 所以,為了簡化編程和應用層的維護,為硬件API或底層硬件操作封裝自己的HAL層接口。 當你的程序需要移植到新單片機上時,僅僅需要更改底層的代碼就可以,定義的HAL層接口不需要改變,相對應的,應用層的代碼也就不需要改變。
關于如何進行軟件分層,我們會專門推出一系列的文章進行講解;歡迎儲蓄關注。? ??
07功能拆分需要合理
與 PC軟件不同,嵌入式應用程序代碼更多的依賴于硬件一起工作。因此,您可以選擇將代碼的功能單元分成不同的小塊。 將不同的功能拆分成不同的功能塊,確實可以提高代碼的易讀和易維護性; 但是進行功能拆分也不能太多;一般保持在單個作用域內(nèi)的函數(shù)調(diào)用次數(shù)控制在5個或6個以內(nèi),并使軟件中的功能單元與特定的硬件功能相對應。 ? 如果一個程序被分成太多的小塊,調(diào)用圖就會像蜘蛛網(wǎng)一樣,代碼將很難調(diào)試和理解。? ?
08保留所有代碼相關的文檔和流程圖
我們在進行程序開發(fā)時,肯定會有一些功能說明、軟件流程圖等文檔性質(zhì)的內(nèi)容,這些文檔類的資料應盡可能與源文件放到一起,或直接添加到源代碼工程中。 如果您必須將文檔分開,需要保證在代碼中有相關的說明,說明文件的相關信息:如文件名、路徑等信息。因為如果您不使用源代碼找到文檔,則很容易丟失文檔。 理想情況下,將完整應用程序的所有文檔和源代碼同一個工程目錄下。保證后來人可以通過你的文章很快的熟悉你的代碼。? ?
09避免使用一些巧妙的技巧
聰明的程序員可以想出極其緊湊和優(yōu)雅的方法來使用模板、繼承、goto 語句和三元運算符(“?”)等工具。 但是這樣聰明的編碼方式可能會導致一些不必要的麻煩。因為可能只有在自己編寫代碼時才知道他們是怎么工作的,等過幾天或者讓后來人看你的代碼時,肯定會一頭霧水。 因此,還是盡量減少使用這種深奧的語言功能。? ?
?10將所有定義放在一處
如果您的代碼包含許多常量定義或條件定義,請將它們保存在一個位置,例如單個文件或源代碼目錄。如果您在代碼中藏著很多變量的定義,別人看到后可能會感覺代碼太亂,變量隨便定義,毫無規(guī)劃。(當然了,不罵人最好了)
?
評論
查看更多