對于我們大多數為嵌入式系統編寫固件和軟件的人來說,普遍希望立即投入編碼,而忽略或很少關注關鍵的程序設計階段。不幸的是,這種沖動在我們的領域比在其他領域更為明顯。
例如,如果沒有完全開發的藍圖或原理圖,建筑商或硬件工程師永遠不會開始施工。另一方面,即將推出的固件開發人員經常直接進入編碼階段,而沒有完全開發其程序邏輯,這通常會導致混亂的“意大利面條”程序(圖 1)。
在次設計之前編寫代碼是一種不好的做法,會導致混亂的“意大利面條”程序。
圖 1.在首次設計之前編寫代碼是一種不好的做法,會導致混亂的“意大利面條”程序。
他們通過以下三種方式之一來做到這一點:
他們同時嘗試設計和編碼(這種方法被稱為“設計一點,編碼一點”)
他們在開發程序的邏輯設計時過于依賴編程語言的約束
他們完全跳過設計步驟,因為他們認為該項目“太簡單”,或者他們對自己的能力過度自信,也就是“我太聰明了”。
這種急于編寫代碼的行為可能會適得其反,并終花費更多的開發時間,因為設計不當的程序可能會導致許多本來可以通過仔細規劃來避免的錯誤。
例如,如果您使用“設計一點、編碼一點”的方法,那么隨著設計的不斷變化,您可能需要擦除或重新輸入很多內容。您的程序的長度將是其應有的兩倍,效率將是其應有的一半。如果認為跳過程序的設計階段會加快開發過程,并且您的嵌入式系統將立即啟動并運行,那么這可能是一個巨大的錯誤。
事實上,為微控制器構建經濟代碼的關鍵是在編寫一行代碼之前花時間系統地設計程序。這也稱為結構化編程,它會導致代碼占用更少的內存,需要更短的處理時間,并且通常在次嘗試時就可以正確運行。
結構化編程意味著對問題有透徹的理解。它涉及自上而下的分析,將問題分解為越來越小的部分,直到每個部分都有明顯的解決方案或功能。同時,它還涉及使用三種控制結構(序列、交替、重復或循環)來組織或組合功能。
為此,在結構化編程中設計程序的一種流行工具是使用 Warnier-Orr 圖,該圖以創建者 Jean-Dominique Warnier 和 Kenneth T. Orr 的名字命名。
Warnier-Orr 圖清晰可見
Jean-Dominique Warnier 和 Kenneth Orr 創建了 Warnier-Orr 圖作為可視化工具,用于顯示復雜數據或流程的層次結構分解。它的主要用途是表示程序的邏輯結構。
程序是一組有序指令,用于處理輸入數據以產生結果。您正在編程的微控制器只是一個快速信息處理工具。
輸入的數據、結果、程序都是信息文件。這些信息文件不是完全獨立的數據,但可以嵌套在其內部。也就是說,它們可以分解為子部分并以父子方式分層組織。
Warnier-Orr 圖允許您定義所需的輸出并逆向工作,分解產生所需結果所需的輸入和流程步驟。然后,它可以幫助您以圖形方式表示程序步驟的層次結構以及已分解的輸入和輸出數據結構。
Warnier-Orr 圖概述和注意事項
1. Warnier-Orr 圖用括號在頁面上水平繪制程序或數據結構(圖 3)。
Warnier-Orr 圖的示例。 A 分為子部分 B、C 和 D。D 分為子部分 E、F、J 和 H。
圖 3.Warnier -Orr 圖示例。A 分為子部分 B、C 和 D。D 分為子部分 E、F、J 和 H。
每個括號代表括號前面的數據項或流程步驟的功能細分。括號代表單獨的層次級別,每個括號內的項目在邏輯上是相關的。
2. Warnier 圖在括號內從左到右、從上到下閱讀。
3. 對于程序結構表示,Warnier-Orr 圖的每個括號都是一個視覺提示,表示已完成程序中的子例程。
4. 當一個項目或函數下面帶有符號 (0,1) 時,表示它存在或不存在、選擇或未選擇、或假或真。
5. “+”表示包含 OR。當括號中的兩個或多個項目或步驟用“+”分隔時,表示包括其中之一或另一個,或兩者都包括在內。
6. 符號“?”表示異或。當括號內的兩個或多個項目或步驟用“?”分隔時,表示包括或執行其中一項,但不是兩項。
7. 符號“(n, N)”表示函數將被執行的次數(圖 4)。
使用 Wanier-Orr 圖分解智能鎖數據。
圖 4.使用 Wanier-Orr 圖分解智能鎖數據。
8. 符號“?N”符號表示要測試的條件以確定將選擇哪個功能。圖 5 所示圖表的腳注詳細介紹了這些條件。
已分解為子部分的程序的邏輯表示。
圖 5.已分解為子部分的程序的邏輯表示。圖片由分析師和程序員圖表技術提供
9. 當表示一個程序時,每個層級或子功能都由三個部分組成。它們是開始、流程步驟和結束。
現在,有了 Warnier-Orr 工具,您就可以為下一個嵌入式系統項目設計程序了。
邏輯設計微控制器程序的步驟
為微控制器構建良好的程序需要系統的方法。Jean Warnier 和其他作者在《編程技術》一書中介紹了四個設計步驟,幫助您設計的程序,并從導致我們首先創建它們的問題中得出它們。
第 1 步:識別輸出
步也是重要的一步是確定程序所需的輸出。您必須問自己這個問題:“我希望程序做什么?” 確保您盡可能清楚地回答這個問題。
步驟 2:定義邏輯數據庫
一旦明確定義了輸出,您就可以識別所需的輸入,并定義這些輸入的屬性。此步驟有助于確??紤]到所有必要的輸入,以及一刻的添加,例如“哎呀,我忘了輸入一些內容到。..。..”。。?!?。保持在限度。
當您能夠回答步驟一和步驟二中的問題時,您就完成了別的設計。
第三步:設計程序結構
接下來,設計程序結構分兩步完成:自上而下的分析和綜合。
自上而下的分析:
自上而下的分析涉及將程序分解為許多更詳細的子功能。從別開始,這是描述整體功能的單個塊,然后逐步將該功能擴展為詳細的子功能。通過此步驟,不必太擔心程序中子函數的執行順序。你只關心應該做什么,而不關心應該如何做。
由于其中大部分內容都是直觀的,因此請慢慢開始該過程,不要試圖太快地開發太多細節。
合成:
完成自頂向下的分析后,您已將程序簡化為基本組件的集合。綜合涉及決定應以什么順序執行功能。組織這些函數的三個基本邏輯結構是序列、if-then-else 和循環。這些的組合可用于構建復雜的函數。
第 4 步:使用 Warnier-Orr 圖來表示您的設計
使用 Warnier-Orr 圖將其轉化為概述。整個圖應該只包含邏輯語句,而不包含代碼。這使得文檔易于理解。
評論
查看更多