嵌入式的發(fā)展大大改善了人們的生存狀態(tài),人們可以讓機(jī)器代替我們?nèi)ドa(chǎn),也可以使用更先進(jìn)的設(shè)備來(lái)娛樂(lè)生活,讓我們的生活變得更智能化,可以說(shuō)嵌入式代表著的生產(chǎn)力。而未來(lái)對(duì)智能設(shè)備和自動(dòng)化設(shè)備的需求肯定也是越來(lái)越高,畢竟人總是懶惰的,也總是愛(ài)享受的,機(jī)器干活了人就可以歇著了,更高端的智能設(shè)備也能豐富人們的生活,所以成為一名嵌入式工程師是非常有前途的!
要學(xué)習(xí)嵌入式就要先學(xué)習(xí)C和C++這兩門編程語(yǔ)言。其實(shí)要成為“代碼搬運(yùn)工”,我覺(jué)得還是很簡(jiǎn)單的,為什么呢?編程語(yǔ)言其實(shí)也是語(yǔ)言,我們只要將要執(zhí)行的動(dòng)作翻譯成芯片的語(yǔ)言就可以了。舉個(gè)例子我們要拿起一個(gè)蘋果,但是我們不是自己去拿,我們要讓一個(gè)只聽(tīng)得懂英語(yǔ)的工人去拿,怎么辦呢?你要用英語(yǔ)告訴他“pick up this apple”,只有這樣講他才會(huì)去拿起蘋果;現(xiàn)在我們把這個(gè)工人換成了只聽(tīng)得懂C語(yǔ)言的芯片,你該怎么辦呢?同樣的,你要用C語(yǔ)言告訴芯片去拿起蘋果,道理都是一樣的,只是C語(yǔ)言有C語(yǔ)言的用法,我們只要按著他的規(guī)則寫就OK了。
對(duì)于嵌入式底層工程師來(lái)說(shuō),我們要學(xué)習(xí)的不僅僅是C語(yǔ)言的基本語(yǔ)法,更重要的是如何通過(guò)C語(yǔ)言這個(gè)工具,去理解我們的計(jì)算機(jī)系統(tǒng)、CPU架構(gòu):
1)程序到底是如何編譯、鏈接、和運(yùn)行的?
2)運(yùn)行時(shí)各種代碼段、數(shù)據(jù)段、BSS段、堆棧在內(nèi)存中如何分布,如何管理的?
3)程序在不同的平臺(tái)(ARM、X86)、裸機(jī)環(huán)境或有OS的環(huán)境(linux、uc/os等)有何不同?
4)靜態(tài)鏈接與動(dòng)態(tài)鏈接的過(guò)程有何差異,為什么要使用動(dòng)態(tài)鏈接?共享庫(kù)?
5)不同的開(kāi)發(fā)平臺(tái)、IDE、編譯器,C語(yǔ)言的編程有何差異和不一樣的地方,如何做到跨平臺(tái)、增強(qiáng)程序的可移植性和魯棒性?
6)各種變量名、函數(shù)名、數(shù)組名、指針的本質(zhì)是什么?編譯器是如何處理的?
搞懂了這些語(yǔ)言背后計(jì)算機(jī)系統(tǒng)知識(shí),還遠(yuǎn)遠(yuǎn)不夠,還要去學(xué)習(xí)操作系統(tǒng)相關(guān)的知識(shí):進(jìn)程、線程、中斷、內(nèi)存管理等。
對(duì)于嵌入式開(kāi)發(fā)來(lái)說(shuō),還要學(xué)習(xí)ARM等處理器架構(gòu)知識(shí)、GCC編譯器對(duì)C標(biāo)準(zhǔn)的各種擴(kuò)展,各種生僻的用法,否則你去看linux內(nèi)核代碼、驅(qū)動(dòng)代碼,總感覺(jué)“怪怪的”,好像哪里不對(duì),跟平時(shí)的C語(yǔ)言不太一樣,感覺(jué)自己學(xué)的是一門假C語(yǔ)言......
C語(yǔ)言的精華是內(nèi)存、存儲(chǔ)管理。各種隱藏很深的bug其實(shí)也跟內(nèi)存有關(guān):內(nèi)存越界、內(nèi)存泄露、野指針等等,一個(gè)不經(jīng)意的疏漏,就可能陰溝里翻船。就是有多年工作經(jīng)驗(yàn)的工程師也不敢保證自己寫的代碼一定沒(méi)有問(wèn)題。C語(yǔ)言默認(rèn)大家都是大牛、計(jì)算機(jī)專家,可惜現(xiàn)實(shí)中往往太多挖坑小能手,太多豬一樣的隊(duì)友。如何養(yǎng)成良好的編程習(xí)慣,避免各種bug,也是C語(yǔ)言進(jìn)階學(xué)習(xí)的一個(gè)重點(diǎn)。