開關電源組C語言編程規(guī)范ppt課件
《開關電源組C語言編程規(guī)范ppt課件》由會員分享,可在線閱讀,更多相關《開關電源組C語言編程規(guī)范ppt課件(48頁珍藏版)》請在裝配圖網上搜索。
,,C語言編程規(guī)范 編寫出簡潔、可維護、可靠、可測試、高效、可移植的代碼,內部公開,前言,提高作品競爭力,要在以下幾個方面下功夫: 提高規(guī)劃水平,把握正確的方向(戰(zhàn)略) 提高設計水平,搭建合理的系統(tǒng)(戰(zhàn)術) 提高編碼水平,開發(fā)穩(wěn)定的代碼(單兵作戰(zhàn)技能),前言,我們?yōu)槭裁匆M行C語言編程規(guī)范培訓? 最好的醫(yī)術是預防 真正的難問題往往是低級錯誤引起的 我們的編碼水平不容樂觀 C是程序員的語言,前言,要提高編碼水平,每個開發(fā)人員要做到: 勤學苦練,提高編程技能 前車之鑒,后世之師,不犯同樣的錯誤; 堅持代碼Review、PC-LINT檢查和單元測試; 總而言之,就是少犯錯誤,盡早發(fā)現錯誤,基礎篇之簡單就是美,If (a a的值是多少?,基礎篇之簡單就是美,這里沒有答案,只有問題: 我們問什么要寫這樣的代碼? 工作太輕松? BUG不夠多? 水平顯不出? ………… 如何改進? 優(yōu)先級搞不清楚用括號; 復合語句太羅嗦,拆成幾行來寫; 套用兩句廣告詞: 把簡單的事情復雜化,太累 把復雜的事情簡單化,貢獻!,基礎篇之簡單就是美,編碼的三不原則 不要挑戰(zhàn)自己的記性 不要挑戰(zhàn)同事的耐心 不要挑戰(zhàn)編譯器的水平 編碼的三用原則 能用簡單語句的,就不要用復雜的技巧 能用成熟代碼的,就不要再來一套 能用上工具的,就一定要機械化,代碼總體原則,1、清晰第一 清晰性是易于維護、易于重構的程序必需具備的特征。代碼首先是給人讀的,好的代碼應當可以像文章一樣發(fā)聲朗誦出來。 目前軟件維護期成本占整個生命周期成本的40%~90%。根據業(yè)界經驗,維護期變更代碼的成本,小型系統(tǒng)是開發(fā)期的5倍,大型系統(tǒng)(100萬行代碼以上)可以達到100倍。業(yè)界的調查指出,開發(fā)組平均大約一半的人力用于彌補過去的錯誤,而不是添加新的功能來幫助公司提高競爭力。,代碼總體原則,2、簡潔為美 簡潔就是易于理解并且易于實現。代碼越長越難以看懂,也就越容易在修改時引入錯誤。寫的代碼越多,意味著出錯的地方越多,也就意味著代碼的可靠性越低。因此,我們提倡大家通過編寫簡潔明了的代碼來提升代碼可靠性。 廢棄的代碼(沒有被調用的函數和全局變量)要及時清除,重復代碼應該盡可能提煉成函數。,代碼總體原則,3、選擇合適的風格,與代碼原有風格保持一致 產品所有人共同分享同一種風格所帶來的好處,遠遠超出為了統(tǒng)一而付出的代價。在公司已有編碼規(guī)范的指導下,審慎地編排代碼以使代碼盡可能清晰,是一項非常重要的技能。如果重構/修改其他風格的代碼時,比較明智的做法是根據現有代碼的現有風格繼續(xù)編寫代碼,1 頭文件,對于C語言來說,頭文件的設計體現了大部分的系統(tǒng)設計。不合理的頭文件布局是編譯時間過長的根因,不合理的頭文件實際上不合理的設計。 術語定義: 依賴:本章節(jié)特指編譯依賴。若x.h包含了y.h,則稱作x依賴y。依賴關系會進行傳導,如x.h包含y.h,而y.h又包含了z.h,則x通過y依賴了z。依賴將導致編譯時間的上升。雖然依賴是不可避免的,也是必須的,但是不良的設計會導致整個系統(tǒng)的依賴關系無比復雜,使得任意一個文件的修改都要重新編譯整個系統(tǒng),導致編譯時間巨幅上升。,1 頭文件,原則1.1 頭文件中適合放置接口的聲明,不適合放置實現。 說明:頭文件是模塊或單元(Unit)的對外接口。頭文件中應放置對外部的聲明,如對外提供的函數聲明、宏定義、類型定義等。 內部使用的函數聲明不應放在頭文件中。 內部使用的宏、枚舉、結構定義不應放入頭文件中。 變量定義不應放在頭文件中,應放在.c文件中。 變量的聲明盡量不要放在頭文件中,亦即盡量不要使用全局變量作為接口。變量是模塊或單元的內部實現細節(jié),不應通過在頭文件中聲明的方式直接暴露給外部,應通過函數接口的方式進行對外暴露。 即使必須使用全局變量,也只應當在.c中定義全局變量,在.h中僅聲明變量為全局的。,1 頭文件,原則1.2 頭文件應當職責單一。 說明:頭文件過于復雜,依賴過于復雜是導致編譯時間過長的主要原因。很多現有代碼中頭文件過大,職責過多,再加上循環(huán)依賴的問題,可能導致為了在.c中使用一個宏,而包含十幾個頭文件。,1 頭文件,1 頭文件,規(guī)則1.1 每一個.c文件應有一個同名.h文件,用于聲明需要對外公開的接口。 說明:如果一個.c文件不需要對外公布任何接口,則其就不應當存在,除非它是程序的入口,如main函數所在的文件。 有些特別簡單的頭文件,如命令ID定義頭文件,不需要有對應的.c存在。,1 頭文件,規(guī)則1.2 禁止頭文件循環(huán)依賴。 說明:頭文件循環(huán)依賴,指a.h包含b.h,b.h包含c.h,c.h包含a.h之類導致任何一個頭文件修改,都導致所有包含了a.h/b.h/c.h的代碼全部重新編譯一遍。而如果是單向依賴,如a.h包含b.h,b.h包含c.h,而c.h不包含任何頭文件,則修改a.h不會導致包含了b.h/c.h的源代碼重新編譯。,1 頭文件,規(guī)則1.3 .c/.h文件禁止包含用不到的頭文件。 說明:很多系統(tǒng)中頭文件包含關系復雜,開發(fā)人員為了省事起見,可能不會去一一鉆研,直接包含一切想到的頭文件,甚至有些產品干脆發(fā)布了一個god.h,其中包含了所有頭文件,然后發(fā)布給各個項目組使用,這種只圖一時省事的做法,導致整個系統(tǒng)的編譯時間進一步惡化,并對后來人的維護造成了巨大的麻煩。,1 頭文件,規(guī)則1.4 頭文件應當自包含。 說明:簡單的說,自包含就是任意一個頭文件均可獨立編譯。如果一個文件包含某個頭文件,還要包含另外一個頭文件才能工作的話,就會增加交流障礙,給這個頭文件的用戶增添不必要的負擔。 示例:如果a.h不是自包含的,需要包含b.h才能編譯,會帶來的危害: 每個使用a.h頭文件的.c文件,為了讓引入的a.h的內容編譯通過,都要包含額外的頭文件b.h。 額外的頭文件b.h必須在a.h之前進行包含,這在包含順序上產生了依賴。,1 頭文件,規(guī)則1.5 總是編寫內部#include保護符(#define 保護)。 說明:多次包含一個頭文件可以通過認真的設計來避免。如果不能做到這一點,就需要采取阻止頭文件內容被包含多于一次的機制。 通常的手段是為每個文件配置一個宏,當頭文件第一次被包含時就定義這個宏,并在頭文件被再次包含時使用它以排除文件內容。,1 頭文件,規(guī)則1.6 禁止在頭文件中定義變量。 說明:在頭文件中定義變量,將會由于頭文件被其他.c文件包含而導致變量重復定義。,1 頭文件,規(guī)則1.7 只能通過包含頭文件的方式使用其他.c提供的接口,禁止在.c中通過extern的方式使用外部函數接口、變量。 說明:若a.c使用了b.c定義的foo()函數,則應當在b.h中聲明extern int foo(int input);并在a.c中通過#include 來使用foo。禁止通過在a.c中直接寫extern int foo(int input);來使用foo,后面這種寫法容易在foo改變時可能導致聲明和定義不一致。,1 頭文件,規(guī)則1.7 只能通過包含頭文件的方式使用其他.c提供的接口,禁止在.c中通過extern的方式使用外部函數接口、變量。 說明:若a.c使用了b.c定義的foo()函數,則應當在b.h中聲明extern int foo(int input);并在a.c中通過#include 來使用foo。禁止通過在a.c中直接寫extern int foo(int input);來使用foo,后面這種寫法容易在foo改變時可能導致聲明和定義不一致。,1 頭文件,規(guī)則1.8 禁止在extern “C”中包含頭文件。,2 略,略,3 標識符,原則3.1 標識符的命名要清晰、明了,有明確含義,同時使用完整的單詞或大家基本可以理解的縮寫,避免使人產生誤解。 說明:盡可能給出描述性名稱,不要節(jié)約空間,讓別人很快理解你的代碼更重要。 示例:好的命名:,3 標識符,原則3.2 除了常見的通用縮寫以外,不使用單詞縮寫,不得使用漢語拼音。 說明:較短的單詞可通過去掉“元音”形成縮寫,較長的單詞可取單詞的頭幾個字母形成縮寫,一些單詞有大家公認的縮寫,常用單詞的縮寫必須統(tǒng)一,4 略,略,5 宏,規(guī)則5.1 用宏定義表達式時,要使用完備的括號。 說明:因為宏只是簡單的代碼替換,不會像函數一樣先將參數計算后,再傳遞。 #define RECTANGLE_AREA(a, b) (a * b) 則c/RECTANGLE_AREA(a, b) 將擴展成c/a * b , c 與b 本應該是除法運算,結果變成了乘法運算,造成錯誤。,5 宏,規(guī)則5.2 將宏所定義的多條表達式放在大括號中。 說明:更好的方法是多條語句寫成do while(0)的方式。,5 宏,規(guī)則5.3 使用宏時,不允許參數發(fā)生變化。,5 宏,規(guī)則5.4 不允許直接使用魔鬼數字。 說明:使用魔鬼數字的弊端:代碼難以理解;如果一個有含義的數字多處使用,一旦需要修改這個數值,代價慘重。 使用明確的物理狀態(tài)或物理意義的名稱能增加信息,并能提供單一的維護點。 解決途徑: 對于局部使用的唯一含義的魔鬼數字,可以在代碼周圍增加說明注釋,也可以定義局部const變量,變量命名自注釋。 對于廣泛使用的數字,必須定義const全局變量/宏;同樣變量/宏命名應是自注釋的。 0作為一個特殊的數字,作為一般默認值使用沒有歧義時,不用特別定義。,6-8 略,略,9 排版與格式,規(guī)則9.1 程序塊采用縮進風格編寫,每級縮進為4個空格。 說明:當前各種編輯器/IDE都支持TAB鍵自動轉空格輸入,需要打開相關功能并設置相關功能。 編輯器/IDE如果有顯示TAB的功能也應該打開,方便及時糾正輸入錯誤。 IDE向導生成的代碼可以不用修改。 宏定義、編譯開關、條件預處理語句可以頂格(或使用自定義的排版方案,但產品/模塊內必須保持一致)。,9 排版與格式,規(guī)則9.2 相對獨立的程序塊之間、變量說明之后必須加空行。,9 排版與格式,規(guī)則9.3 一條語句不能過長,如不能拆分需要分行寫。一行到底多少字符換行比較合適,產品可以自行確定 說明:對于目前大多數的PC來說,132比較合適(80/132是VTY常見的行寬值);對于新PC寬屏顯示器較多的產品來說,可以設置更大的值。 換行時有如下建議: 換行時要增加一級縮進,使代碼可讀性更好; 低優(yōu)先級操作符處劃分新行;換行時操作符應該也放下來,放在新行首; 換行時建議一個完整的語句放在一行,不要根據字符數斷行,9 排版與格式,,9 排版與格式,規(guī)則9.4 多個短語句(包括賦值語句)不允許寫在同一行內,即一行只寫一條語句。,9 排版與格式,規(guī)則9.5 if、for、do、while、case、switch、default等語句獨占一行。 說明:執(zhí)行語句必須用縮進風格寫,屬于if、for、do、while、case、switch、default等下一個縮進級別; 一般寫if、for、do、while等語句都會有成對出現的?{}?,對此有如下建議可以參考: if、for、do、while等語句后的執(zhí)行語句建議增加成對的?{}?; 如果if/else配套語句中有一個分支有?{}?,那么令一個分支即使一行代碼也建議增加?{}?; 添加?{?的位置可以在if等語句后,也可以獨立占下一行;獨立占下一行時,可以和if在一個縮進級別,也可以在下一個縮進級別;但是如果if語句很長,或者已經有換行,建議?{?使用獨占一行的寫法。,9 排版與格式,規(guī)則9.6 在兩個以上的關鍵字、變量、常量進行對等操作時,它們之間的操作符之前、之后或者前后要加空格;進行非對等操作時,如果是關系密切的立即操作符(如-),后不應加空格。 說明:采用這種松散方式編寫代碼的目的是使代碼更加清晰。 在已經非常清晰的語句中沒有必要再留空格,如括號內側(即左括號后面和右括號前面)不需要加空格,多重括號間不必加空格,因為在C語言中括號已經是最清晰的標志了。 在長語句中,如果需要加的空格非常多,那么應該保持整體清晰,而在局部不加空格。給操作符留空格時不要連續(xù)留兩個以上空格。,9 排版與格式,9 排版與格式,9 排版與格式,建議9.1 注釋符(包括?/*??//??*/?)與注釋內容之間要用一個空格進行分隔。 說明:這樣可以使注釋的內容部分更清晰。 現在很多工具都可以批量生成、刪除'//'注釋,這樣有空格也比較方便統(tǒng)一處理。 建議9.2 源程序中關系較為緊密的代碼應盡可能相鄰。,10 在定點處理器中的浮點運算,在控制算法中,通常會碰到浮點數 例如:題目要求輸出電壓達到25.86V時,產生過壓報警,你的程序如何計算?,10 在定點處理器中的浮點運算,在控制算法中,通常會碰到浮點數 例如:題目要求輸出電壓達到2.86V時,產生過壓報警,你的程序如何計算? 1.對輸出電壓進行采樣得到ADvalue = 3905; 2.計算真實電壓值:Vo= (ADvalue / 4096) * 3.0 = 2.8601; 3.if(Vo = 2.86) { ProtectProcess(); } 上述方法出現了好幾處浮點運算,一般比賽程序比較大,一旦使用這種方法,必然使工程中出現大量的浮點運算。該怎么做?,10 在定點處理器中的浮點運算,1.對輸出電壓進行采樣得到ADvalue = 3905; 1.對輸出電壓進行采樣得到ADvalue = 3905;人工(或者編譯器)事先計算2.86V電壓對應的ADvalueProtect = 3904; 2.計算真實電壓值:Vo= (ADvalue / 4096) * 3.0 = 2.8601; 2.不做這一步 3.if(Vo = 2.86) { ProtectProcess(); } 3.if(ADvalue = ADvalueProtect ) ….,10 在定點處理器中的浮點運算,若仍需要計算真實電壓值以便進行顯示,則可以: 1.定義浮點變量,然后計算真實電壓值:Vo= (ADvalue / 4096) * 3.0 = 2.8601;(錯誤方法?。?2.定義整型變量,然后計算真實電壓值:Vo= (ADvalue / 4096) * 3.0 = ? 3.定義整型變量,然后計算真實電壓被放大1000倍(看需要選擇放大倍數)值:Vo= ((ADvalue * 1000) / 4096) * 3.0 = 2860 10000倍呢? Vo= ((ADvalue * 10000 ) / 4096) * 3.0 = 28601 現在會在LCD上顯示真實值嗎?,10 在定點處理器中的浮點運算,更嚴格的要求是采用 Qn格式進行計算,感興趣的同學自己查閱相關資料,其原理也是對浮點數進行放大處理,需要記住小數點位置。作為比賽,可以采用前述簡單方法以避免浮點運算。,- 配套講稿:
如PPT文件的首頁顯示word圖標,表示該PPT已包含配套word講稿。雙擊word圖標可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設計者僅對作品中獨創(chuàng)性部分享有著作權。
- 關 鍵 詞:
- 開關電源 語言 編程 規(guī)范 ppt 課件
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://m.jqnhouse.com/p-1683591.html