怎樣學習嵌入式軟件

什麼是嵌入式?html

        嵌入式分爲廣義和狹義兩種。廣義的嵌入式就是片上系統(system on a chip),包含單片機、PSOC、NIOS、Microblaze等。而狹義的嵌入式就是ARM九、cortex A8等特定的跑操做系統的芯片。這裏主要介紹狹義嵌入式的學習路線。python

        仍是主流的方法。先學會使用它。再深刻研究底層。linux

        常用的操做系統有linux、WIN CE、安卓、Vxworks、QNX、OSE等。眼下資料最多的是linux,因此如下以linux爲例。android

1、安裝虛擬機和linux系統。git

        通常人用的電腦都會裝Windows系統,要想在Windows上跑其餘系統。得安裝虛擬機。web

而眼下主流的虛擬機有vmware、VirtualBox、hyperV等,你可以隨便選一個安裝。而後去官網下載我的版的linux鏡像(.iso文件)並把它安裝在虛擬機裏面就能夠。這裏給出主流linux系統的官網連接:ubuntufedoracentosdebiansuse。假設你沒實用過linux的話,推薦使用ubuntu。因爲RedHat要收費。並更名爲RHEL,因此這裏不做介紹。
算法

         先下載一本《鳥哥私房菜》。shell

而後進入第2、3、四階段(前期的學習不需要開發板)。
數據庫

2、學會使用linux常用命令。編程

         這裏,必須改改在Windows下點鼠標的習慣。在linux下作事得用命令行。此外,在linux下載軟件。不需要在百度下載,而是用linux自帶的軟件包管理工具(如:apt-get、dnf、rpm等)。假設你用ubuntu的話,得改動軟件源(下載軟件的網址),因爲國外的源比較慢,百度上有具體說明。接下來,得學會最主要的命令,如:ls、cd、find、grep、ps、diff、fdisk、ifconfig等。

跟着教材多操做幾遍就會了。沒有很是深的理論知識,不需要掌握所有的命令,也不需要記住所有命令的選項。用到的時候會查就可以了。

有空的話可以上ubuntu社區或者linux公社


3、學會使用linux常用工具。


一、編輯器(寫代碼必備的)。

有gedit,vim,emacs,sublime等。推薦學vim

二、gcc和gdb。gcc是編譯器。gdb就是代碼調試器。

三、makefile、autoconf、automake。這裏可不像VC++6.0這樣的工具。點個鼠標就給你編譯好。

在linux下,你得用makefile和make工具,來編譯代碼。

當中autoconf和automake可以本身主動生成makefile。

四、ssh、tftp。

假設你在ARM開發板上弄了個Webserver,那麼。你就可以用這些工具去訪問它。當中,ssh工具建議用SecureCRT或者MobaXterm

五、samba。要想用linux跟windows交換數據,還可以搭建sambaserver。

六、版本號控制器。有svn,cvs,git等。推薦學git。

有了git。你就沒必要手動備份代碼了。

4、學會編寫shell腳本。

         在實際工做中,複雜的系統管理操做,不會一行一行地敲命令,而是用腳本(命令是基礎)。

腳本也是一種編程語言,僅僅只是是解釋型語言。相比C/C++、C#、JAVA這類高級語言。腳本要易學很是多(因爲添加了語法糖)。在linux下,shell也有很是多種。如:bsh、bash、csh、tcsh、ksh、zsh等,一般是學bash,其餘的遇到再學也不遲。因爲都是大同小異的。

此外,bash語法比較奇特,很是多符號(如:$#,$0,$?等)比較難記,只是也不是必需特地去死記它,有個印象就可以了。用到的話再查手冊,這裏重點掌握正則表達式。

假設有時間的話,建議再學python腳本。python的語法要easy很是多。用途也比bash廣很是多。

推薦《Shell腳本編程訣竅》。


5、學會linux下C編程。

         雖然學會bash已經能作很是多事情了。但是驅動和內核開發仍是用C語言,因爲那時候系統還沒起來。bash是用不了的。此外。C語言的運行效率比bash要高,網絡編程的Socket也常常常使用C語言開發。在這裏,得掌握主要的文件操做、進程/線程控制、Socket等。推薦《Linux環境C程序設計》、《UNIX環境高級編程》、《UNIX網絡編程 卷1》、《UNIX網絡編程 卷2》,也許這些教材有點難。但是,請不要鑽牛角尖。不懂的臨時跳過,在學完下一階段的理論以後,再來看。以前不懂的東西就變得easy。

6、加強理論知識。

        因爲有的人打着嵌入式硬件project師的名號裝逼,事實上嵌入式硬件就是普通硬件project師作的工做。咱們這裏都是討論軟件方面的內容,而且嵌入式是以軟件爲主導的(工資上有較大差距)。假設對硬件感興趣的。可以參考本博客《怎樣學習硬件設計——理論篇》和《怎樣學習硬件設計——實踐篇》,這裏不要求掌握硬件,有必定程度的瞭解就能夠。


一、單片機。

詳細的學習路線請參考本博客的《怎樣學習單片機》。

不想學單片機的話,可以學計算機組成原理。

二、數據結構。主要掌握表和樹,當中鏈表會在操做系統的調度算法中用到。


三、操做系統。全部都是重點,必須深刻研究,纔會對linux有個較全面的認識。


四、編譯原理。有時間的話,最好多看看。沒空的話,也得了解一下。

對於提升編程能力,有必定的幫助。

五、數據庫。除了主要的數據庫理論以外,還得掌握SQLite或者Oracle。


六、ARM體系結構。介紹ARM的架構和指令集。在移植uboot和驅動中會用到。不作這兩項工做的話,可以不學。


七、計算機網絡基礎。開發中用到的socket、ssh、tftp、http就會涉及到網絡相關的知識。

八、接口應用。

如:串口、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。

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對你來講已經很easy的了,通常僅僅需要學會使用uboot或者用已經移植好的uboot,不需要深刻研究它。

推薦看uboot自帶的幫助文檔。

閱讀uboot源代碼,推薦windows下的source insight。

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板上搭個webserver,這裏。得學習HTML、CSS、Javascript、XML、Ajax、PHP等。看起來內容很是多。但事實上並很少。因爲這些語言都很是easy上手。初學可以使用Adobe的Dreamweaver作開發,上手以後一個sublime text配合firefox瀏覽器就可以了(還要學習MVC模式)。此外,還得會用bash或者python編寫CGI程序,這樣才幹夠在網頁上調用究竟層的C語言接口。推薦《瘋狂HTML 5/CSS3/JavaScript講義》。

十3、雜談。

          本文沒有涉及流程圖繪製軟件文檔生成工具等(這兩個東西在工做中會經常用到)。

          由上文可知,嵌入式軟件涉及很是多計算機相關的知識,這對於電子專業的學生來講。無疑至關於跨專業那麼大難度。此外,就算你掌握了上面所說起的知識,那也僅僅是打開一扇小小的窗戶而已,還有很是多事情作不了的。比方:二維碼識別、視頻採集卡等。

BTW,嵌入式的工做也分紅幾個崗位,各自是系統project師、驅動project師、軟件project師(負責網頁或GUI開發)、UIproject師(又稱美工)。

系統project師:熟悉操做系統的內核原理、熟讀內核源代碼。

主要職責爲系統打補丁或者加入新功能,如:熱升級、提升系統的容錯性等。

通常的公司是不作這樣的開發的。

驅動project師:熟悉各類外設的驅動開發,爲內核和GUI提供接口。

由於很是多IC廠商提供了相關芯片的驅動程序,而致使很是多驅動project師下崗(需求量下降)。

軟件project師:熟悉各類編程語言和GUI圖形庫、框架(不是會查文檔就可以的。而是要求很熟悉框架)。由於項目需求經常變動,開發效率跟不上變化,因此軟件project師的需求量大大添加。

UIproject師:主要負責美化界面。

美術特長生更適合這類工做。

相關文章
相關標籤/搜索