對于一個沒有太多程序設計經(jīng)驗的萌新工程師來說,如何有規(guī)劃有條理的進行程序設計,是一個很值得學習的課題。在本文中,作者結(jié)合自身的經(jīng)驗,淺要的談一談項目中的程序設計思路與步驟。
我們平時在學習開發(fā)板、示例程序或者demo的時候,會發(fā)現(xiàn)這種程序設計都是單一的外設或者功能,功能實現(xiàn)就算演示成功。但是在實際的項目設計過程中,往往需要設計的程序是非常龐大且復雜的,項目的功能和項目需求可能會超級多。此時在程序設計中,既要使MCU同時兼顧各個外設而不發(fā)生沖突,又要合理的設計程序構(gòu)架,使所有的需求都能邏輯清晰的實現(xiàn)相關(guān)功能。
所以程序設計一定要有思路。當我們拿到一份項目需求的時候,不能一上來就敲代碼,最后隨跳躍的思維寫出來的程序邏輯把自己都繞暈了還沒能實現(xiàn)所有功能。就像蓋高樓前一定要有圖紙一樣,在進行程序設計前也要有程序構(gòu)架。
程序框架與底層無關(guān),它重在整體需求的實現(xiàn)與邏輯關(guān)系。例如我們把一個具體的項目需求細化為10個具體的任務,每個任務都完成一些特定的功能。先忽略每個任務里的內(nèi)容,這10個任務和它們之間的切換邏輯就組成了此項目的程序構(gòu)架。
有了程序設計構(gòu)架,接下來就是實現(xiàn)每一個任務具體的功能,不同的部分分模塊編寫,例如外設單獨寫一個文件,傳感器驅(qū)動單獨列一個文件,所有文件之間相互獨立,這樣不僅思路清晰,且在排查問題的時候,能直接屏蔽某一個文件,更快速的定位問題所在。
有了思路之后,接下來我們談一談具體的設計步驟。假設此時我們拿到了一個具體的項目需求書。
1 項目規(guī)劃
首先把需求拆分,分為一個個任務,每一個任務去實現(xiàn)相應的部分功能,設計好任務之間的切換條件。此時暫且不考慮底層,只是列出所有任務和任務之間的邏輯切換關(guān)系,這樣就有了程序構(gòu)架,然后再規(guī)劃每個任務里面里面需要多少具體功能,列出來一個表,或者寫成空函數(shù)先放著。列完每個任務的具體功能之后,我們再回頭看需求書,是否所有功能都實現(xiàn),且它們之間的切換關(guān)系邏輯都很清晰。
2 功能模塊化
第一步完成之后,整體的系統(tǒng)構(gòu)架和邏輯關(guān)系就一清二楚了,接下來我們按照第一步中列的每個任務的功能表,去完成具體功能實現(xiàn)。此時,還不急著敲代碼,繼續(xù)規(guī)劃。我們知道,對于MCU來講,通常所有的功能最終是要通過調(diào)用底層實現(xiàn)。所以接下來我們要規(guī)劃需要多少底層的資源,根據(jù)第一條中任務具體的功能列表,我們列一個底層驅(qū)動表。例如功能需要使用UART,SPI等這些外設資源,所有外設資源列成一個外設表,表中是所有需要使用的外設資源。如果還需要其他驅(qū)動,例如傳感器、LCD、FLASH等,所有器件列一個器件驅(qū)動表。
3 編寫外設驅(qū)動
有了第一步和第二步從上向下的規(guī)劃,此時我們應該已經(jīng)很清楚這個項目需求書如何變成代碼實現(xiàn)。此時,開始編寫程序,從下向上,逐層編寫。
首先要根據(jù)外設表編寫每個外設對應的驅(qū)動,每個外設驅(qū)動單獨列一個文件,編寫好之后驗證功能是否正常,這個步驟跟本文開頭提到的開發(fā)板示例程序類似,很基礎(chǔ)。如果同一個外設,需要同時實現(xiàn)幾路輸出或輸入,例如需要三個不同的IIC輸出,那就同時啟動三路IIC驗證功能是否都正常,每一路之間會不會有干擾。
每編寫一個驅(qū)動,一定要對驅(qū)動中的每一個函數(shù)進行功能驗證。只有底層沒問題,才能往上封裝。
4 編寫器件驅(qū)動
因為器件的驅(qū)動很多都是以外設驅(qū)動為基礎(chǔ)的,所以寫完外設驅(qū)動之后,利用外設驅(qū)動的函數(shù),去實現(xiàn)器件的驅(qū)動,例如FLASH,可能是SPI通信的,那么我們首先要寫好SPI驅(qū)動文件,然后調(diào)用SPI驅(qū)動文件,編寫FLASH驅(qū)動文件,完成具體的功能函數(shù),例如FLASH的擦除,讀寫等。
同樣,每一個編寫的器件驅(qū)動都要對每一個函數(shù)進行測試。
5 其它驅(qū)動的編寫
可能在項目中,還涉及到一些無關(guān)底層的東西,例如一些加密算法,復雜的數(shù)據(jù)處理算法,各類通信協(xié)議等??梢园衙恳活惙譃橐粋€模塊,編寫或者移植完之后一定要驗證每一個函數(shù)的功能。
6 實現(xiàn)任務里的功能函數(shù)
驅(qū)動文件都準備好了之后,就利用驅(qū)動文件,加上必要的數(shù)據(jù)處理,去完成任務里的每一個具體的功能函數(shù)。
同樣,每一個編寫的功能函數(shù)都要進行測試。保證功能正常實現(xiàn)。
7 任務測試
完成步驟6之后,要對每一個任務進行測試,看是否能實現(xiàn)規(guī)劃中要求的功能。
8 系統(tǒng)測試
完成步驟7之后,項目基本完工,因為每一層都是經(jīng)過測試的,所以整個系統(tǒng)也不會有太大問題,但是也可能存在一些例如邏輯或者資源沖突的錯誤。此時按照需求書要求的功能對整個系統(tǒng)進行反復測試,查找可能存在的問題,進一步完善程序。
9 注意事項
在整個設計過程中,還有一些其他的注意事項,例如:
如果開了很多中斷,一定要對每個中斷設置優(yōu)先級。明確哪個優(yōu)先級應該優(yōu)先處理。
相同優(yōu)先級下的兩個中斷,禁止在第一個中斷中觸發(fā)第二中斷,程序會卡死。
少用全局變量,系統(tǒng)運行時必要的變量和狀態(tài)可以都放在結(jié)構(gòu)體中。然后只定義一個結(jié)構(gòu)體變量。
當結(jié)構(gòu)體的成員為不同數(shù)據(jù)類型時,成員排序就顯得很重要,優(yōu)化排序會節(jié)約很多內(nèi)存。
結(jié)構(gòu)體做形參的時候,為減少??臻g的開支,最好設置結(jié)構(gòu)體指針類型的形參。
不可以返回指向??臻g的指針。
如果通信接收或者發(fā)送沒有硬件FIFO,可以編寫軟件FIFO,避免丟包。
所有變量要初始化具體數(shù)值,尤其是局部變量。
定義指針類型變量一定要初始化。
只在本文件里使用的函數(shù)或者全局變量,一定要加static。
頭文件中只能聲明,不可以定義。
一定要添加合適的注釋,大部分時候代碼不知自己看。
使用數(shù)據(jù)結(jié)構(gòu)存儲或者處理數(shù)據(jù),例如結(jié)構(gòu)體、枚舉、鏈表、隊列等。
看完這些步驟,是不是覺得復雜項目的程序設計原來也挺簡單的,那就愉快的開始程序設計之路吧。
審核編輯:湯梓紅
-
傳感器
+關(guān)注
關(guān)注
2576文章
54887瀏覽量
789804 -
mcu
+關(guān)注
關(guān)注
147文章
18844瀏覽量
394612 -
FlaSh
+關(guān)注
關(guān)注
10文章
1742瀏覽量
155290 -
程序設計
+關(guān)注
關(guān)注
3文章
263瀏覽量
31643
原文標題:淺談項目中的程序設計思路與步驟
文章出處:【微信號:玩轉(zhuǎn)單片機與嵌入式,微信公眾號:玩轉(zhuǎn)單片機與嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
淺談51系列單片機嵌入式程序設計
狀態(tài)機思路在單片機程序設計中的應用
狀態(tài)機思路在單片機程序設計中的應用
ARM體系結(jié)構(gòu)與程序設計
由傳統(tǒng)電工圖轉(zhuǎn)換為階梯圖的過程,淺談程序設計
dsp28335如何入門:程序設計步驟
面向?qū)ο蟮?b class='flag-5'>程序設計總結(jié)與過程化程序設計有什么區(qū)別?
PLC編程中程序設計的步驟
淺談機場能源管理系統(tǒng)改造項目設計思路
淺談項目中的程序設計思路與步驟
評論