為了提高源程序的質(zhì)量和可維護(hù)性,從而最終提高軟件產(chǎn)品生產(chǎn)力,特編寫(xiě)此規(guī)范。本標(biāo)準(zhǔn)規(guī)定了程序設(shè)計(jì)人員進(jìn)行程序設(shè)計(jì)時(shí)必須遵循的規(guī)范。本規(guī)范主要針對(duì)單片機(jī)編程語(yǔ)言和08編譯器而言,包括排版、注釋、命名、變量使用、代碼可測(cè)性、程序效率、質(zhì)量保證等內(nèi)容。
1.基本規(guī)則
格式清晰、注釋簡(jiǎn)明扼要、命名規(guī)范易懂、函數(shù)模塊化、程序易讀易維護(hù)、功能準(zhǔn)確實(shí)現(xiàn)、代碼空間效率和時(shí)間效率高、適度的可擴(kuò)展性、單片機(jī)編程規(guī)范-標(biāo)識(shí)符命名
2.標(biāo)識(shí)符命名
2.1 命名基本原則
(1)命名清晰明了,有明確含義,使用完整單詞或約定俗成的縮寫(xiě)。通常,較短的單詞可通過(guò)去掉元音字母形成縮寫(xiě);較長(zhǎng)的單詞可取單詞的頭幾個(gè)字母形成縮寫(xiě)。即"見(jiàn)名知意"。(2)命名風(fēng)格要自始至終保持一致。
(3)命名中若使用特殊約定或縮寫(xiě),要有注釋說(shuō)明。 (4)同一軟件產(chǎn)品內(nèi)模塊之間接口部分的標(biāo)識(shí)符名稱(chēng)之前加上模塊標(biāo)識(shí)。 2.2 宏和常量命名
宏和常量用全部大寫(xiě)字母來(lái)命名,詞與詞之間用下劃線分隔。對(duì)程序中用到的數(shù)字均應(yīng)用有意義的枚舉或宏來(lái)代替。 2.3 變量命名
變量名用小寫(xiě)字母命名,每個(gè)詞的第一個(gè)字母大寫(xiě)。類(lèi)型前綴(u8\s8 etc.)全局變量另加前綴g_。 局部變量應(yīng)簡(jiǎn)明扼要。局部循環(huán)體控制變量?jī)?yōu)先使用i、j、k等;局部長(zhǎng)度變量?jī)?yōu)先使用len、num等;臨時(shí)中間變量?jī)?yōu)先使用temp、tmp等。 2.4 函數(shù)命名
函數(shù)名用小寫(xiě)字母命名,每個(gè)詞的第一個(gè)字母大寫(xiě),并將模塊標(biāo)識(shí)加在最前面。 2.5 文件命名
一個(gè)文件包含一類(lèi)功能或一個(gè)模塊的所有函數(shù),文件名稱(chēng)應(yīng)清楚表明其功能或性質(zhì)。 每個(gè).c文件應(yīng)該有一個(gè)同名的.h文件作為頭文件。
3.注釋 3.1 注釋基本原則
有助于對(duì)程序的閱讀理解,說(shuō)明程序在"做什么",解釋代碼的目的、功能和采用的方法。 一般情況源程序有效注釋量在30%左右。 注釋語(yǔ)言必須準(zhǔn)確、易懂、簡(jiǎn)潔。 邊寫(xiě)代碼邊注釋?zhuān)薷拇a同時(shí)修改相應(yīng)的注釋?zhuān)辉儆杏玫淖⑨屢獎(jiǎng)h除。 匯編和C中都用"//",取消";" 不使用段注釋" /* */ "(調(diào)試時(shí)可用)
3.2 文件注釋
文件注釋必須說(shuō)明文件名、函數(shù)功能、創(chuàng)建人、創(chuàng)建日期、版本信息等相關(guān)信息。 修改文件代碼時(shí),應(yīng)在文件注釋中記錄修改日期、修改人員,并簡(jiǎn)要說(shuō)明此次修改的目的。所有修改記錄必須保持完整。 文件注釋放在文件頂端,用"/*……*/"格式包含。 注釋文本每行縮進(jìn)4個(gè)空格;每個(gè)注釋文本分項(xiàng)名稱(chēng)應(yīng)對(duì)齊。 /*********************************************************** 文件名稱(chēng): 作 者: 版 本: 說(shuō) 明: 修改記錄: ***********************************************************/ 3.3 函數(shù)注釋
3.3.1 函數(shù)頭部注釋 函數(shù)頭部注釋?xiě)?yīng)包括函數(shù)名稱(chēng)、函數(shù)功能、入口參數(shù)、出口參數(shù)等內(nèi)容。如有必要還可增加作者、創(chuàng)建日期、修改記錄(備注)等相關(guān)項(xiàng)目。 函數(shù)頭部注釋放在每個(gè)函數(shù)的頂端,用"/*……*/"的格式包含。其中函數(shù)名稱(chēng)應(yīng)簡(jiǎn)寫(xiě)為FunctionName(),不加入、出口參數(shù)等信息。 /*********************************************************** 函數(shù)名稱(chēng): 函數(shù)功能: 入口參數(shù): 出口參數(shù): 備 注: ***********************************************************/ 3.3.2 代碼注釋 代碼注釋?xiě)?yīng)與被注釋的代碼緊鄰,放在其上方或右方,不可放在下面。如放于上方則需與其上面的代碼用空行隔開(kāi)。一般少量注釋?xiě)?yīng)該添加在被注釋語(yǔ)句的行尾,一個(gè)函數(shù)內(nèi)的多個(gè)注釋左對(duì)齊;較多注釋則應(yīng)加在上方且注釋行與被注釋的語(yǔ)句左對(duì)齊。 函數(shù)代碼注釋用"//…//"的格式。 通常,分支語(yǔ)句(條件分支、循環(huán)語(yǔ)句等)必須編寫(xiě)注釋。其程序塊結(jié)束行"}"的右方應(yīng)加表明該程序塊結(jié)束的標(biāo)記"end of ……", 尤其在多重嵌套時(shí)。 3.4 變量、常量、宏的注釋
同一類(lèi)型的標(biāo)識(shí)符應(yīng)集中定義,并在定義之前一行對(duì)其共性加以統(tǒng)一注釋。對(duì)單個(gè)標(biāo)識(shí)符的注釋加在定義語(yǔ)句的行尾。 全局變量一定要有詳細(xì)的注釋?zhuān)ㄆ涔δ堋⑷≈捣秶、哪些函?shù)或過(guò)程存取它以及存取時(shí)的注意事項(xiàng)等。 注釋用"//…//"的格式。
4.函數(shù) 4.1 函數(shù)設(shè)計(jì)原則
函數(shù)的基本要求:
1)封裝性 1) 正確性:程序要實(shí)現(xiàn)設(shè)計(jì)要求的功能。 2) 穩(wěn)定性和安全性:程序運(yùn)行穩(wěn)定、可靠、安全。 3) 可測(cè)試性:程序便于測(cè)試和評(píng)價(jià)。 4) 規(guī)范/可讀性:程序書(shū)寫(xiě)風(fēng)格、命名規(guī)則等符合規(guī)范。 5) 擴(kuò)展性:代碼為下一次升級(jí)擴(kuò)展留有空間和接口。 6) 全局效率:軟件系統(tǒng)的整體效率高。 7) 局部效率:某個(gè)模塊/子模塊/函數(shù)的本身效率高。
編制函數(shù)的基本原則: 1) 單個(gè)函數(shù)的規(guī)模盡量限制在200行以?xún)?nèi)(不包括注釋和空行)。一個(gè)函數(shù)只完成一個(gè)功能。 2) 函數(shù)局部變量的數(shù)目一般不超過(guò)5~10個(gè)。 3) 函數(shù)內(nèi)部局部變量定義區(qū)和功能實(shí)現(xiàn)區(qū)(包含變量初始化)之間空一行。 4) 函數(shù)名應(yīng)準(zhǔn)確描述函數(shù)的功能。通常使用動(dòng)賓詞組為執(zhí)行某操作的函數(shù)命名。 5) 函數(shù)的返回值要清楚明了,尤其是出錯(cuò)返回值的意義要準(zhǔn)確無(wú)誤。 6) 不要把與函數(shù)返回值類(lèi)型不同的變量,以編譯系統(tǒng)默認(rèn)的轉(zhuǎn)換方式或強(qiáng)制的轉(zhuǎn)換方式作為返回值返回。 7) 減少函數(shù)本身或函數(shù)間的遞歸調(diào)用。 8) 盡量不要將函數(shù)的參數(shù)作為工作變量。 4.2 函數(shù)定義
1) 函數(shù)若沒(méi)有入口參數(shù)或者出口參數(shù),應(yīng)用void明確申明。 2) 函數(shù)名稱(chēng)與出口參數(shù)類(lèi)型定義間應(yīng)該空一格且只空一格。 3) 函數(shù)名稱(chēng)與括號(hào)()之間無(wú)空格。 4) 函數(shù)形參必須給出明確的類(lèi)型定義。 5) 多個(gè)形參的函數(shù),后一個(gè)形參與前一個(gè)形參的逗號(hào)分割符之間添加一個(gè)空格。 6) 函數(shù)體的前后花括號(hào)"{}" 各獨(dú)占一行。 4.3 局部變量定義
1) 同一行內(nèi)不要定義過(guò)多變量。 2) 同一類(lèi)的變量在同一行內(nèi)定義,或者在相鄰行定義。 3) 先定義data型變量,再定義idtata型變量,再定義xdata型變量.(?) 4) 數(shù)組、指針等復(fù)雜類(lèi)型的定義放在定義區(qū)的最后。 5) 變量定義區(qū)不做較復(fù)雜的變量賦值。 4.4 功能實(shí)現(xiàn)區(qū)規(guī)范
1) 一行只寫(xiě)一條語(yǔ)句。 2) 注意運(yùn)算符的優(yōu)先級(jí),并用括號(hào)明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級(jí)。 3) 各程序段之間使用一個(gè)空行分隔,加以必要的注釋。程序段指能完一個(gè)較具體的功能的一行或多行代碼。程序段內(nèi)的各行代碼之間相互依賴(lài)性較強(qiáng)。(1、2、3方式) 4) 不要使用難懂的技巧性很高的語(yǔ)句。 5) 源程序中關(guān)系較為緊密的代碼應(yīng)盡可能相鄰。 6) 完成簡(jiǎn)單功能、關(guān)系非常密切的一條或幾條語(yǔ)句可編寫(xiě)為函數(shù)或定義為宏。
5. 單片機(jī)編程規(guī)范-排版 5.1 縮進(jìn)
代碼的每一級(jí)均往右縮進(jìn)4個(gè)空格的位置。 不使用Tab鍵
5.2 分行
每行語(yǔ)句(?????超過(guò)80個(gè)字符)要分成多行書(shū)寫(xiě);長(zhǎng)表達(dá)式要在低優(yōu)先級(jí)操作符處劃分新行,操作符放在新行之首,劃分出的新行要進(jìn)適當(dāng)?shù)目s進(jìn),使排版整齊,語(yǔ)句可讀。避免把注釋插入分行中。 5.3 空行
1) 文件注釋區(qū)、頭文件引用區(qū)、函數(shù)間應(yīng)該有且只有一行空行。 2) 相鄰函數(shù)之間應(yīng)該有且只有一行空行。 3) 函數(shù)體內(nèi)相對(duì)獨(dú)立的程序塊之間可以用一行空行或注釋來(lái)分隔。 4) 函數(shù)注釋和對(duì)應(yīng)的函數(shù)體之間不應(yīng)該有空行。 5) 文件末尾有且只有一行空行。 5.4 空格
1) 函數(shù)語(yǔ)句尾部或者注釋之后不能有空格。 2) 括號(hào)內(nèi)側(cè)(即左括號(hào)后面和右括號(hào)前面)不加空格,多重括號(hào)間不加空格。 3) 函數(shù)形參之間應(yīng)該有且只有一個(gè)空格(形參逗號(hào)后面加空格)。 4) 同一行中定義的多個(gè)變量間應(yīng)該有且只有一個(gè)空格(變量逗號(hào)后面加空格)。 5) 表達(dá)式中,若有多個(gè)操作符連寫(xiě)的情況,應(yīng)使用空格對(duì)它們分隔: 6) 在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行對(duì)等操作時(shí),它們之間的操作符前后均加一個(gè)空格;在兩個(gè)以上的關(guān)鍵字、變量、常量進(jìn)行非對(duì)等操作時(shí),其前后均不應(yīng)加空格; 7) 逗號(hào)只在后面加空格; 8) 雙目操作符,如比較操作符, 賦值操作符"="、"+=",算術(shù)操作符"+"、"%",邏輯操作符"&&"、"&",位操作符"<<"、"^"等,前后均加一個(gè)空格; 9) 單目操作符,如"!"、"~"、"++"、"-"、"&"(地址運(yùn)算符)等,前后不加空格; 10) "->"、"."前后不加空格; 11) if、for、while、switch等關(guān)鍵字與后面的括號(hào)間加一個(gè)空格; 5.5 花括號(hào)
1) if、else if、else、for、while語(yǔ)句無(wú)論其執(zhí)行體是一條語(yǔ)句還是多條語(yǔ)句都必須加花括號(hào),且左右花括號(hào)各獨(dú)占一行。 2) do{}while()結(jié)構(gòu)中,"do"和"{"均各占一行,"}"和"while();"共同占用一行。 if ( ) do { {
} }while( ); else {
} 嵌套越少越好,{}不準(zhǔn)超過(guò)3層
5.6 switch語(yǔ)句
1) 每個(gè)case和其判據(jù)條件獨(dú)占一行。 2) 每個(gè)case程序塊需用break結(jié)束。特殊情況下需要從一個(gè)case塊順序執(zhí)行到下一個(gè)case塊的時(shí)候除外,但需要花括號(hào)在交界處明確注釋如此操作的原因,以防止出錯(cuò)。 3) case程序塊之間空一行,且只空一行。 4) 每個(gè)case程序塊的執(zhí)行語(yǔ)句保持4個(gè)空格的縮進(jìn)。 5) 一般情況下都應(yīng)該包含default分支。 Switch ( ) { case x:
break;
case x:
break;
default:
break; }
6.程序結(jié)構(gòu) 6.1 基本要求
1) 有main()函數(shù)的.c文件應(yīng)將main()放在最前面,并明確用void聲明參數(shù)和返回值。 2) 對(duì)由多個(gè).c文件組成的模塊程序或完整監(jiān)控程序,建立公共引用頭文件,將需要引用的庫(kù)頭文件、標(biāo)準(zhǔn)寄存器定義頭文件、自定義的頭文件、全局變量等均包含在內(nèi),供每個(gè)文件引用。通常,標(biāo)準(zhǔn)函數(shù)庫(kù)頭文件采用尖角號(hào)< >標(biāo)志文件名,自定義頭文件采用雙撇號(hào)″″標(biāo)志文件名。 3) 每個(gè).c文件有一個(gè)對(duì)應(yīng)的.h文件,.c文件的注釋之后首先定義一個(gè)唯一的文件標(biāo)志宏,并在對(duì)應(yīng)的.h文件中解析該標(biāo)志。 在.c文件中: #define FILE_FLAG 在.h文件中:& 6.程序結(jié)構(gòu) 6.1 基本要求 1) 有main()函數(shù)的.c文件應(yīng)將main()放在最前面,并明確用void聲明參數(shù)和返回值。 2) 對(duì)由多個(gè).c文件組成的模塊程序或完整監(jiān)控程序,建立公共引用頭文件,將需要引用的庫(kù)頭文件、標(biāo)準(zhǔn)寄存器定義頭文件、自定義的頭文件、全局變量等均包含在內(nèi),供每個(gè)文件引用。通常,標(biāo)準(zhǔn)函數(shù)庫(kù)頭文件采用尖角號(hào)< >標(biāo)志文件名,自定義頭文件采用雙撇號(hào)″″標(biāo)志文件名。 3) 每個(gè).c文件有一個(gè)對(duì)應(yīng)的.h文件,.c文件的注釋之后首先定義一個(gè)唯一的文件標(biāo)志宏,并在對(duì)應(yīng)的.h文件中解析該標(biāo)志。 在.c文件中: #define FILE_FLAG 在.h文件中: #ifdef FILE_FLAG #define XXX #else #define XXX extern #endif 4) 對(duì)于確定只被某個(gè).c文件調(diào)用的定義可以單獨(dú)列在一個(gè)頭文件中、單獨(dú)調(diào)用。 6.2 可重入函數(shù) 可重入函數(shù)中若使用了全局變量,應(yīng)通過(guò)關(guān)中斷、信號(hào)量等操作手段對(duì)其加以保護(hù)。 6.3 函數(shù)的形參 1) 由函數(shù)調(diào)用者負(fù)責(zé)檢查形參的合法性。 2) 盡量避免將形參作為工作變量使用。 6.4 循環(huán) 1) 盡量減少循環(huán)嵌套層數(shù) 2) 在多重循環(huán)中,應(yīng)將最忙的循環(huán)放在最內(nèi)層 3) 循環(huán)體內(nèi)工作量最小 4) 盡量避免循環(huán)體內(nèi)含有判斷語(yǔ)句 7.工程中所包含的文件 7.1 頭文件 7.1.1 頭文件的形式 MCU程序中的頭文件包括面向硬件對(duì)象頭文件、公共頭文件和總頭文件。 MCU C工程編程是面向硬件對(duì)象的。例如,要用MCU控制電機(jī)(Motor),在這樣一個(gè)系統(tǒng)中,“面向硬件對(duì)象”概念體現(xiàn)在,工程中會(huì)創(chuàng)建“Motor.c”的源程序文件專(zhuān)門(mén)用于電機(jī)控制。相應(yīng)的,也要?jiǎng)?chuàng)建一個(gè)同名頭文件“Motor.h”,用于控制電機(jī)的MCU引腳定義、相關(guān)宏定義和電機(jī)控制函數(shù)聲明等。像這樣的頭文件,就是面向硬件對(duì)象頭文件。與之同名的“*.c”文件可以包含它,來(lái)完成控制此硬件對(duì)象的MCU引腳定義和相關(guān)宏定義;調(diào)用該硬件對(duì)象控制函數(shù)的文件也可以通過(guò)調(diào)用它來(lái)進(jìn)行函數(shù)聲明。 還有一類(lèi)頭文件不是專(zhuān)門(mén)針對(duì)于特定的硬件對(duì)象的,而是有一定的通用性。這類(lèi)頭文件被稱(chēng)為公共頭文件。如工程中包含的“Type.h”文件,該文件用于C語(yǔ)言中類(lèi)型的別名定義,用戶(hù)還可以根據(jù)自己的需要,隨時(shí)在該文件中添加條目。在工程的任一文件中,需要用到這些別名時(shí),都要包含“Type.h”?梢(jiàn)公共頭文件并不拘泥于具體的硬件對(duì)象,它是為整個(gè)工程的和諧運(yùn)作而建立的。 總頭文件(includes.h)是一個(gè)較特殊的頭文件。它只被主函數(shù)文件包含,用于包含主函數(shù)文件中需要的頭文件,宏定義,函數(shù)聲明等。它使得主函數(shù)文件能夠盡量避免改動(dòng),結(jié)構(gòu)更加清晰。 7.1.2 頭文件的命名 總的來(lái)說(shuō)頭文件的命名應(yīng)盡量做到簡(jiǎn)短易懂,見(jiàn)名知意。 面向硬件對(duì)象頭文件的名稱(chēng)一定要與相應(yīng)的硬件對(duì)象驅(qū)動(dòng)文件同名。例??? 公共頭文件,如果對(duì)應(yīng)于相應(yīng)的源程序文件而建立,必須與之同名。如,“GeneralFun.c” 是工程中的通用函數(shù)定義文件,(像內(nèi)存數(shù)據(jù)移動(dòng)函數(shù),延時(shí)函數(shù)都屬于通用函數(shù)),其他文件在用到這些函數(shù)之前,必須進(jìn)行函數(shù)原型聲明,從而建立與之同名的“GeneralFun.h”文件,專(zhuān)門(mén)用于相應(yīng)的函數(shù)聲明。其它的公共頭文件沒(méi)有同名要求,只要表清文件含義即可,如“Type.h”,“GP32C.h”等。 總頭文件在一個(gè)工程中只有一個(gè),它的名稱(chēng)較為固定,一般取為“Includes.h”。 7.1.3 頭文件注意事項(xiàng) 1) 為了防止重復(fù)定義需要使用偽指令 #ifndef VarType …… 例: #ifndef VarType #define VarType typedef unsigned char INT8U; //無(wú)符號(hào)8位數(shù) typedef signed char INT8S; //有符號(hào)8位數(shù) typedef unsigned int INT16U; //無(wú)符號(hào)16位數(shù) typedef signed int INT16S; //有符號(hào)16位數(shù) typedef unsigned long INT32U; //無(wú)符號(hào)32位數(shù) typedef signed long INT32S; //有符號(hào)32位數(shù) typedef float FP32; //單精度浮點(diǎn)數(shù) typedef double FP64; //雙精度浮點(diǎn)數(shù) #endif 2) 對(duì)于一個(gè)項(xiàng)目中的頭文件與芯片相關(guān)的寄存器映像文件不可擅自改動(dòng),如果的確存在需要改動(dòng)的地方另外開(kāi)辟頭文件。 3) typedef和#define的用法 ① typedef的用法 在C/C++語(yǔ)言中,typedef常用來(lái)定義一個(gè)標(biāo)識(shí)符及關(guān)鍵字的別名,它是語(yǔ)言編譯過(guò)程的一部分,但它并不實(shí)際分配內(nèi)存空間,實(shí)例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增強(qiáng)程序的可讀性,以及標(biāo)識(shí)符的靈活性,但它也有“非直觀性”等缺點(diǎn)。 ② #define的用法 #define為一宏定義語(yǔ)句,通常用它來(lái)定義常量(包括無(wú)參量與帶參量),以及用來(lái)實(shí)現(xiàn)那些“表面似和善、背后一長(zhǎng)串”的宏,它本身并不在編譯過(guò)程中進(jìn)行,而是在這之前(預(yù)處理過(guò)程)就已經(jīng)完成了,但也因此難以發(fā)現(xiàn)潛在的錯(cuò)誤及其它代碼維護(hù)問(wèn)題,它的實(shí)例像: #define INT int #define TRUE 1 #define Add(a,b) ((a)+(b)); #define Loop_10 for (int i=0; i<10; i++) ③ typedef與#define的區(qū)別 從以上的概念便也能基本清楚,typedef只是為了增加可讀性而為標(biāo)識(shí)符另起的新名稱(chēng)(僅僅只是個(gè)別名),而#define原本在C中是為了定義常量,到了C++,const、enum、inline的出現(xiàn)使它也漸漸成為了起別名的工具。為了盡可能地兼容,一般都遵循#define定義“可讀”的常量以及一些宏語(yǔ)句的任務(wù),而typedef則常用來(lái)定義關(guān)鍵字、冗長(zhǎng)的類(lèi)型的別名。 宏定義只是簡(jiǎn)單的字符串代換(原地?cái)U(kuò)展),而typedef則不是原地?cái)U(kuò)展,它的新名字具有一定的封裝性,以致于新命名的標(biāo)識(shí)符具有更易定義變量的功能。請(qǐng)看上面第一大點(diǎn)代碼的第三行: typedef (int*) pINT; 以及下面這行: #define pINT2 int* 效果相同?實(shí)則不同!實(shí)踐中見(jiàn)差別: pINT a,b;的效果同int *a; int *b; 表示定義了兩個(gè)整型指針變量。 而pINT2 a,b;的效果同int *a, b;表示定義了一個(gè)整型指針變量a和整型變量b。 注意:兩者還有一個(gè)行尾;號(hào)的區(qū)別哦!(???) 7.2 源程序文件 源程序文件包括主函數(shù)文件、通用函數(shù)文件、硬件對(duì)象控制文件、芯片初始化文件、中斷向量定義文件和中斷使能文件。 源程序文件的分類(lèi)和命名類(lèi)同于頭文件,但也有它自己的特點(diǎn)。 7.2.1 主程序文件 (Main.s 或 Main.c)(?????) 工程中有且僅有一個(gè)主程序文件,它包含了工程的主處理流程。 主函數(shù)文件中包含: (1)工程描述 ①工程名 工程名中每個(gè)意義單詞(或單詞縮寫(xiě))的首字母大寫(xiě),后綴為.prj。 ②硬件連接索引 工程所要控制的硬件對(duì)象索引,詳細(xì)描述在相應(yīng)的硬件對(duì)象控制文件中給出。 ③工程的功能、目的和說(shuō)明 ④注意要點(diǎn) 可以注明編程要點(diǎn)和心得 ⑤日期 注明工程完成日期 (2)總頭文件 (3)主函數(shù) 如: 7.2.2 芯片初始化文件(“SetUp.c”或 “SetUp.s”) 該文件與具體的芯片型號(hào)有關(guān),并且只包含一個(gè)芯片初始化函數(shù),若想由編譯器自動(dòng)調(diào)用芯片初始化函數(shù),其函數(shù)名必須為"_HC08Setup",否則編譯器會(huì)自動(dòng)建立并調(diào)用一個(gè)空的"__HC08Setup"匯編子程序,而不理會(huì)用戶(hù)創(chuàng)建的芯片初始化函數(shù)。為了統(tǒng)一,將該函數(shù)起名為"MCUInit",并在主函數(shù)中調(diào)用該函數(shù)。 7.2.3 通用函數(shù)頭文件和通用函數(shù)文件 通用函數(shù)頭文件和通用函數(shù)文件,“GenneralFun.h”和“GeneralFun.c”。 //[GenneralFun.h]通用函數(shù)頭文件---------------------------------------------#include"Type.h" //類(lèi)型別名定義void Delay(INT16U); //延時(shí)函數(shù)聲明 “GenneralFun.h”中包含: (1)文件名 (2)通用函數(shù)所需用到的頭文件 (3)通用函數(shù)用到的宏定義 (4)通用函數(shù)聲明 外部函數(shù)要用到通用函數(shù)時(shí),可包含這個(gè)頭文件進(jìn)行函數(shù)聲明。 7.2.4 對(duì)象控制文件 7.2.5 中斷處理函數(shù)和中斷向量表文件 9. 硬件封裝的思想 1) 與硬件相關(guān)的程序文件 與某個(gè)硬件相關(guān)的子程序放到1個(gè)程序文件中,該硬件的頭文件放到一個(gè)文件中。 程序文件的開(kāi)始處是有關(guān)說(shuō)明:本文件所包含的子程序及簡(jiǎn)要的功能說(shuō)明,子程序分為內(nèi)部調(diào)用和外部調(diào)用;硬件的連接說(shuō)明。 2) 中斷的開(kāi)放和禁止 使用宏定義方式開(kāi)放或禁止中斷,宏定義語(yǔ)句放在EnDisInt.h頭文件中。宏名的定義方法: 開(kāi)放中斷以Enable標(biāo)識(shí),宏名中包含中斷名,宏名最后以Int結(jié)束。如:開(kāi)放串行接收中斷的宏名為:EnableSCIReInt。 禁止中斷以Disable標(biāo)識(shí),宏名中包含中斷名,宏名最后以Int結(jié)束。如:禁止串行接收中斷的宏名為:DisableSCIReInt。 開(kāi)放所有中斷宏名:EnableMCUInt。 禁止所有中斷宏名:DisableMCUInt。
|