總結嵌入式系統基礎知識、編程語言、高效工具等內容。
最近聽到一位小伙伴說了句很讚的話:
iPhone 是跑著OS 的嵌入式ARM,CUDA 也可以理解為一種異構的嵌入式。
從這個角度來考慮的話,將計算機科學與嵌入式分開,僅僅把單片機、ARM、FPGA 等技術叫嵌入式,只學習狹隘的技術領域,怎麼可能成為一名優秀的嵌入式工程師呢?
技術文檔與學習記錄:
嵌入式系統基礎:
機器學習:
程式設計語言:
環境搭建及工具:
理論基礎:
本倉庫將會長期更新嵌入式領域相關的知識,一部分內容是作者的學習筆記和心得總結,一部分是日常工作中的常用技巧,還有通過各種方式收集的嵌入式知識。通過總結提煉所擁有的知識,不斷學習更多有用的技能。
對於嵌入式工程師的定位最近我有了新的看法,嵌入式技術是計算機科學體系中的一個分支。
電子類專業的畢業生從機器級的層面開始學習,如單片機,微機原理,後來到語言層面,如C 語言和Python,然後學習數據結構和算法。這個路線看起來還不錯,也適合來入門,但是這條路線裡有很嚴重的問題,只是學習這些知識你會發現自己很難做到知其然而又知其所以然。
在嵌入式工作中遇到的問題往往是綜合性的,也就是說僅僅從語言級別或者算法級別入手往往不能解決問題,有時候需要深入到機器級。那麼問題來了,整個嵌入式系統到底分了哪些層級,或者說整個計算機系統有哪些層級?要對整個知識體系框架有所了解,知道自己的位置,你需要對計算機的組成原理有較為深入的了解。
在這裡我推薦書籍是由Randal E. Bryant and David R. O'Hallaron 所著的《深入理解計算機系統》第三版。相應可以找到的課程是MOOC 平台上的由袁春風教授講授的《計算機系統基礎》課程,幫助我們建立對整個計算機系統抽象層的認識,增強我們解決嵌入式問題中的綜合能力。

嵌入式工程師的技術積累要有足夠的深度。
經過幾年工程開發,接觸了各種各樣的處理器,也自己設計並實現了一款簡單的16位CPU。我逐漸認識到某幾種CPU 的使用方式並不是最重要的知識,更重要的內容是計算機組成原理以及計算機體系架構(x86 ARM RISC-V)。對計算機基礎知識的深入的理解,可以讓我們在學習新的計算硬件時能夠做到觸類旁通, 學習一些新的異構計算技術時也不會覺得太過困難,例如GPU、TPU 以及NPU。
各種編程語言是工程師手邊必備的工具,如果現在要我說是否需要不斷學習新的編程語言,答案是肯定的。但我認為最重要的東西卻不是編程語言本身,而是語言的設計思想以及它的適用場景,更進一步的是編譯原理等用於創造編程語言的基礎知識,這些底層技術是構建起一門新語言的知識根基。理解了編程語言背後的東西,學習並使用一門新的語言就會變得非常容易。
快速定位系統問題所在是每個嵌入式工程師的必備能力,那麼如何高效Debug 呢?曾經和一位real 高手同事討論這個問題,他說:我能說我主要靠想嗎?這個回答顯然過於簡略,但是又不得不承認,Debug 確實是靠想,問題的關鍵是你應該如何想?
最近讀了一本書叫《How to solve it》給了我一些靈感,讓我意識到這是一個思維方式的問題,解決一個bug 的過程與解答一道數學題非常相似。
工程師如果想要提升debug 能力,就要常常思考這樣的問題:這個解決方案看起來是可行的,似乎是正確的,但是怎樣才能想到這樣一個解決方案呢?這個實驗看起來可行,這似乎是事實,但這個事實是怎麼被發現的?而我自己如何才能想到或者發現他們呢?在工作中,不僅要盡力去理解各種bug 的解決方法,還要去理解這個解決方法的動機和步驟,並儘力向別人解釋這些動機和步驟。