什麼是嵌入式?python
嵌入式分爲廣義和狹義兩種。廣義的嵌入式就是片上系統(system on a chip),包括單片機、PSOC、NIOS、Microblaze等。而狹義的嵌入式就是ARM九、cortex A8等特定的跑操做系統的芯片。這裏主要介紹狹義嵌入式的學習路線。linux
仍是主流的方法,先學會使用它,再深刻研究底層。android
經常使用的嵌入式操做系統有Linux、WIN CE、安卓、Vxworks、QNX、OSE等,目前資料最多的是linux,因此下面以linux爲例。git
1、安裝虛擬機和Linux系統。正則表達式
通常人用的電腦都會裝Windows系統,要想在Windows上跑其它系統,得安裝虛擬機。而目前主流的虛擬機有vmware、VirtualBox、hyperV等,你能夠隨便選一個安裝。而後去官網下載我的版的Linux鏡像(.iso文件)並把它安裝在虛擬機裏面便可,這裏給出主流Linux系統的官網連接:ubuntu、fedora、centos、debian、suse。若是你沒有用過linux的話,推薦使用ubuntu。由於RedHat要收費,並更名爲RHEL,因此這裏不做介紹。算法
先下載一本《鳥哥私房菜》。而後進入第2、3、四階段(前期的學習不須要開發板)。shell
2、學會使用Linux經常使用命令。數據庫
這裏,必須改改在Windows下點鼠標的習慣,在linux下作事得用命令行。此外,在Linux下載軟件,不須要在百度下載,而是用linux自帶的軟件包管理工具(如:apt-get、dnf、rpm等)。若是你用ubuntu的話,得修改軟件源(下載軟件的網址),由於國外的源比較慢,百度上有詳細說明。接下來,得學會最基本的命令,如:ls、cd、find、grep、ps、diff、fdisk、ifconfig等。跟着教材多操做幾遍就會了,沒有很深的理論知識,不須要掌握全部的命令,也不須要記住全部命令的選項,用到的時候會查就能夠了。有空的話能夠上ubuntu社區或者linux公社。編程
3、學會使用Linux經常使用工具。ubuntu
一、編輯器(寫代碼必備的)。有gedit,vim,emacs,sublime等,推薦學vim。
二、gcc和gdb。gcc是編譯器,gdb就是代碼調試器。
三、makefile、autoconf、automake。這裏可不像VC++6.0這種工具,點個鼠標就給你編譯好。在Linux下,你得用makefile和make工具,來編譯代碼。其中autoconf和automake能夠自動生成makefile。
四、ssh、tftp。若是你在ARM開發板上弄了個Web服務器,那麼,你就能夠用這些工具去訪問它。其中,ssh工具建議用SecureCRT或者MobaXterm。
五、samba。要想用Linux跟windows交換數據,還能夠搭建samba服務器。
六、版本控制器。有svn,cvs,git等,推薦學git。有了git,你就沒必要手動備份代碼了。
七、串口調試助手。推薦serials。其它的,好比:minicom,cutecom,picocom都很差用。
4、學會編寫shell腳本。
在實際工做中,複雜的系統管理操做,不會一行一行地敲命令,而是用腳本(命令是基礎)。腳本也是一種編程語言,只不過是解釋型語言。相比C/C++、C#、JAVA這類高級語言,腳本要易學不少(由於增長了語法糖)。在Linux下,shell也有不少種,如:bsh、bash、csh、tcsh、ksh、zsh等,通常是學bash,其它的遇到再學也不遲,由於都是大同小異的。此外,bash語法比較奇特,不少符號(如:$#,$0,$?等)比較難記,不過也不必特地去死記它,有個印象就能夠了,用到的話再查手冊,這裏重點掌握正則表達式。若是有時間的話,建議再學python腳本,python的語法要容易不少,用途也比bash廣不少。推薦《Shell腳本編程訣竅》。
5、學會Linux下C編程。
儘管學會bash已經能作不少事情了,可是驅動和內核開發仍是用C語言,由於那時候系統還沒起來,bash是用不了的。此外,C語言的執行效率比bash要高,網絡編程的Socket也經常用C語言開發。在這裏,得掌握基本的文件操做、進程/線程控制、Socket等。推薦《Linux環境C程序設計》、《UNIX環境高級編程》、《UNIX網絡編程 卷1》、《UNIX網絡編程 卷2》,或許這些教材有點難,可是,請不要鑽牛角尖,不懂的暫時跳過,在學完下一階段的理論以後,再來看,以前不懂的東西就變得容易。
6、加強理論知識。
由於有的人打着嵌入式硬件工程師的名號裝逼,其實嵌入式硬件就是普通硬件工程師作的工做。咱們這裏都是討論軟件方面的內容,並且嵌入式是以軟件爲主導的(工資上有較大差距)。若是對硬件感興趣的,能夠參考本博客《如何學習硬件設計——理論篇》和《如何學習硬件設計——實踐篇》,這裏不要求掌握硬件,有必定程度的瞭解便可。
一、單片機。具體的學習路線請參考本博客的《如何學習單片機》。不想學單片機的話,能夠學計算機組成原理。
二、數據結構。主要掌握表和樹,其中鏈表會在操做系統的調度算法中用到。
三、操做系統。所有都是重點,必須深刻研究,纔會對Linux有個較全面的認識。
四、編譯原理。有時間的話,最好多看看,沒空的話,也得了解一下。對於提升編程能力,有必定的幫助。
五、數據庫。除了基本的數據庫理論以外,還得掌握SQLite或者Oracle。
六、ARM體系結構。介紹ARM的架構和指令集,在移植uboot和驅動中會用到,不作這兩項工做的話,能夠不學。
七、計算機網絡基礎。開發中用到的tcp、udp、ssh、tftp、http、rtp就會涉及到網絡相關的知識,也就是socket套接字編程。
八、接口應用。如:串口、zmodem、IIC、SPI、1-wire、USB、HDMI、CAN、IIS、PCIE、藍牙、陀螺儀等。
學完上面這些理論以後,得再複習一下linux下C編程,你會有更大的收穫。
先下載一本韋東山的《嵌入式Linux應用開發徹底手冊》,還要買一塊2440的開發板(雖然s3c2440已經停產,可是這芯片依照是資料最多的一塊),而後進入7、8、9、十階段。其中第7、8、九階段,使用開發板自帶的bootloader便可,暫時沒必要研究它。
7、文件系統。
在學習操做系統原理的時候,已經有介紹文件系統了,並且不須要深刻研究文件系統的具體算法,只須要了解其特性再學會使用它就能夠了。如:NFS、FAT3二、NTFS、yaffs二、ext四、ZFS等。
8、內核裁剪。
通常初學,能夠先掌握內核剪裁(具體工做就是填寫若干個選項)。剪裁只是去掉內核部分不須要的功能,以減小代碼體積。這裏只要求你對內核的各個功能選項都很熟悉就能夠了。若是剪裁還不能知足要求的話,得閱讀內核源碼,修改內核了。推薦《Understanding the Linux Kernel》和《Linux Kernel Development》。閱讀內核源碼,推薦windows下的source insight或者eclipse。
9、驅動開發。
因爲系統還沒起來,因此驅動能用到的API(內核的部分API,如:kprintk、kmalloc等)並很少,不少函數仍是得本身寫的,其中,會常常訪問臨界資源,因此得掌握自旋鎖、睡眠鎖。此外,驅動程序出問題的話,整個系統就掛掉了,因此還要掌握各類調試驅動的方法,如:goto語句、日誌系統、KDB等。接下來就要熟悉掌握字符設備和塊設備的驅動程序了。推薦《小白的博客》和《Linux Device Drivers》(不建議看中文版)。
10、移植bootloader。
單片機也有bootloader,在keil C下的startup.a51,主要是作一些初始化工做。那麼,在ARM上面的bootloader也是同樣的功能,一樣,也沒有那麼重要因此把它排在後面。經常使用的bootloader有vivi和uboot,通常學習uboot,主要掌握uboot的啓動流程和移植。在通過前面的學習,那麼uboot對你來講已經很是容易的了,通常只須要學會使用uboot或者用已經移植好的uboot,不須要深刻研究它。推薦看uboot自帶的幫助文檔以及《深刻理解BootLoader》。閱讀uboot源碼,推薦windows下的source insight或者eclipse。
11、圖形界面開發。
經常使用的GUI圖形庫有:GTK++、QT、JAVA、安卓等。有C++基礎的,建議學習QT,不會C++的,建議學JAVA。在前期的GUI開發,能夠不須要使用開發板,而2440下適合跑QT,若是要跑JAVA、安卓的話,建議換一塊開發板,能夠考慮Exynos4412開發板。此外,你還能夠用python自帶的TKinter來開發圖形界面。推薦《QT5編程入門》、《瘋狂JAVA講義》、《瘋狂Android講義》、《python編程入門》。
由於安卓系統是在Linux的基礎上封裝了一層API,因此,若是作安卓驅動,就得掌握Linux(上面前十個階段)。若是隻作安卓app,你只須要使用android studio或者eclipse配合安卓模擬器(最好用安卓手機),就能夠了,不須要學習Linux,也不須要開發板。
在你作過幾個GUI項目以後,再學習UML和設計模式,這會大大加強你的代碼架構能力。
12、Web開發。
有的時候得在ARM板上搭個Web服務器,這裏,得學習HTML、CSS、Javascript、XML、Ajax、PHP等。看起來內容不少,但其實並很少,由於這些語言都很容易上手。初學可使用Adobe的Dreamweaver作開發,上手以後一個sublime text配合firefox瀏覽器就能夠了(還要學習MVC模式)。此外,還得會用bash或者python編寫CGI程序,這樣才能夠在網頁上調用到底層的C語言接口。推薦《瘋狂HTML 5/CSS3/JavaScript講義》。
十3、雜談。
本文沒有涉及流程圖繪製軟件、文檔生成工具等(這兩個東西在工做中會常常用到)。
由上文可知,嵌入式軟件涉及不少計算機相關的知識,這對於電子專業的學生來講,無疑至關於跨專業那麼大難度。此外,就算你掌握了上面所說起的知識,那也只是打開一扇小小的窗戶而已,還有不少事情作不了的。好比:二維碼識別、視頻採集卡等。
BTW,嵌入式的工做也分紅幾個崗位,分別是系統工程師、驅動工程師、軟件工程師(負責網頁或GUI開發)、UI工程師(又稱美工)。
系統工程師:熟悉操做系統的內核原理、熟讀內核源碼。主要職責爲系統打補丁或者添加新功能,如:熱升級、提升系統的容錯性等。通常的公司是不作這種開發的。
驅動工程師:熟悉各類外設的驅動開發,爲內核和GUI提供接口。因爲不少IC廠商提供了相關芯片的驅動程序,而致使不少驅動工程師下崗(需求量減小)。
軟件工程師:熟悉各類編程語言和GUI圖形庫、框架(不是會查文檔就能夠的,而是要求很是熟悉框架)。因爲項目需求常常變動,開發效率跟不上變化,因此軟件工程師的需求量大大增長。
UI工程師:主要負責美化界面。美術特長生更適合這類工做。 ———————————————— 版權聲明:本文爲CSDN博主「隊長-Leader」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接及本聲明。 原文連接:https://blog.csdn.net/k331922164/article/details/50629131