国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 嵌入式編程規(guī)范及注意事項(xiàng)

嵌入式編程規(guī)范及注意事項(xiàng) 時間:2018-01-17      來源:未知

嵌入式系統(tǒng)已經(jīng)在各行各業(yè)中得到了廣泛的應(yīng)用,隨著人們的生活向信息化,智能化的發(fā)展,嵌入式技術(shù)將徹底融入到我們的生活,在我們的生活當(dāng)中扮演越來越重要的角色。對于嵌入式系統(tǒng)來講,嵌入式軟件相當(dāng)于嵌入式系統(tǒng)的靈魂,整個嵌入式系統(tǒng)如何工作,都是由嵌入式軟件來控制的。如何編寫高質(zhì)量,高效率的嵌入式軟件在實(shí)際項(xiàng)目開發(fā)過程中變的越來越重要。本文針對嵌入式軟件的特點(diǎn),從嵌入式軟件編程規(guī)范和注意事項(xiàng)2個方面來闡述如何編寫高質(zhì)量的嵌入式軟件。

一、 嵌入式編程規(guī)范

我們在公司進(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ī)范。

1. 代碼排版

1) 程序塊要采用縮進(jìn)風(fēng)格編寫, 縮進(jìn)的空格數(shù)為4個或一個TAB鍵,設(shè)置TAB鍵為

4個空格.

例如:

int main(int argc, char *argv[])

{

int a=900; //縮進(jìn)4個空格

}

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

例如:

if (!valid_ni(ni))

{

... // program code

}

//相對獨(dú)立的程序塊之間加空行

repssn_ind = ssn_data[index].repssn_index;

repssn_ni = ssn_data[index].ni;

3) 較長的語句( >80字符)要分成多行書寫, 長表達(dá)式要在低優(yōu)先級操作符處劃

分新行,操作符放在新行之首, 劃分出的新行要進(jìn)行適當(dāng)?shù)目s進(jìn), 使排版整齊,

語句可讀。

例如:

perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN

+ STAT_SIZE_PER_FRAM * sizeof( _UL );

4) 不允許把多個短語句寫在一行中,即一行只寫一條語句。

例如:

rect.length = 0;

rect.width = 0;

5) if、 for、 do、 while、 case、 switch、 default等語句自占一行,且if、 for、do、

while等語句的執(zhí)行語句部分無論多少都要加括號{}。

例如:

if (pUserCR == NULL) //if語句單獨(dú)占一行

{ //執(zhí)行語句只有1條也要加{}

return;

}

6) 程序塊的分界符(如C/C++語言的大括號‘ {’和‘ }’)應(yīng)各獨(dú)占一行并且位

于同一列, 同時與引用它們的語句左對齊。 在函數(shù)體的開始、 類的定義、 結(jié)

構(gòu)的定義、 枚舉的定義以及if、 for、 do、 while、 switch、 case語句中的

程序都要采用如上的縮進(jìn)方式.

例如:

for (...)

{ //{}單獨(dú)占一行,與for左對齊

... // program code

}

void example_fun(void)

{

... // program code

}

2. 代碼注釋

1) 注釋的原則是有助于對程序的閱讀理解,在該加的地方都加了,注釋不宜太多也不

能太少, 注釋語言必須準(zhǔn)確、易懂、簡潔,防止注釋的二義性.

2) 說明性文件(如頭文件.h文件)頭部應(yīng)進(jìn)行注釋, 注釋必須列出:版權(quán)說明、版本

號、生成日期、作者、內(nèi)容、功能、 修改日志等, 頭文件的注釋中還應(yīng)有函數(shù)功能

簡要說明。

例如:

Copyright (C), 2004-2018, 華清遠(yuǎn)見教育科技集團(tuán).

File name: // 文件名

Author: Version: Date: // 作者、版本及完成日期

Description: // 用于詳細(xì)說明此程序文件完成的主要功能,與其他模塊

// 或函數(shù)的接口,輸出值、取值范圍、含義及參數(shù)間的控

// 制、順序、獨(dú)立或依賴等關(guān)系

Function List: // 主要函數(shù)列表,每條記錄應(yīng)包括函數(shù)名及功能簡要說明

1. ....

History: // 修改歷史記錄列表,每條修改記錄應(yīng)包括修改日期、修改

// 者及修改內(nèi)容簡述

1. Date:

Author:

Modification:

2. ...

3) 源文件頭部應(yīng)進(jìn)行注釋, 列出: 版權(quán)說明、 版本號、 生成日期、 作者、 模塊目的/功能、主要函數(shù)及其功能、 修改日志等.

例如:

Copyright (C), 1988-2018, 華清遠(yuǎn)見教育科技集團(tuán).

FileName: test.cpp

Author: Version : Date:

Description: // 模塊描述

Function List: // 主要函數(shù)及其功能

1. -------

History: // 歷史修改記錄

David 96/10/12 1.0 build this moudle

4) 函數(shù)頭部應(yīng)進(jìn)行注釋,列出函數(shù)的功能、輸入?yún)?shù)、輸出參數(shù)、返回值等。

例如:

Function: // 函數(shù)名稱

Description: // 函數(shù)功能、性能等的描述

Input: // 輸入?yún)?shù)說明,包括每個參數(shù)的作用、取值說明及參數(shù)間關(guān)系。

Output: // 對輸出參數(shù)的說明。

Return: // 函數(shù)返回值的說明

Others: // 其它說明

5) 邊寫代碼邊注釋, 修改代碼同時修改相應(yīng)的注釋, 以保證注釋與代碼的一致

性。 不再有用的注釋要刪除。

6) 注釋應(yīng)與其描述的代碼相近, 對代碼的注釋應(yīng)放在其上方或右方(對單條語句

的注釋)相鄰位置, 不可放在下面,如放于上方則需與其上面的代碼用空行隔開。

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

1) 標(biāo)識符的命名要清晰、 明了, 有明確含義, 同時使用完整的單詞或大家基本

可以理解的縮寫,避免使人產(chǎn)生誤解.

2) 對于變量命名,禁止取單個字符(如i、 j、 k...) ,建議除了要有具體含義外,

還能表明其變量類型。建議在變量前面加前綴 g表示全局變量,m表示形式參數(shù).

例如: int gCount = 0;

3) 命名規(guī)范必須與所使用的系統(tǒng)風(fēng)格保持一致,并在同一項(xiàng)目中統(tǒng)一,比如采用

UNIX的全小寫加下劃線的風(fēng)格或大小寫混排的方式, 不要同時使用大小寫與下

劃線混排的方式。

例如: char total_score =0;

4) 函數(shù)名應(yīng)準(zhǔn)確描述函數(shù)的功能,使用動賓詞組為執(zhí)行某操作的函數(shù)命名。

例如:

int input_record( void )

unsigned char get_current_color( void )

5) 除非必要,不要用數(shù)字或較奇怪的字符來定義標(biāo)識符

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

4. 代碼可讀性

1) 注意運(yùn)算符的優(yōu)先級,并用括號明確表達(dá)式的操作順序,避免使用默認(rèn)優(yōu)先級

例如:不要這樣寫: word = high << 8 | low

而應(yīng)該寫成如下這樣: word = (high << 8) | low

2) 避免使用不易理解的數(shù)字, 用有意義的標(biāo)識來替代。 涉及物理狀態(tài)或者含有物理意

義的常量,不應(yīng)直接使用數(shù)字,必須用有意義的枚舉或宏來代替.

例如:

#define TRUNK_IDLE 0

#define TRUNK_BUSY 1

if (Trunk[index].trunk_state == TRUNK_IDLE)

{

Trunk[index].trunk_state = TRUNK_BUSY;

... // program code

}

3) 不要使用難懂的技巧性很高的語句,除非很有必要時.

例如: 不要使用類似這樣的難懂的語句 *stat_poi++ += 1; 應(yīng)該分成多個語句

書寫,增強(qiáng)代碼可讀性.

二、嵌入式編程中的注意事項(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)

以上就是我今天要給同學(xué)們講解的嵌入式軟件編程規(guī)范和注意事項(xiàng),希望同學(xué)們在實(shí)際的嵌入式項(xiàng)目開發(fā)過程中嚴(yán)格遵循嵌入式軟件編程規(guī)范和注意事項(xiàng),開發(fā)出高質(zhì)量,穩(wěn)定,可靠,維護(hù)性高的嵌入式軟件。

上一篇:數(shù)據(jù)結(jié)構(gòu)有什么用

下一篇:數(shù)據(jù)結(jié)構(gòu)樹應(yīng)用在哪兒比較多

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部