<output id="yn1pw"></output>
    <wbr id="yn1pw"></wbr>

    <form id="yn1pw"><legend id="yn1pw"></legend></form>

  1. 更多課程 選擇中心

    嵌入式培訓
    達內IT學院

    400-111-8989

    學習嵌入式C語言要掌握到什么程度?

    • 發布:嵌入式培訓
    • 來源:嵌入式問答
    • 時間:2018-01-08 16:30

    我在知乎上回答的一個問題,轉發到公眾號上,給大家分享:

    作者:王利濤@宅學部落

    跟學英語一樣,C語言也算是一門語言。C語言本身很簡潔的,除了34個關鍵字(ANSI標準,但C99標準新增幾個關鍵字及特性,用來定義新的數據類型、變長數組等)、40多個運算符、再明白數據的基本類型、程序的順序、分支、循環3種基本結構,就OK了,就這點東西。一般,看上一周左右基本上就可以掌握。

    但是,掌握了這些,你就覺得自己精通C語言、可以熟練運用C語言進行編程了嗎?絕不可能。就像你掌握了英語的六大時態、各種從句語法結構,還是寫不出《哈雷波特》、寫不出一篇好英語作文一個道理。英語語法就這點東西,你需要進一步學習的是,如何通過英語語言這個工具,去了解英文圈文化、歷史文化、法律政治、西方人的思維等等,否則你就無法理解西方人說話的一些“梗”,不算掌握一門地道的英語。

    學習C語言也是一樣,尤其是對于嵌入式底層工程師來說,我們要學習的不僅僅是C語言的基本語法,更重要的是如何通過C語言這個工具,去理解我們的計算機系統、CPU架構:

    1)程序到底是如何編譯、鏈接、和運行的?

    2)運行時各種代碼段、數據段、BSS段、堆棧在內存中如何分布,如何管理的?

    3)程序在不同的平臺(ARM、X86)、裸機環境或有OS的環境(linux、uc/os等)有何不同?

    4)靜態鏈接與動態鏈接的過程有何差異,為什么要使用動態鏈接?共享庫?

    5)不同的開發平臺、IDE、編譯器,C語言的編程有何差異和不一樣的地方,如何做到跨平臺、增強程序的可移植性和魯棒性?

    6)各種變量名、函數名、數組名、指針的本質是什么?編譯器是如何處理的?

    搞懂了這些語言背后計算機系統知識,還遠遠不夠,還要去學習操作系統相關的知識:進程、線程、中斷、內存管理

    對于嵌入式開發來說,還要學習ARM等處理器架構知識、GCC編譯器對C標準的各種擴展,各種生僻的用法,否則你去看linux內核代碼、驅動代碼,總感覺“怪怪的”,好像哪里不對,跟平時的C語言不太一樣,感覺自己學的是一門假C語言......

    C語言的精華是內存、存儲管理。各種隱藏很深的bug其實也跟內存有關:內存越界、內存泄露、野指針等等,一個不經意的疏漏,就可能陰溝里翻船。就是有多年工作經驗的工程師也不敢保證自己寫的代碼一定沒有問題。C語言默認大家都是大牛、計算機專家,可惜現實中往往太多挖坑小能手,太多豬一樣的隊友。如何養成良好的編程習慣,避免各種bug,也是C語言進階學習的一個重點。

    為了測試一下你對C語言的掌握程度,下面的幾個測試題,可以自我測試一下,檢測一下自己的C語言水平,是否達到嵌入式工程師(尤其是內核驅動工程師)的要求:

    1)你對以下C語言的基本概念是否掌握?是否能用一句話概括出來?

    標識符、關鍵字、預定義標識符、分隔符、語法檢查、語義檢查、表達式、語句、左值、對象、結合性、左結合右結合、未定義行為

    2)一個sizeof(int)引發的思考

    ?sizeof是函數嗎?是關鍵字?預定義標識符? 后兩者有何區別??在32位和64位的Windows7系統下,結果分別是多少??在32位和64位X86 CPU系統下,結果分別是多少??在8位、16位、32位ARM系統環境下運行結果分別是多少??在Turbo C、keil、GCC-32、GCC-64開發環境下,結果是多少??使用gcc –m32生成一個32位代碼,運行在64位環境下,結果? 使用gcc –m64生成一個64位代碼,運行在32位環境下,結果?

    3)自增運算符帶來的思考

    下面一段程序,在不同的編譯器上編譯,結果是多少,一樣嗎?為什么?

    i=1,j=2; printf(“%d ”,i++*i++); i+++j;

    4)代碼分析

    使用tc、C-free、GCC、VC++6.0、visual studio分別編譯下面代碼,會出現什么問題?

    int main(){ int i; //定義一個變量 int a[0]; printf("hello world! "); int j; for(int k=0;k<10;k++); return 0;}

    5)在linux環境下,運行下面代碼,會出現什么問題?

    int * data_copy ( int *p){ int buffer[8192*1024]; memcpy(buffer,p,8192*1024); return buffer;}

    6)下面是linux內核代碼的一部分(摘自Linux4.4內核),你能看懂多少?

    #define stamp(fmt, args...) pr_debug("%s:%i:" fmt " ", __func__, __LINE__, ## args)#define

    container_of(ptr, type, member) ({ const typeof(((type *)0)->member)

    * __mptr = (ptr); (type *)((char *)__mptr - offsetof(type, member)); })struct urb { … struct usb_iso_packet_descriptor iso_frame_desc[0]; } urb->transfer_flags &= ~(URB_DIR_MASK | URB_DMA_MAP_SINGLE |URB_DMA_MAP_PAGE );

    本文內容轉載自網絡,來源/作者信息已在文章頂部表明,版權歸原作者所有,如有侵權請聯系我們進行刪除!

    預約申請免費試聽課

    填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

    上一篇:嵌入式培訓靠譜嗎?就業好不好?
    下一篇:0基礎學習嵌入式難嗎?多久能學會?

    嵌入式培訓主要學習哪些內容?好學嗎?

    大學生參加嵌入式培訓班好就業嗎

    學習嵌入式培訓有必要報班嗎

    嵌入式培訓主要培訓什么

    • 掃碼領取資料

      回復關鍵字:視頻資料

      免費領取 達內課程視頻學習資料

    • 視頻學習QQ群

      添加QQ群:1143617948

      免費領取達內課程視頻學習資料

    Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

    選擇城市和中心
    黑龍江省

    吉林省

    河北省

    湖南省

    貴州省

    云南省

    廣西省

    海南省

    高清在线不卡一区二区_2019最新国产高清不卡a_亚洲欧洲日本aⅴ 百度 好搜 搜狗
    <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>