|
前言:這是一年前我為公司內(nèi)部寫(xiě)的一個(gè)文檔,旨在向年輕的嵌入式軟件工程師們介紹如何在裸機(jī)環(huán)境下編寫(xiě)優(yōu)質(zhì)嵌入式C程序。感覺(jué)是有一定的參考價(jià)值,所以拿出來(lái)分享,拋磚引玉。
摘要:本文首先分析了C語(yǔ)言的陷阱和缺陷,對(duì)容易犯錯(cuò)的地方進(jìn)行歸納整理;分析了編譯器語(yǔ)義檢查的不足之處并給出防范措施,以Keil MDK編譯器為例,介紹了該編譯器的特性、對(duì)未定義行為的處理以及一些高級(jí)應(yīng)用;在此基礎(chǔ)上,介紹了防御性編程的概念,提出了編程過(guò)程中就應(yīng)該防范于未然的多種措施;提出了測(cè)試對(duì)編寫(xiě)優(yōu)質(zhì)嵌入式程序的重要作用以及常用測(cè)試方法;最后,本文試圖以更高的層次看待編程,討論一些通用的編程思想。
1. 簡(jiǎn)介
2. C語(yǔ)言特性
1. 1處處都是陷阱
1. 11 無(wú)心之過(guò)
2. 12 數(shù)組下標(biāo)
3. 13 容易被忽略的break關(guān)鍵字
4. 14 意想不到的八進(jìn)制
5. 15指針加減運(yùn)算
6. 16關(guān)鍵字sizeof
7. 17增量運(yùn)算符和減量運(yùn)算符
8. 18邏輯與和邏輯或的陷阱
9. 19結(jié)構(gòu)體的填充
2. 2不可輕視的優(yōu)先級(jí)
3. 3隱式轉(zhuǎn)換
3. 編譯器
1. 1不能簡(jiǎn)單的認(rèn)為是個(gè)工具
2. 2不能依賴編譯器的語(yǔ)義檢查
1. 21莫名的死機(jī)
2. 22不起眼的改變
3. 23 難查的數(shù)組越界
4. 24神奇的volatile
5. 25局部變量
6. 26使用外部工具
3. 3你覺(jué)得有意義的代碼未必正確
1. 31常見(jiàn)的未定義行為
2. 32如何避免C語(yǔ)言未定義行為
4. 4 了解你的編譯器
1. 41編譯器的一些小知識(shí)
2. 42初始化的全局變量和靜態(tài)變量的初始值被放到了哪里
3. 43在C代碼中使用的變量編譯器將他們分配到RAM的哪里
4. 44默認(rèn)情況下棧被分配到RAM的哪個(gè)地方
5. 45 有多少RAM會(huì)被初始化
6. 46 MDK編譯器如何設(shè)置非零初始化變量
4. 防御性編程
1. 1具有形參的函數(shù)需判斷傳遞來(lái)的實(shí)參是否合法
2. 2仔細(xì)檢查函數(shù)的返回值
3. 3 防止指針越界
4. 4 防止數(shù)組越界
5. 5 數(shù)學(xué)算數(shù)運(yùn)算
1. 51除法運(yùn)算只檢測(cè)除數(shù)為零就可靠嗎
2. 52檢測(cè)運(yùn)算溢出
3. 53檢測(cè)移位
6. 6如果有硬件看門(mén)狗則使用它
7. 7關(guān)鍵數(shù)據(jù)儲(chǔ)存多個(gè)備份取數(shù)據(jù)采用表決法
8. 8對(duì)非易失性存儲(chǔ)器進(jìn)行備份存儲(chǔ)
9. 9軟件鎖
10. 10通信
11. 11開(kāi)關(guān)量輸入的檢測(cè)確認(rèn)
12. 12開(kāi)關(guān)量輸出
13. 13初始化信息的保存和恢復(fù)
14. 14陷阱
15. 15阻塞處理
5. 測(cè)試再測(cè)試
1. 1使用硬件調(diào)試器測(cè)試
2. 2有些缺陷很難纏
1. 21簡(jiǎn)單易用的調(diào)試函數(shù)
2. 22對(duì)調(diào)試函數(shù)進(jìn)一步封裝
6. 編程思想
1. 1編程風(fēng)格
1. 11 整潔的樣式
2. 12清晰的命名
3. 13恰當(dāng)?shù)淖⑨?br />
2. 2數(shù)據(jù)結(jié)構(gòu)
7. 總結(jié)和閱讀書(shū)目
1. 1關(guān)于語(yǔ)言特性
2. 2關(guān)于編譯器
3. 3關(guān)于防御性編程
4. 4關(guān)于編程思想
0.png (46.29 KB, 下載次數(shù): 68)
下載附件
2017-9-4 19:08 上傳
0.png (39.01 KB, 下載次數(shù): 90)
下載附件
2017-9-4 19:15 上傳
完整的word格式文檔51黑下載地址:
編寫(xiě)優(yōu)質(zhì)嵌入式C程序.docx
(339.55 KB, 下載次數(shù): 80)
2017-9-4 08:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|