久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

嵌入式軟件開發(fā)編程規(guī)范你了解嗎?小心吃大虧

 whlky 2018-12-07

對于嵌入式系統(tǒng)來講,,嵌入式軟件相當(dāng)于嵌入式系統(tǒng)的靈魂,,整個嵌入式系統(tǒng)如何工作,都是由嵌入式軟件來控制的,。如何編寫高質(zhì)量,,高效率的嵌入式軟件在實(shí)際項(xiàng)目開發(fā)過程中變的越來越重要。


相信大家都有過這樣的感受:看到不規(guī)范(雜亂差)的代碼,,瞬間就沒有看下去的欲望了,。  

當(dāng)我們在公司進(jìn)行嵌入式項(xiàng)目開發(fā)的時候,并不是你一個人在單打獨(dú)斗,,通常是一個團(tuán)隊(duì)在一起戰(zhàn)斗,。很多人一起共同完成一個嵌入式項(xiàng)目,通常是每個成員,,每個小組完成整個項(xiàng)目中的一個或幾個模塊,。我們編寫的代碼首先是給人看的,其次才是給機(jī)器執(zhí)行的,,這就要求我們團(tuán)隊(duì)中的每個人在編寫軟件的時候,,要遵循統(tǒng)一的編程規(guī)范和編碼風(fēng)格,提高代碼的可讀性和可維護(hù)性,,方便團(tuán)隊(duì)成員之間的溝通和交流,。在實(shí)際項(xiàng)目開發(fā)過程中,遵循統(tǒng)一的編程規(guī)范相當(dāng)重要,,同學(xué)們一定要引起足夠的重視,,下面我就從代碼排版,,代碼注釋,,標(biāo)識符命名,代碼可讀性和函數(shù)設(shè)計(jì)幾個方面來講解比較通用的嵌入式軟件編程規(guī)范,。

關(guān)于編程規(guī)范及原則Ⅱ

編程規(guī)范也就是編寫出簡潔,、可維護(hù),、可靠、可測試,、高效,、可移植的代碼,提高產(chǎn)品代碼的質(zhì)量,。

 

本文針對嵌入式,,主要結(jié)合C語言編程的規(guī)范給大家講述。

 

1.頭文件

對于C語言來說,,頭文件的設(shè)計(jì)體現(xiàn)了大部分的系統(tǒng)設(shè)計(jì),,不合理的頭文件布局是編譯時間過長的原因。

 

有很多人將工程中所有的頭文件包含在一個include.h文件中,,然后在每一個.c源代碼文件中包含include.h頭文件,,這樣做可以讓代碼看上去簡潔,但實(shí)際忽視了編譯效率問題,,而且代碼的可移植性也不好,。

 

原則:

A.頭文件中適合放置接口的聲明,不適合放置實(shí)現(xiàn),;

B.頭文件應(yīng)當(dāng)職責(zé)單一;

C.頭文件應(yīng)向穩(wěn)定的方向包含,。

 

規(guī)則:

A.每一個.c文件應(yīng)有一個同名.h文件,用于聲明需要對外公開的接口;

B.禁止頭文件循環(huán)依賴;

C..c/.h文件禁止包含用不到的頭文件;

D.頭文件應(yīng)當(dāng)自包含;

E.總是編寫內(nèi)部#include保護(hù)符( #define 保護(hù));

F.禁止在頭文件中定義變量;

G.只能通過包含頭文件的方式使用其他.c提供的接口,,禁止在.c中通過extern的方式使用外部函數(shù)接口,、變量;

H.禁止在extern 'C'中包含頭文件。

 

建議:

A.一個模塊通常包含多個.c文件,,建議放在同一個目錄下,,目錄名即為模塊名。為方便外部使用者,,建議每一個模塊提供一個.h,,文件名為目錄名;

B.如果一個模塊包含多個子模塊,則建議每一個子模塊提供一個對外的.h,,文件名為子模塊名(降低接口使用者的編寫難度);

C.頭文件不要使用非習(xí)慣用法的擴(kuò)展名,,如.inc;

D.同一產(chǎn)品統(tǒng)一包含頭文件排列方式。

 

2.函數(shù)

函數(shù)設(shè)計(jì)的要點(diǎn):編寫整潔的函數(shù),,同時把代碼有效組織起來,。


函數(shù)整潔的要求:代碼簡單直接、不隱藏設(shè)計(jì)者的意圖,、用干凈利落的抽象和直截了當(dāng)?shù)目刂普Z句將函數(shù)有機(jī)組織起來,。

 

原則:

A.一個函數(shù)僅完成一件功能;

B.重復(fù)代碼應(yīng)該盡可能提煉成函數(shù).

 

規(guī)則:

A.避免函數(shù)過長,新增函數(shù)不超過100行(非空非注釋行);

B.避免函數(shù)的代碼塊嵌套過深,,新增函數(shù)的代碼塊嵌套不超過4層;

C.可重入函數(shù)應(yīng)避免使用共享變量,;若需要使用,,則應(yīng)通過互斥手段(關(guān)中斷、信號量)對其加以保護(hù);

D.對參數(shù)的合法性檢查,,由調(diào)用者負(fù)責(zé)還是由接口函數(shù)負(fù)責(zé),,應(yīng)在項(xiàng)目組/模塊內(nèi)應(yīng)統(tǒng)一規(guī)定;

E.對函數(shù)的錯誤返回碼要全面處理;

F.設(shè)計(jì)高扇入,合理扇出(小于7)的函數(shù);

G.廢棄代碼(沒有被調(diào)用的函數(shù)和變量)要及時清除,。

 

建議:

A.函數(shù)不變參數(shù)使用const;

B.函數(shù)應(yīng)避免使用全局變量,、靜態(tài)局部變量和I/O操作,不可避免的地方應(yīng)集中使用;

C.檢查函數(shù)所有非參數(shù)輸入的有效性,,如數(shù)據(jù)文件,、公共變量等;

D.函數(shù)的參數(shù)個數(shù)不超過5個;

E.除打印類函數(shù)外,不要使用可變長參函數(shù);

F.在源文件范圍內(nèi)聲明和定義的所有函數(shù),,除非外部可見,,否則應(yīng)該增加static關(guān)鍵字。

 

3.標(biāo)識符命名與定義

程序命名是一個關(guān)鍵,,如果命名不規(guī)范,,自己寫的代碼,時間長了恐怕連自己都不知道是什么意思了,。

 

3.1通用命名規(guī)則

常見命名風(fēng)格:

A.用下劃線?_?分割,,如text_mutex;

B.大小寫字母混用,如ReadRFCText,。

 

規(guī)則:

A.標(biāo)識符的命名要清晰,、明了,有明確含義,,同時使用完整的單詞或大家基本可以理解的縮寫,,避免使人產(chǎn)生誤解;

B.除了常見的通用縮寫以外,,不使用單詞縮寫,,不得使用漢語拼音;

C.產(chǎn)品/項(xiàng)目組內(nèi)部應(yīng)保持統(tǒng)一的命名風(fēng)格.

 

建議:

A.用正確的反義詞組命名具有互斥意義的變量或相反動作的函數(shù)等;

B.盡量避免名字中出現(xiàn)數(shù)字編號,除非邏輯上的確需要編號;

C.標(biāo)識符前不應(yīng)添加模塊,、項(xiàng)目,、產(chǎn)品、部門的名稱作為前綴;

D.平臺/驅(qū)動等適配代碼的標(biāo)識符命名風(fēng)格保持和平臺/驅(qū)動一致;

E.重構(gòu)/修改部分代碼時,,應(yīng)保持和原有代碼的命名風(fēng)格一致,。

 

3.2 文件命名規(guī)則

因?yàn)椴煌到y(tǒng)對文件名大小寫處理會不同,建議文件命名統(tǒng)一采用小寫字符,。

 

3.3 變量命名規(guī)則

首先,,全局變量十分危險,通過前綴使得全局變量更加醒目, 促使開發(fā)人員對這些變量的使用更加小心,。


其次,從根本上說,,應(yīng)當(dāng)盡量不使用全局變量,,增加g_和s_前綴,會使得全局變量的名字顯得很丑陋,,從而促使開發(fā)人員盡量少使用全局變量,。

 

規(guī)則:

A.全局變量增加“g_”前綴,靜態(tài)變量增加“s_”前綴;

B.禁止使用單字節(jié)命名變量,,但允許定義i,、 j、 k作為局部循環(huán)變量;

C.使用名詞或者形容詞+名詞方式命名變量,。

 

3.4 函數(shù)命名規(guī)則

A.函數(shù)命名應(yīng)以函數(shù)要執(zhí)行的動作命名,,一般采用動詞或者動詞+名詞的結(jié)構(gòu);

B.函數(shù)指針除了前綴,其他按照函數(shù)的命名規(guī)則命名,。

 

3.5 宏的命名規(guī)則

A.對于數(shù)值或者字符串等等常量的定義,,建議采用全大寫字母,單詞之間加下劃線?_?的方式命名(枚舉同樣建議使用此方式定義);

B.除了頭文件或編譯開關(guān)等特殊標(biāo)識定義,,宏定義不能使用下劃線?_?開頭和結(jié)尾,。

 

4.變量

原則:

A.一個變量只有一個功能,不能把一個變量用作多種用途;

B.結(jié)構(gòu)功能單一,;不要設(shè)計(jì)面面俱到的數(shù)據(jù)結(jié)構(gòu);

C.不用或者少用全局變量,。

 

規(guī)則:

A.防止局部變量與全局變量同名;

B.通訊過程中使用的結(jié)構(gòu),必須注意字節(jié)序;

C.嚴(yán)禁使用未經(jīng)初始化的變量作為右值;

 

建議:

A.構(gòu)造僅有一個模塊或函數(shù)可以修改,、創(chuàng)建,,而其余有關(guān)模塊或函數(shù)只訪問的全局變量,防止多個不同模塊或函數(shù)都可以修改,、創(chuàng)建同一全局變量的現(xiàn)象;

B.使用面向接口編程思想,,通過API訪問數(shù)據(jù):如果本模塊的數(shù)據(jù)需要對外部模塊開放,應(yīng)提供接口函數(shù)來設(shè)置,、獲取,,同時注意全局?jǐn)?shù)據(jù)的訪問互斥;

C.在首次使用前初始化變量,初始化的地方離使用的地方越近越好;

D.明確全局變量的初始化順序,,避免跨模塊的初始化依賴;

E.盡量減少沒有必要的數(shù)據(jù)類型默認(rèn)轉(zhuǎn)換與強(qiáng)制轉(zhuǎn)換,。

 

5.宏、常量

因?yàn)楹曛皇呛唵蔚拇a替換,,不會像函數(shù)一樣先將參數(shù)計(jì)算后,,再傳遞。

 

規(guī)則:

A.用宏定義表達(dá)式時,要使用完備的括號;

不規(guī)范:#define RECTANGLE_AREA(a, b) a * b

規(guī)范:#define RECTANGLE_AREA(a, b) ((a) * (b))

 

B.將宏所定義的多條表達(dá)式放在大括號中;

C.使用宏時,,不允許參數(shù)發(fā)生變化;

#define SQUARE(a) ((a) * (a))

int a = 5;

int b;

不規(guī)范:

b = SQUARE(a++);

 

規(guī)范:

b = SQUARE(a);

a++;

 

建議:

A.除非必要,,應(yīng)盡可能使用函數(shù)代替宏;

B.常量建議使用const定義代替宏;

C.宏定義中盡量不使用return、 goto,、 continue,、 break等改變程序流程的語句。

 

6.注釋

原則:

A.優(yōu)秀的代碼可以自我解釋,,不通過注釋即可輕易讀懂;

B.注釋的內(nèi)容要清楚,、明了,含義準(zhǔn)確,,防止注釋二義性;

C.在代碼的功能,、意圖層次上進(jìn)行注釋,即注釋解釋代碼難以直接表達(dá)的意圖,,而不是重復(fù)描述代碼,。

 

規(guī)則:

A.修改代碼時,維護(hù)代碼周邊的所有注釋,,以保證注釋與代碼的一致性,。不再有用的注釋要刪;

B.文件頭部應(yīng)進(jìn)行注釋,注釋必須列出:版權(quán)說明,、版本號,、生成日期、作者姓名,、工號,、內(nèi)容、功能說明,、與其它文件的關(guān)系,、修改日志等,頭文件的注釋中還應(yīng)有函數(shù)功能簡要說明;

C.函數(shù)聲明處注釋描述函數(shù)功能,、性能及用法,,包括輸入和輸出參數(shù)、函數(shù)返回值,、可重入的要求等,;定義處詳細(xì)描述函數(shù)功能和實(shí)現(xiàn)要點(diǎn),如實(shí)現(xiàn)的簡要步驟,、實(shí)現(xiàn)的理由,、 設(shè)計(jì)約束等;

D.全局變量要有較詳細(xì)的注釋,包括對其功能,、取值范圍以及存取時注意事項(xiàng)等的說明;

E.注釋應(yīng)放在其代碼上方相鄰位置或右方,,不可放在下面,。 如放于上方則需與其上面的代碼用空行隔開,且與下方代碼縮進(jìn)相同;

F.避免在注釋中使用縮寫,,除非是業(yè)界通用或子系統(tǒng)內(nèi)標(biāo)準(zhǔn)化的縮寫;

G.同一產(chǎn)品或項(xiàng)目組統(tǒng)一注釋風(fēng)格,。

 

建議:

A.避免在一行代碼或表達(dá)式的中間插入注釋;

B.文件頭、函數(shù)頭,、全局常量變量,、類型定義的注釋格式采用工具可識別的格式。

 

7.排版與格式

規(guī)則:

A.程序塊采用縮進(jìn)風(fēng)格編寫,, 每級縮進(jìn)為4個空格;

B.相對獨(dú)立的程序塊之間,、變量說明之后必須加空行;

C.一條語句不能過長,,如不能拆分需要分行寫,。一行到底多少字符換行比較合適,產(chǎn)品可以自行確定;

D.多個短語句(包括賦值語句)不允許寫在同一行內(nèi),,即一行只寫一條語句;

E.if,、 for、 do,、 while,、 case、 switch,、 default等語句獨(dú)占一行;

F.在兩個以上的關(guān)鍵字,、變量、常量進(jìn)行對等操作時,,它們之間的操作符之前,、之后或者前后要加空格; 進(jìn)行非對等操作時,,如果是關(guān)系密切的立即操作符(如->),,后不應(yīng)加空格;

G.注釋符(包括?/*??//??*/?)與注釋內(nèi)容之間要用一個空格進(jìn)行分隔。

 

嵌入式編程中的注意事項(xiàng)

嵌入式軟件開發(fā)和普通軟件編程相比,,有一些自己的特點(diǎn),,下面從嵌入式軟件架構(gòu),中斷編程,,寄存器配置,,浮點(diǎn)運(yùn)算等幾個方面來講解嵌入式編程中的注意事項(xiàng).


1. 嵌入式系統(tǒng)的軟件架構(gòu)


一個大型的嵌入式軟件往往需要根據(jù)功能的不同劃分成多個軟件功能模塊。

1) 模塊即是一個.c文件和一個.h文件的結(jié)合,,頭文件(.h)中是對于該模塊接口的聲明;

2) 某模塊提供給其它模塊調(diào)用的外部函數(shù)及數(shù)據(jù)需在.h中文件中冠以extern關(guān)鍵字聲明;

3) 模塊內(nèi)的函數(shù)和全局變量需在.c文件開頭冠以static關(guān)鍵字聲明;

4) 永遠(yuǎn)不要在.h文件中定義變量!定義變量和聲明變量的區(qū)別在于定義會產(chǎn)生內(nèi)存分配的操作,,是匯編階段的概念;而聲明則只是告訴包含該聲明的模塊在連接階段從其它模塊尋找外部函數(shù)和變量


2. 中斷編程

中斷是嵌入式系統(tǒng)中重要的組成部分,但是在標(biāo)準(zhǔn)C中不包含中斷,。 許多編譯開發(fā)商在標(biāo)準(zhǔn)C上增加了對中斷的支持,,提供新的關(guān)鍵字用于標(biāo)示中斷服務(wù)程序. 類似于__interrupt,、#program interrupt等。當(dāng)一個函數(shù)被定義為中斷服務(wù)處理程序的時候,,編譯器會自動為該函數(shù)增加中斷服務(wù)程序所需要的中斷現(xiàn)場入棧和出棧代碼,。


中斷服務(wù)程序需要滿足如下要求:

1) 不能有返回值;

2) 不能向中斷服務(wù)處理程序傳遞參數(shù);

3) 中斷服務(wù)處理程序應(yīng)該盡可能的短小精悍,不要包含耗時的代碼


3. 寄存器配置


嵌入式軟件是面向硬件底層的軟件,,我們在對硬件進(jìn)行編程時,,通常是通過配置硬件相關(guān)的寄存器來實(shí)現(xiàn)的。在配置寄存器時,,通常我們只需要配置寄存器的1位或幾位,,對于其他不需要配置的位,我們要保持不變,,不要更改我們不需要配置的位,。


例如:我們希望配置寄存器的 GPIOADAT 的第 1位 為 1

我們不能這樣寫成這樣:

GPIOADAT = 0x02; //將其他位設(shè)置為 0

而應(yīng)該寫成這樣:

GPIOADAT |= 0x02; //保證其他位不變


4. 浮點(diǎn)運(yùn)算

大多數(shù)低檔次的單片機(jī)都是不支持浮點(diǎn)運(yùn)算的,因此在實(shí)際使用過程中也很少用到,,因此為了降低成本,,一般都去掉了浮點(diǎn)運(yùn)算模塊,這就帶來了一個問題,,如果萬一要用到浮點(diǎn)運(yùn)算怎么辦?我們可以采用的是“定點(diǎn)”的方法來解決這個問題,,就是直接放大10的N次方倍進(jìn)行整數(shù)的計(jì)算,可以得出近似值,,因此為了不增加不必要的麻煩,,應(yīng)該總是盡量避免使用浮點(diǎn)運(yùn)算,一般情況也是可以避免的,。


5. volatile 關(guān)鍵字的使用

嵌入式開發(fā)過程中,,在定義硬件寄存器的時候,需要使用volatile關(guān)鍵字,。 volatile提醒編譯器它后面所定義的變量隨時都有可能改變,,因此編譯后的程序每次需要存儲或讀取這個變量的時候,都會直接從變量地址中讀取數(shù)據(jù),。 如果沒有volatile關(guān)鍵字,,則編譯器可能優(yōu)化讀取和存儲,可能暫時使用寄存器中的值,。


例如: #define GPIO_DATA (*(volatile unsigned int *)0x90002000)


小結(jié):

良好的編程習(xí)慣是需要日積月累的,,如果你正處于學(xué)習(xí)階段,請你時刻要注意這些細(xì)節(jié)問題,。 

 

如果自己有信心,,猛戳原文,可以接點(diǎn)小項(xiàng)目練練手~~~

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多