當前位置:編程學習大全網 - 源碼下載 - 快速學習單片機編程的方法

快速學習單片機編程的方法

單片機匯編語言編程規範

軟件設計更多地是壹種工程,而不是壹種個人藝術。如果不統壹編程規範,最終寫出的程序,其可讀性將較差,這

不僅給代碼的理解帶來障礙,增加維護階段的工作量,同時不規範的代碼隱含錯誤的可能性也比較大。分析表明,編碼

階段產生的錯誤當中,語法錯誤大概占20%左右,而由於未嚴格檢查軟件邏輯導致的錯誤、函數(模塊)之間接口錯誤

及由於代碼可理解度低導致優化維護階段對代碼的錯誤修改引起的錯誤則占了壹半以上。可見,提高軟件質量必須降低

編碼階段的錯誤率。如何有效降低編碼階段的錯誤呢?這需要制定詳細的軟件編程規範,並培訓每壹位程序員,最終的

結果可以把編碼階段的錯誤降至10%左右,同時也降低了程序的測試費用,效果相當顯著。

本文從代碼的可維護性(可讀性、可理解性、可修改性)、代碼邏輯與效率、函數(模塊)接口、可測試性四個方

面闡述了軟件編程規範,規範分成規則和建議兩種,其中規則部分為強制執行項目,而建議部分則不作強制,可根據習

慣取舍。

1.排版

規則 1

程序塊使用縮進方式,函數和標號使用空格縮進,程序段混合使用TAB 和空格縮進。縮進的目的是使程序結構清晰,便

於閱讀和理解。

<TAB>默認寬度應為8 個空格,由於Word 中<TAB>為4 個空格,為示範清晰,此處用2 個<TAB>代替(下同)。

例如:

MOV R1, #00H

MOV R2, #00H

MOV PMR, #PMRNORMAL

MOV DPS, #FLAGDPTR

MOV DPTR, #ADDREEPROM

read1kloop:

read1kpage:

INC R1

MOVX A, @DPTR

MOV SBUF, A

JNB TI, $

CLR TI

INC DPTR

CJNE R1, #20H, read1kpage

INC R2

MOV R1, #00H

CPL WDI

CJNE R2, #20H, read1kloop ;END OF EEPROM

規則2

在指令的操作數之間的,使用空格進行間隔,采用這種松散方式編寫代碼的目的是使代碼更加清晰。

例如:

CJNE R2, #20H, read1kloop ;END OF EEPROM

規則 3

壹行最多寫壹條語句。

規則 4

變量定義時,保持對齊。便於閱讀和檢查內存的使用情況。

例如:

RegLEDLOSS EQU 30H ; VARIABLE ;

TESTLED==RegLEDLOSS.0

RegLEDRA EQU 31H ; VARIABLE

RUNLED_Flag EQU 32H ; VARIABLE ;

256ms 改變壹次RUNLED 狀態

RUNLED_Def EQU 10H ; STATIC ;

16*32ms=500ms 改變壹次LED 狀態

2.註釋

註釋的原則是有助於對程序的閱讀理解,註釋不宜太多也不能太少,太少不利於代碼理解,太多則會對閱讀產生幹擾,

因此只在必要的地方才加註釋,而且註釋要準確、易懂、盡可能簡潔。註釋量壹般控制在30%到50%之間。

規則 1

程序在必要的地方必須有註釋,註釋要準確、易懂、簡潔。

例如如下註釋意義不大:

MOV DXCE1COUNTER, #00H ; 將DXCE1COUNTER 賦值為0

而如下的註釋則給出了額外有用的信息:

JNZ PcComm_Err ; 假如校驗出錯

規則 2

註釋應與其描述的代碼相近,對代碼的註釋應放在其上方或右方(對單條語句的註釋)相鄰位置,不可放在下面,如放

於上方則需與其上面的代碼用空行隔開。

規則 3

頭文件、源文件的頭部,應進行註釋。註釋必須列出:文件名、作者、目的、功能、修改日誌等。

規則 4

函數頭部應進行註釋,列出:函數的目的、功能、輸入參數、輸出參數、涉及到的通用變量和寄存器、調用的其他函數

和模塊、修改日誌等。對壹些復雜的函數,在註釋中最好提供典型用法。

規則 5

對重要代碼段的功能、意圖進行註釋,提供有用的、額外的信息。並在該代碼段的結束處加壹行註釋表示該段代碼結束。

規則 6

對於所有的常量,變量,數據結構聲明(包括數組、結構、類、枚舉等),如果其命名不是充分自註釋的,在聲明時都必

須加以註釋,說明其含義。

規則 7

維護代碼時,要更新相應的註釋,刪除不再有用的註釋。保持代碼、註釋的壹致性,避免產生誤解。

3.命名

規則 1

標識符縮寫

形成縮寫的幾種技術:

1) 去掉所有的不在詞頭的元音字母。如screen 寫成scrn, primtive 寫成prmv。

2) 使用每個單詞的頭壹個或幾個字母。如Channel Activation 寫成ChanActiv,ReleaseIndication 寫成RelInd。

3) 使用變量名中每個有典型意義的單詞。如Count of Failure 寫成FailCnt。

4) 去掉無用的單詞後綴 ing, ed 等。如Paging Request 寫成PagReq。

5) 使用標準的或慣用的縮寫形式(包括協議文件中出現的縮寫形式)。

如 BSIC(Base Station Identification Code)、MAP(Mobile Application Part)。

關於縮寫的準則:

1) 縮寫應該保持壹致性。如Channel 不要有時縮寫成Chan,有時縮寫成C

h。Length 有時縮寫成Len,有時縮寫成len。

2) 在源代碼頭部加入註解來說明協議相關的、非通用縮寫。

3) 標識符的長度不超過12 個字符。

規則 2

變量命名約定:<前綴> + 主體 ; 註釋

變量命名要考慮簡單、直觀、不易混淆。

前綴是可選項,表示變量類型,由於匯編中變量多是單字節變量,所以單字節變量可以不加前綴,對於 bit 和雙字節型

變量,使用小寫的b 和d 作為前綴表示。

主體是必選項,可多個單詞(或縮寫)合在壹起,每個單詞首字母大寫,其余部分小寫。

規則 3

常量的命名

常量的命名規則:單詞的字母全部大寫,各單詞之間用下劃線隔開。

規則 4

函數的命名

單詞首字母為大寫,其余均為小寫。函數名應以壹個動詞開頭,即函數名應類似壹個動詞斷語或祈使句。

例如:Test_Protect, Check_EEPROM, Init_Para

4.可維護性

規則 1

函數和過程中關系較為緊密的代碼盡可能相鄰。

規則 2

每個函數的源程序行數原則上應該少於200 行。對於消息分流處理函數,完成的功能統壹,但由於消息的種類多,可能

超過200 行的限制,不屬於違反規定。

規則 3

語句嵌套層次不得超過5 層。嵌套層次太多,增加了代碼的復雜度及測試的難度,容易出錯,增加代碼維護的難度。

規則 4

避免相同的代碼段在多個地方出現。當某段代碼需在不同的地方重復使用時,應根據代碼段的規模大小使用函數調用或

宏調用的方式代替。這樣,對該代碼段的修改就可在壹處完成,增強代碼的可維護性。

規則 5

每個函數完成單壹的功能,不設計多用途面面俱到的函數。多功能集於壹身的函數,很可能使函數的理解、測試、維護

等變得困難。使函數功能明確化,增加程序可讀性,亦可方便維護、測試。

規則 6

在函數的項目維護文檔中,應該指出軟件適用的硬件平臺及版本。

建議 1

使用專門的初始化函數對所有的公***變量進行初始化。

5.程序正確性、效率

規則 1

嚴禁使用未經初始化的變量。引用未經初始化的變量可能會產生不可預知的後果,特別是引用未經初始化的指針經常會

導致系統崩潰,需特別註意。

規則 2

防止內存操作越界。

說明:內存操作越界是軟件系統主要錯誤之壹,後果往往非常嚴重。

規則 3

註意變量的有效取值範圍,防止表達式出現上溢或下溢。

規則 4

防止易混淆的指令和操作數拼寫錯誤。

規則 5

避免函數中不必要語句,防止程序中的垃圾代碼,預留代碼應以註釋的方式出現。程序中的垃圾代碼不僅占用額外的空

間,而且還常常影響程序的功能與性能,很可能給程序的測試、維護等造成不必要的麻煩。

規則 6

通過對系統數據結構的劃分與組織的改進,以及對程序算法的優化來提高空間效率。這種方式是解決軟件空間效率的根

本辦法。

規則 7

循環體內工作量最小化。應仔細考慮循環體內的語句是否可以放在循環體之外,使循環體內工作量最小,從而提高程序

的時間效率。

規則 8

在多重循環中,應將最忙的循環放在最內層。

規則 9

避免循環體內含判斷語句,將與循環變量無關的判斷語句移到循環體外。目的是減少判斷次數。循環體中的判斷語句是

否可以移到循環體外,要視程序的具體情況而言,壹般情況,與循環變量無關的判斷語句可以移到循環體外,而有關的

則不可以。

規則 10

中斷和恢復

中斷程序應該盡量短,應該在中斷中進行標記,在主程序中處理。但實時性很高的程序段例外。

中斷時應該保存所有涉及到的通用變量和寄存器,如 A, PSW, DPTR 等。

規則 11

堆棧設置

堆棧對於程序非常重要,對於堆棧的設置要合理。堆棧太小,在嵌套調用和容易溢出,造成系統故障;堆棧太大,浪費

RAM 資源。為了節約堆棧資源,中斷時要求不要保存太多資源,中斷嵌套和程序嵌套層數不要太多,盡量不要超過5

層。這就要求合理的劃分功能模塊。

規則 12

看門狗

看門狗電路用於在單片機死機時自動復位。單片機需要定時向看門狗發送脈沖,俗稱”餵狗”。餵狗不可太勤,這樣看門

狗沒有起到作用;也不可太慢,這樣容易造成單片機復位。正確的餵狗應該在主循環中進行,最好是建立壹個獨立的系

統監控進程。不可以在定時中斷中餵狗,應為單片機有時可能會在主循環中死掉。

6.接口

規則 1

去掉沒有必要的公***變量,編程時應盡量少用公***變量。公***變量是增大模塊間耦合的原因之壹,故應減少沒必要的公

***變量以降低模塊間的耦合度。應該構造僅有壹個模塊或函數可以修改、創建,而其余有關模塊或函數只訪問的公***變

量,防止多個不同模塊或函數都可以修改、創建同壹公***變量的現象。

規則 2

當向公***變量傳遞數據時,要防止越界現象發生。對公***變量賦值時,若有必要應進行合法性檢查,以提高代碼的可靠

性、穩定性。

規則 3

盡量不設計多參數函數,將不使用的參數從接口中去掉,降低接口復雜度,減少函數間接口的復雜度。

規則 4

對所調用函數的返回碼要仔細、全面地處理。防止把錯誤傳遞到後面的處理流程。如有意不檢查其返回碼,應明確指明。

規則5

檢查接口函數所有輸入參數的有效性。

規則 6

檢查函數的所有非參數輸入,如外部數據、公***變量等。

7.代碼可測性

規則 1

模塊編寫應該有完善的測試方面的考慮。

規則 2

源代碼中應該設計了代碼測試的內容。

在編寫代碼之前,應預先設計好程序調試與測試的方法和手段,並設計好各種調測開關及相應測試代碼。程序的調試與

測試是軟件生存周期中很重要的壹個階段,如何對軟件進行較全面、高率的測試並盡可能地找出軟件中的錯誤就成為很

關鍵的問題。因此在編寫源代碼之前,除了要有壹套比較完善的測試計劃外,還應設計出壹系列代碼測試手段,為單元

測試、集成測試及系統聯調提供方便。

規則 3

在同壹項目組或產品組內,要有壹套統壹的為集成測試與系統聯調準備的調測開關及相應函數,並且要有詳細的說明。

本規則是針對項目組或產品組的。

規則 4

在同壹項目組或產品組內,調測打印出的信息串的格式要有統壹的形式。信息串中至少要有所在模塊名(或源文件名)

及行號。統壹的調測信息格式便於集成測試。

規則 5

正式軟件產品中應把調測代碼去掉(即把有關的調測開關關掉)。

規則 6

用調測開關來切換軟件的DEBUG 版和正式版,而不要同時存在正式版本和DEBUG 版本的不同源文件,以減少維護的

難度。

規則 7

在軟件系統中設置與取消有關測試手段,不能對軟件實現的功能等產生影響。即有測試代碼的軟件和關掉測試代碼的軟

件,在功能行為上應壹致。

規則 8

發現錯誤應該立即修改,並且若有必要記錄下來。

規則 9

開發人員應堅持對代碼進行徹底的測試(單元測試),而不依靠他人或測試組來發現問題。

規則 10

清理、整理或優化後的代碼要經過審查及測試。

規則 11

代碼版本升級要經過嚴格測試。

8.代碼編譯

規則 1

打開編譯器的所有告警開關對程序進行編譯。防止隱藏可能是錯誤的告警。

規則 2

某些語句經編譯後產生告警,但如果妳認為它是正確的,那麽應通過某種手段去掉告警信息。照著規範系統的學習,不久的將來妳也是個高手了。

  • 上一篇:美團外賣是線上到線下嗎?
  • 下一篇:解釋下面壹個匯編程序每壹行代碼的意思功能.
  • copyright 2024編程學習大全網