IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > 嵌入式編程規范及注意事項

嵌入式編程規范及注意事項 時間:2018-01-17      來源:未知

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

一、 嵌入式編程規范

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

1. 代碼排版

1) 程序塊要采用縮進風格編寫, 縮進的空格數為4個或一個TAB鍵,設置TAB鍵為

4個空格.

例如:

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

{

int a=900; //縮進4個空格

}

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

例如:

if (!valid_ni(ni))

{

... // program code

}

//相對獨立的程序塊之間加空行

repssn_ind = ssn_data[index].repssn_index;

repssn_ni = ssn_data[index].ni;

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

分新行,操作符放在新行之首, 劃分出的新行要進行適當的縮進, 使排版整齊,

語句可讀。

例如:

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等語句的執行語句部分無論多少都要加括號{}。

例如:

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

{ //執行語句只有1條也要加{}

return;

}

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

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

構的定義、 枚舉的定義以及if、 for、 do、 while、 switch、 case語句中的

程序都要采用如上的縮進方式.

例如:

for (...)

{ //{}單獨占一行,與for左對齊

... // program code

}

void example_fun(void)

{

... // program code

}

2. 代碼注釋

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

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

2) 說明性文件(如頭文件.h文件)頭部應進行注釋, 注釋必須列出:版權說明、版本

號、生成日期、作者、內容、功能、 修改日志等, 頭文件的注釋中還應有函數功能

簡要說明。

例如:

Copyright (C), 2004-2018, 華清遠見教育科技集團.

File name: // 文件名

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

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

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

// 制、順序、獨立或依賴等關系

Function List: // 主要函數列表,每條記錄應包括函數名及功能簡要說明

1. ....

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

// 者及修改內容簡述

1. Date:

Author:

Modification:

2. ...

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

例如:

Copyright (C), 1988-2018, 華清遠見教育科技集團.

FileName: test.cpp

Author: Version : Date:

Description: // 模塊描述

Function List: // 主要函數及其功能

1. -------

History: // 歷史修改記錄

David 96/10/12 1.0 build this moudle

4) 函數頭部應進行注釋,列出函數的功能、輸入參數、輸出參數、返回值等。

例如:

Function: // 函數名稱

Description: // 函數功能、性能等的描述

Input: // 輸入參數說明,包括每個參數的作用、取值說明及參數間關系。

Output: // 對輸出參數的說明。

Return: // 函數返回值的說明

Others: // 其它說明

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

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

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

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

3. 標識符命名

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

可以理解的縮寫,避免使人產生誤解.

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

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

例如: int gCount = 0;

3) 命名規范必須與所使用的系統風格保持一致,并在同一項目中統一,比如采用

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

劃線混排的方式。

例如: char total_score =0;

4) 函數名應準確描述函數的功能,使用動賓詞組為執行某操作的函數命名。

例如:

int input_record( void )

unsigned char get_current_color( void )

5) 除非必要,不要用數字或較奇怪的字符來定義標識符

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

4. 代碼可讀性

1) 注意運算符的優先級,并用括號明確表達式的操作順序,避免使用默認優先級

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

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

2) 避免使用不易理解的數字, 用有意義的標識來替代。 涉及物理狀態或者含有物理意

義的常量,不應直接使用數字,必須用有意義的枚舉或宏來代替.

例如:

#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; 應該分成多個語句

書寫,增強代碼可讀性.

二、嵌入式編程中的注意事項

嵌入式軟件開發和普通軟件編程相比,有一些自己的特點,下面從嵌入式軟件架構,中斷編程,寄存器配置,浮點運算等幾個方面來講解嵌入式編程中的注意事項.

1. 嵌入式系統的軟件架構

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

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

2) 某模塊提供給其它模塊調用的外部函數及數據需在.h中文件中冠以extern關鍵字

聲明;

3) 模塊內的函數和全局變量需在.c文件開頭冠以static關鍵字聲明;

4) 永遠不要在.h文件中定義變量!定義變量和聲明變量的區別在于定義會產生內存分

配的操作,是匯編階段的概念;而聲明則只是告訴包含該聲明的模塊在連接階段從

其它模塊尋找外部函數和變量

2. 中斷編程

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

中斷服務程序需要滿足如下要求:

1) 不能有返回值;

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

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

3. 寄存器配置

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

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

我們不能這樣寫成這樣:

GPIOADAT = 0x02; //將其他位設置為 0

而應該寫成這樣:

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

4. 浮點運算

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

5. volatile 關鍵字的使用

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

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

以上就是我今天要給同學們講解的嵌入式軟件編程規范和注意事項,希望同學們在實際的嵌入式項目開發過程中嚴格遵循嵌入式軟件編程規范和注意事項,開發出高質量,穩定,可靠,維護性高的嵌入式軟件。

上一篇:數據結構有什么用

下一篇:數據結構樹應用在哪兒比較多

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 云南打砂机_昆明制砂机_云南砂石生产线_昆明洗砂机_昆明除尘设备_云南昆明滇重矿山机械设备有限公司 | 微米环境-餐厨/厨余/果蔬垃圾处理设备厂家-大型成套设备解决方案 | 锌铝合金压铸-深圳压铸加工-铝挤压拉伸-压铸模具厂-广东誉格精密技术有限公司 | 陕西筱润智能科技有限公司 干部人事智能档案柜 智能密集架 智能档案柜 部队选层文件智能柜 智能枪弹柜 财务智能档案柜 边防武警智能密集架 医院智能档案柜 部队选层文件智能柜智能枪弹柜 学校医院文件柜 企事业单位公检法智能文件柜 生产厂家-筱润智能科技有限公司 RFID射频智能密集架 全自动智能选层档案柜 智能密保柜 枪柜部队营房营具床桌椅办公家具 办公用品档案盒设备货架 全自动智能选层柜生产厂家-筱润智能科技有限公司 | 欧路哲门窗|佛山欧路哲门窗有限公司|专业门窗定制品牌 | 烘焙服定做_定做烘焙制服_工服定制厂家_烘焙服生产厂家-庆洋制衣 | 转轮除湿机,转轮除湿机,恒温恒湿机厂家_合肥铂克环境设备有限公司 | 制砂机-合金-耐磨锤头-耐磨衬板-铸造件厂家-巩义市豫园宏宇铸造有限公司 | 排污管道疏通_长沙消防管道/暗管网漏水检测维修_长沙雨水管道疏通就找湖南鸿磊环保工程有限公司 排水PVC管-PVC排污管-给水PVC管-电线PVC管-米阳建材pvc管厂 | 抛丸机-H型钢结构抛丸机-钢板通过式抛丸机厂家-泓霖喷砂除锈设备 | 食品包装膜-铝箔包装袋-食品真空包装袋定制-塑料包装袋厂家-德远塑业 | 小程序开发,网站建设,APP开发,商城系统开发,社区团购系统开发,区块链溯源,互联网资质办理-软多信息技术有限公司_河南软多信息技术有限公司 | 无锡亮鑫不锈钢有限公司-不锈钢炉胆,马弗炉胆,耐高温炉胆,310s炉胆,网带炉 | 塑料植草格_停车场植草格_消防车道植草格厂家_山东朋联建材 | 液压支架配件|液压支架立柱|液压支架千斤顶|液压支架换向阀|液压支架乳化油|液压支架密封件-山东卓力生产厂家 | 狠狠穞A片一區二區三區-免费网站在线观看人数更新时间-欧洲尺码日本尺码专线不卡顿,国产大尺度禁片未删减版,baomaav | 语音芯片_蓝牙芯片_ble数传芯片_蓝牙数传模块厂家_拓达半导体-蓝牙数传芯片模块原厂 | 水暖毯厂家-水暖毯配件-河北鑫政扬家用电器有限公司 | 智慧网格,智慧城市,智慧社区,精准扶贫,农村电商,网格化,网格化管理,智慧养老,北京瑞光极远数码科技有限公司 | 木别墅-小木屋-防腐木木屋-成都腾龙装配式建筑科技有限公司 | 秦皇岛图成玻璃_横切机,琴键落板,堆垛机械手,玻璃钢化设备,掰边机,铺纸机,水平堆垛机+超大板堆垛机,纵掰纵分,下片机,冷端优化切割 | 美国Riverhawk轴承,Riverhawk十字弹簧轴承,Riverhawk联轴器,Riverhawk液压工具 | 呕吐毒素快速检测仪-黄曲霉毒素测定仪-玉米赤霉烯酮快速检测卡-南京微测生物科技有限公司 | 拉布机_全自动拉布机_全自动拉布机厂家-江苏拉布机械科技有限公司 | 湖南长沙癫痫病医院_湖南癫痫病专科医院_湖南治疗癫痫病专业医院_长沙和谐医院有限公司 | 水电站泵站LCU控制屏_发电机保护_变压器保护_逆功率保护_防孤岛保护装置_ 电力微机保护网 | 湖南净声源环保科技有限公司是一家专业从事噪声治理和建筑声学设计生态环境综合治理服务的企业,专业从事株洲电梯隔音治理,湘潭中央空调降噪处理,衡阳邵阳冷却塔噪音治理,岳阳常德大型风机噪声隔音降噪,张家界空压机噪声治理,益阳配电房变压器噪声治理,专业郴州永州工厂企业车间噪声治理,怀化娄底专业机械设备减振降治理,武汉噪音治理隔音降噪公司,孝感噪音治理,立式球磨机的噪声控制,专业隔音降噪公司,、以及各类机械动力设备减振降噪噪声治理的公司,同时为客户提供咨询与解决方案 | 水暖毯厂家-水暖毯配件-河北鑫政扬家用电器有限公司 | 上海钧尚电器有限公司 - Faulhaber电机 AMETEK pittman电机 AMETEK ROTRON军用航空风机 Exlar电动缸 MAE电机 MCG电机 CP电动工具 马头工具 AMCI驱动器 直流电机 减速箱 直流伺服电机,无刷电机,直线电机 直流防爆电机 防爆电机 汽车助力转向电机 EPS电机 faulhaber motor faulhaber gearbox NANOTEC电机 ELWOOD电机 PHYTRON电机 EXLAR伺服电动缸 高力矩、高性能直流电机,音圈电机,风机,直流风机,航空风机 | 泡酒配方大全-泡药酒专业的网站-泡酒之家 | 淘金车,移动式淘金车,大小型旱地采矿车-青州冠诚重工机械有限公司 | 内蒙古发电机厂家_呼和浩特发电机租赁_销售_维修_回收_置换|盈弘发电设备有限责任公司 | 云梯车|云梯搬家车|工程高空上料车|云梯登高车价格|视频|图片-专汽之家 | 精品中文字幕在线观看,粉嫩av一区二区三区,最近中文字幕在线看免费视频,亚洲高清在线观看,日本一区二区视频手机免费看,国产黄色小视频,亚洲高清免费视频,国产精品一区二区欧美视频,亚洲人免费视频,亚洲视频在线观看免费,国产免费高清综合视频,中文字幕永久在线 | 提供技术支持-TXC晶振-晶振厂家-32.768K,石英晶体振荡器厂家销售-NDK振荡器正规代理商 | 无塔供水_全自动无塔供水设备_石家庄工泉水处理_无塔供水器 | 云南亿华工贸有限公司-云南护栏网-云南锌钢护栏-昆明市政护栏-工地护栏-昆明护栏网厂家 | 全降解塑料厂家_淋膜_秸秆_手机壳_气泡袋_牙刷牙线_GRS可回收包装材料-东莞全球环保科技有限公司 | 生物柴油_油酸甲酯厂家_脂肪酸甲酯_植物油燃料-中凯化工 | 上海上市答谢酒会_企业年会_新品上市发布会_周年/开业庆典_会议会务_活动策划布置演出公司 | 青岛网站建设_网站制作_品牌设计_网站设计_圭谷设计 |