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