51微控制器書寫規範學習比較?

51微控制器C語言學習筆記8:微控制器C51程式設計規範

在網上找到這份微控制器C51程式設計規範,覺得很有用,決定在以後自己編C51程式的時候用上。

1微控制器C51程式設計規範-前言為了提高源程式的質量和可維護性,從而最終提高軟體產品生產力,特編寫此規範。

2 微控制器C51程式設計規範-範圍

本標準規定了程式設計人員進行程式設計時必須遵循的規範。本規範主要針對C51程式語言和keil編譯器而言,包括排版、註釋、命名、變數使用、程式碼可測性、程式效率、質量保證等內容。

3 微控制器C51程式設計規範-總則l 格式清晰l 註釋簡明扼要l 命名規範易懂l 函式模組化l 程式易讀易維護l 功能準確實現l 程式碼空間效率和時間效率高l 適度的可擴充套件性

4 微控制器C51程式設計規範-資料型別定義

程式設計時統一採用下述新型別名的方式定義資料型別:

建立一個datatype.h檔案,在該檔案中進行如下定義:

typedefbitbool;// 位變數

typedef unsigned charuint8; // 無符號8位整型變數

typedef signedcharint8;// 有符號8位整型變數 //

typedef unsigned intuint16; // 無符號16位整型變數 //

typedef signed intint16; // 有符號16位整型變數 //

typedef unsigned longuint32; // 無符號32位整型變數 //

typedef signed longint32; // 有符號32位整型變數 //

typedef floatfp32;// 單精度浮點數(32位長度) //

typedef double fp64;// 雙精度浮點數(64位長度) //

5 微控制器C51程式設計規範-識別符號命名5.1 命名基本原則l 命名要清晰明瞭,有明確含義,使用完整單詞或約定俗成的縮寫。通常,較短的單詞可通過去掉母音字母形成縮寫;較長的單詞可取單詞的頭幾個字母形成縮寫。即"見名知意"。l 命名風格要自始至終保持一致。l 命名中若使用特殊約定或縮寫,要有註釋說明。l 除了編譯開關/標頭檔案等特殊應用,應避免使用以下劃線開始和/或結尾的定義。l 同一軟體產品內模組之間介面部分的識別符號名稱之前加上模組標識。5.2 巨集和常量命名巨集和常量用全部大寫字母來命名,詞與詞之間用下劃線分隔。對程式中用到的數字均應用有意義的列舉或巨集來代替。5.3 變數命名變數名用小寫字母命名,每個詞的第一個字母大寫。型別字首(u8s8 etc.)全域性變數另加字首g_。區域性變數應簡明扼要。區域性迴圈體控制變數優先使用i、j、k等;區域性長度變數優先使用len、num等;

臨時中間變數優先使用temp、tmp等。5.4 函式命名函式名用小寫字母命名,每個詞的第一個字母大寫,並將模組標識加在最前面。5.5 檔案命名一個檔案包含一類功能或一個模組的所有函式,檔名稱應清楚表明其功能或性質。每個.c檔案應該有一個同名的.h檔案作為標頭檔案。6 微控制器C51程式設計規範-註釋6.1 註釋基本原則l 有助於對程式的閱讀理解,說明程式在"做什麼",解釋程式碼的目的、功能和採用的方法。l 一般情況源程式有效註釋量在30%左右。l 註釋語言必須準確、易懂、簡潔。l 邊寫程式碼邊註釋,修改程式碼同時修改相應的註釋,不再有用的註釋要刪除。6.2 檔案註釋檔案註釋必須說明檔名、函式功能、建立人、建立日期、版本資訊等相關資訊。修改檔案程式碼時,應在檔案註釋中記錄修改日期、修改人員,並簡要說明此次修改的目的。所有修改記錄必須保持完整。檔案註釋放在檔案頂端,用"/*……*/"格式包含。註釋文字每行縮排4個空格;每個註釋文字分項名稱應對齊。

/***********************************************************

檔名稱:作者:版本:說明:修改記錄:

***********************************************************/

6.3 函式註釋6.3.1函式頭部註釋函式頭部註釋應包括函式名稱、函式功能、入口引數、出口引數等內容。如有必要還可增加作者、建立日期、修改記錄(備註)等相關專案。函式頭部註釋放在每個函式的頂端,用"/*……*/"的格式包含。其中函式名稱應簡寫為FunctionName(),不加入、出口引數等資訊。

/***********************************************************

函式名稱:函式功能:入口引數:出口引數:備註:

***********************************************************/

6.3.2程式碼註釋程式碼註釋應與被註釋的程式碼緊鄰,放在其上方或右方,不可放在下面。如放於上方則需與其上面的程式碼用空行隔開。一般少量註釋應該新增在被註釋語句的行尾,一個函式內的多個註釋左對齊;較多註釋則應加在上方且註釋行與被註釋的語句左對齊。函式程式碼註釋用"//…//"的格式。通常,分支語句(條件分支、迴圈語句等)必須編寫註釋。其程式塊結束行"}"的右方應加表明該程式塊結束的標記"end of ……", 尤其在多重巢狀時。6.4 變數、常量、巨集的註釋同一型別的識別符號應集中定義,並在定義之前一行對其共性加以統一註釋。對單個識別符號的註釋加在定義語句的行尾。全域性變數一定要有詳細的註釋,包括其功能、取值範圍、哪些函式或過程存取它以及存取時的注意事項等。註釋用"//…//"的格式。

7 微控制器C51程式設計規範-函式7.1 設計原則函式的基本要求:

1 正確性:程式要實現設計要求的功能。

2 穩定性和安全性:程式執行穩定、可靠、安全。

3 可測試性:程式便於測試和評價。

4 規範/可讀性:程式書寫風格、命名規則等符合規範。

5 擴充套件性:程式碼為下一次升級擴充套件留有空間和介面。

6 全域性效率:軟體系統的整體效率高。

7 區域性效率:某個模組/子模組/函式的本身效率高。編制函式的基本原則:

8 單個函式的規模儘量限制在200行以內(不包括註釋和空行)。一個函式只完成一個功能。

9 函式區域性變數的數目一般不超過5~10個。

10 函式內部區域性變數定義區和功能實現區(包含變數初始化)之間空一行。

11 函式名應準確描述函式的功能。通常使用動賓片語為執行某操作的函式命名。

12 函式的返回值要清楚明瞭,尤其是出錯返回值的意義要準確無誤。

13 不要把與函式返回值型別不同的變數,以編譯系統預設的轉換方式或強制的轉換方式作為返回值返回。

14 減少函式本身或函式間的遞迴呼叫。

15 儘量不要將函式的引數作為工作變數。7.2 函式定義

16 函式若沒有入口引數或者出口引數,應用void明確申明。

17 函式名稱與出口引數型別定義間應該空一格且只空一格。

18 函式名稱與括號()之間無空格。

19 函式形參必須給出明確的型別定義。

20 多個形參的函式,後一個形參與前一個形參的逗號分割符之間新增一個空格。

21 函式體的前後花括號"{}" 各獨佔一行。7.3 區域性變數定義

22 同一行內不要定義過多變數。

23 同一類的變數在同一行內定義,或者在相鄰行定義。

24 先定義data型變數,再定義idtata型變數,再定義xdata型變數.

25 陣列、指標等複雜型別的定義放在定義區的最後。

26變數定義區不做較複雜的變數賦值。7.4 功能實現區規範l 一行只寫一條語句。

27 注意運算子的優先順序,並用括號明確表示式的操作順序,避免使用預設優先順序。

28 各程式段之間使用一個空行分隔,加以必要的註釋。程式段指能完一個較具體的功能的一行或多行程式碼。程式段內的各行程式碼之間相互依賴性較強。

29 不要使用難懂的技巧性很高的語句。

30 源程式中關係較為緊密的程式碼應儘可能相鄰。

31 完成簡單功能、關係非常密切的一條或幾條語句可編寫為函式或定義為巨集。

32 微控制器C51程式設計規範-排版8.1 縮排程式碼的每一級均往右縮排4個空格的位置。

34 分行過長的語句(超過80個字元)要分成多行書寫;長表示式要在低優先順序操作符處劃分新行,操作符放在新行之首,劃分出的新行要進適當的縮排,使排版整齊,語句可讀。避免把註釋插入分行中。

35 空行l 檔案註釋區、標頭檔案引用區、函式間應該有且只有一行空行。

36 相鄰函式之間應該有且只有一行空行。

37 函式體內相對獨立的程式塊之間可以用一行空行或註釋來分隔。

38 函式註釋和對應的函式體之間不應該有空行。

39 檔案末尾有且只有一行空行。8.4 空格l 函式語句尾部或者註釋之後不能有空格。

40 括號內側(即左括號後面和右括號前面)不加空格,多重括號間不加空格。

41函式形參之間應該有且只有一個空格(形參逗號後面加空格)。

42 同一行中定義的多個變數間應該有且只有一個空格(變數逗號後面加空格)。

43 表示式中,若有多個操作符連寫的情況,應使用空格對它們分隔:在兩個以上的關鍵字、變數、常量進行對等操作時,它們之間的操作符前後均加一個空格;在兩個以上的關鍵字、變數、常量進行非對等操作時,其前後均不應加空格;逗號只在後面加空格;雙目操作符,如比較操作符, 賦值操作符"="、"+=",算術操作符"+"、"%",邏輯操作符"&&"、"&",位操作符"<<"、"^"等,前後均加一個空格;單目操作符,如"!"、"~"、"++"、"-"、"&"(地址運算子)等,前後不加空格;"->"、"."前後不加空格;if、for、while、switch等關鍵字與後面的括號間加一個空格;

44 花括號l if、else if、else、for、while語句無論其執行體是一條語句還是多條語句都必須加花括號,且左右花括號各獨佔一行。

45 do{}while()結構中,"do"和"{"均各佔一行,"}"和"while();"共同佔用一行。if ( ) do { { } }while( ); else { }

47 switch語句l 每個case和其判據條件獨佔一行。

48 每個case程式塊需用break結束。特殊情況下需要從一個case塊順序執行到下一個case塊的時候除外,但需要在交界處明確註釋如此操作的原因,以防止出錯。

49 case程式塊之間空一行,且只空一行。

50 每個case程式塊的執行語句保持4個空格的縮排。

51一般情況下都應該包含default分支。Switch ( ) { case x: break; case x: break; default: break; }

52 微控制器C51程式設計規範-程式結構9.1 基本要求l 有main()函式的.c檔案應將main()放在最前面,並明確用void宣告引數和返回值。

53 對由多個.c檔案組成的模組程式或完整監控程式,建立公共引用標頭檔案,將需要引用的庫標頭檔案、標準暫存器定義標頭檔案、自定義的標頭檔案、全域性變數等均包含在內,供每個檔案引用。通常,標準函式庫標頭檔案採用尖角號< >標誌檔名,自定義標頭檔案採用雙撇號″″標誌檔名。

54 每個.c檔案有一個對應的.h檔案,.c檔案的註釋之後首先定義一個唯一的檔案標誌巨集,並在對應的.h檔案中解析該標誌。在.c檔案中:#define FILE_FLAG 在.h檔案中:#ifdef FILE_FLAG #define XXX #else #define XXX extern #endif l 對於確定只被某個.c檔案呼叫的定義可以單獨列在一個頭檔案中、單獨呼叫。

55可重入函式可重入函式中若使用了全域性變數,應通過關中斷、訊號量等操作手段對其加以保護。

56 函式的形參l 由函式呼叫者負責檢查形參的合法性。

57 儘量避免將形參作為工作變數使用。

58 迴圈

59儘量減少迴圈巢狀層數

60 在多重迴圈中,應將最忙的迴圈放在最內層l 迴圈體內工作量最小

61 儘量避免迴圈體內含有判斷語句

相關問題答案