C語言本身很簡潔的,除了34個關鍵字(ANSI标準,但C99标準新增幾個關鍵字及特性,用來定義新的數據類型、變長數組等)、40多個運算符、再明白數據的基本類型、程序的順序、分支、循環3種基本結構,就OK了,就這點東西。一般,看上一周左右基本上就可以掌握。
但是,掌握了這些,你就覺得自己精通C語言、可以熟練運用C語言進行編程了嗎?絕不可能。
嵌入式物聯網需要學的東西真的非常多,千萬不要學錯了路線和内容,導緻工資要不上去!
無償分享大家一個資料包,差不多150多G。裡面學習内容、面經、項目都比較新也比較全!某魚上買估計至少要好幾十。
點擊這裡找小助理0元領取:嵌入式物聯網學習資料(頭條)
人工智能時代,嵌入式和物聯網的薪資也是水漲船高,嵌入式開發和物聯網開發技術就是讓物體變得更智能的技術。
學習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\n”, i *i );
i j;
4)代碼分析
使用tc、C-free、GCC、VC 6.0、visual studio分别編譯下面代碼,會出現什麼問題?
int main()
{
int i; //定義一個變量
int a[0];
printf("hello world!\n");
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;
}
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!