嵌入式的發展大大改善了人們的生存狀態,人們可以讓機器代替我們去生產,也可以使用更先進的設備來娛樂生活,讓我們的生活變得更智能化,可以說嵌入式代表著的生產力。而未來對智能設備和自動化設備的需求肯定也是越來越高,畢竟人總是懶惰的,也總是愛享受的,機器干活了人就可以歇著了,更高端的智能設備也能豐富人們的生活,所以成為一名嵌入式工程師是非常有前途的!
要學習嵌入式就要先學習C和C++這兩門編程語言。其實要成為“代碼搬運工”,我覺得還是很簡單的,為什么呢?編程語言其實也是語言,我們只要將要執行的動作翻譯成芯片的語言就可以了。舉個例子我們要拿起一個蘋果,但是我們不是自己去拿,我們要讓一個只聽得懂英語的工人去拿,怎么辦呢?你要用英語告訴他“pick up this apple”,只有這樣講他才會去拿起蘋果;現在我們把這個工人換成了只聽得懂C語言的芯片,你該怎么辦呢?同樣的,你要用C語言告訴芯片去拿起蘋果,道理都是一樣的,只是C語言有C語言的用法,我們只要按著他的規則寫就OK了。
對于嵌入式底層工程師來說,我們要學習的不僅僅是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語言進階學習的一個重點。