陳國棟 ([email protected]) 2008/08/08 初稿 2009/10/6 內容整理,重新排版 很多朋友可能在學習C,但是沒有實際參與過嵌入式軟件項目,對工業上實際應用的C相關知識並不了解。這篇文章本來是用來指導新員工的,現在分享出來,希望能對准備進入嵌入式軟件領域的學習者有所幫助。這主要是一篇學習提綱,只是對部分重要知識點進行了講解,還有很多章節並沒有具體內容,需要讀者去查閱資料/搜索了解,如果有興趣完善它的可以聯系我,把您覺得要補充的內容發給我。閱讀過程中有任何感想/疑問也歡迎與我交流,謝謝! 1. 基礎篇 1.1. 數據類型、運算符與表達式 推薦:C語言算法優先級口訣 重點:運算中的類型隱式轉換。 1.2. C語言程序結構順序、分支、循環) 1.3. 數組、函數的使用 1.4. 指針的使用 1.5. 預處理命令 1.6. 位運算 1.7. 文件操作 2. 提高篇 2.1. vxWorks基礎知識 任務互斥與同步 任務死鎖的產生原因與解決辦法 優先級翻轉問題 二進制信號量與互斥信號量 2.2. Tornado的使用與調試技巧
2.3. VC的使用與調試技巧
2.4. Makefile基礎知識 2.5. PC-lint基礎知識 推薦:SmartLint幫助文件中的文章《PC-lint入門與提高》,該文章由0基礎開始對PC-lint相關知識做了較全面的介紹。 2.6. 基本算法及實現 排序算法的實現與復雜度分析快速排序、冒泡排序) qsort函數的使用 2.7. 了解TCP/IP基本原理 2.8. 程序結構設計原則 避免重復 了解封裝的好處 了解面向對象設計的基本思想及其在C語言中的應用 面向對象的基本特征:封裝、繼承、多態 面向對象與面向過程的區別:面向過程的設計中關注的是算法,面向對象的設計中關注的是對象及對象之間的關系。 面向對象的設計原則:封裝變化。對修改關閉,對擴展開放。依賴倒置。依賴抽象,而不是依賴具體。 C語言中使用面向對象的方法:1、借鑒面向對象的思想設計更好的程序結構,比如封裝變化就很有用。2、簡單的說,類就是把成員變量和成員方法封裝到了一起,所以也可以利用結構體封裝成員變量和函數指針的方法來模擬類的行為。國內一個模擬嵌入式系統運行的軟件skyeye便是這樣開發的。) 2.9. 編譯、運行環境相關的知識 程序編譯、鏈接的基本原理 PPC/ARM的寄存器使用、棧結構 2.10.指針概念的深入理解 2.11.結構體內存布局的理解 2.12.大端、小端CPU 2.13.字節對齊 2.14.宏定義的使用技巧 2.14.1. 常用宏定義 __FILE__ 表示文件路徑 __LINE__ 表示行號 2.14.2. 宏定義使用禁忌 宏定義的參數不能是自加、自減表達式。 2.14.3. 宏定義中“#”的用法 1、'#'是`stringize'的意思。 其後的變量將被用雙引號包括的字符串替代。例: #define display(x) show((long)(x), #x) 則display(abs(-5)); 將被替換為:show((long)(abs(-5)), "abs(-5)"); 注意有引號。 2、'##'是'token-paste'操作符。 其後的變量將被與之前的字符串合並在一起形成一個新的token.例: #define printvar(x) printf("%d\n", variable##x) 則printvar(3);將被替換為printf("%d\n", variable3); ##僅僅合並字符串,而形成一個token,沒有引號. 問題: 定義一個宏UNREF,使得UNREF(Var)展開後是(void)Var。 2.14.4. Makefile中的宏定義 2.14.5. PC-lint選項中的宏定義 2.14.6. 宏展開規則 問題: 可以把軟件版本定義為Makefile中的宏定義,然後在代碼中使用該版本號。代碼中需要一個字符串類型的版本號,如何實現? 2.15.參數個數可變的函數 2.16.局部變量不能取地址 被編譯器優化後,局部變量很可能存放在寄存器,而不是內存,寄存器是不能取地址的。 2.17.sprintf/strcpy函數的缺陷及解決辦法 2.18.位域的使用方法 2.19.防止頭文件重復包含的方法 2.20.C語言的局限與軟件業界的發展 C語言操作靈活,但是C語言構建的程序內存洩露、指針非法訪問、棧越界等問題層出不窮,而且C語言不支持面向對象,面向過程方式構建的系統普遍存在的問題“復雜”、“脆弱”、“模塊間強耦合”、“修改困難,牽一發而動全身”用C語言構建的系統一般都有,軟件最根本的規律便是不斷變化,這樣的軟件系統便在變化中不斷修改,不斷變得更加脆弱,直到最後無法再維護。 微軟推出的C#是在C++基礎上吸收了其它語言的精華創造出來的一種新的語言,在很多方面,它改進了C語言的缺陷和不足,把很多問題的發現都提前到編譯階段,比如C語言中if後面的表達式可以是賦值,這往往在編譯的時候不能發現,運行的時候卻是致命錯誤,C#語言本身的設計避免了這樣的問題,它規定if後面只能是bool表達式。 當然,目前嵌入式開發用得最多的還是C/C++,但我們可以多了解業界的新技術,拓寬視野、提高軟件水平、避免C語言陷阱開發出更優質的軟件。 3. 書籍推薦 3.1. 入門
《C經典教程.chm》 語音電子書 《C語言程序設計》 譚浩強 《數據結構》3.2. 進階《C和指針》 《C陷阱與缺陷》 《C專家編程》 《Head.First設計模式》
本文出自 “果凍的軟件技術博客” 博客,請務必保留此出處http://sinojelly.blog.51cto.com/479153/209752