嵌入式

當前位置 /首頁/IT認證/嵌入式/列表

嵌入式Linux+Android學習路線圖

嵌入式Linux的特點是版權費免費,購買費用媒介成本技術支援全世界的自由軟體開發者提供支援網路特性免費,而且效能優異,軟體移植容易,程式碼開放,有許多應用軟體支援等。下面是小編整理的嵌入式Linux+Android學習路線圖,希望大家喜歡!

嵌入式Linux+Android學習路線圖

  1. 程式設計師的三大方向

程式設計師的方向,一般可以分為3類:專業領域、業務領域、作業系統領域。你瞭解它們後,按興趣選擇吧。

對於專業領域,我提供不了建議。

業務,也就是應用程式,它跟操作系統並不是截然分開的:

①開發實體產品時,應用程式寫得好的人,有時候需要作業系統的知識,比如排程優先順序的設定、知道某些函式可能會令程序休眠。

②寫應用程式的人進階為系統工程師時,他需要從上到下都瞭解,這時候就需要有作業系統領域的知識了,否則,你怎麼設計整個系統的方案呢?

③做應用程式的人,需要了解行業的需求,理解業務的邏輯。所以,當領導的人,多是做應用的。一旦鑽入了某個行業,很難換行業。

④而作業系統領域,做好了這是通殺各行業:他只負責底層系統,在上面開發什麼業務跟他沒關係。這行很多是技術宅,行業專家。

⑤作業系統和業務之間並沒有一個界線。有作業系統經驗,再去做應用,你會對系統知根知底,碰到問題時都有解決思路。有了業務經驗,你再瞭解一下作業系統,很快就可以組成一個團隊自立門戶,至少做個CTO沒問題。

  1.1 專業領域

它又可以分為下面2類。

1.1.1 學術研究

比如語音、影象處理、人工智慧,這類工作需要你有比較強的理論知識,我傾向於認為這類人是“科學家”,他們鑽研多年,很多時候是在做學術研究。

在嵌入式領域,需要把他們的成果用某種演算法表達出來,針對某種晶片進行優化,這部分工作也許有專人來做。

1.1.2 工程實現

也有這樣一類人,他們懂得這些專業領域的概念,但是沒有深入鑽研。可以使用各類開源資料實現某個目標,做出產品。比如影象處理,他懂得用opencv裡幾百個複雜函式來實現頭像識別。有時候還可以根據具體晶片來優化這些函式。

“專業領域”不是我的菜,如果你要做這一塊,我想最好的入門方法是在學校學習研究生、博士課程。

  1.2 業務領域

換句話說,就是應用程式,這又可以分為下面2類。

  1.2.1 介面顯示

做產品當然需要好的介面,但是,不是說它不重要,是沒什麼發展後勁。

現在的熱門詞是Android APP和IOS APP開發。你不要被Android、IOS兩個詞騙了,它們跟以前的VC、VB是同一路貨色,只是、僅僅是一套GUI控制元件的實現。

希望沒有冒犯到你,我有理由。

一個程式需要有GUI介面,但是程式的內在邏輯才是核心。Android、IOS的開發工具給我們簡化了GUI的開發,並提供了這些控制元件的互動機制,封裝並提供了一些服務(比如網路傳輸)。

但是程式內部的業務邏輯、對視訊影象聲音的處理等等,這才是核心。

另外別忘了伺服器那邊的`後臺程式:怎樣更安全地儲存資料、保護客戶的隱私,怎樣處理成千上萬上百萬的併發訪問,等等,這也是核心。

但是,從Android、IOS APP入門入行,這很快!如果你是大四,急於找到一份工作,那麼花上1、2個月去學習Android或IOS,應該容易找到工作,畢竟APP的需求永遠是最大的,現在這兩門技術還算熱門。

在2011、2012年左右,Android程式設計師的起薪挺高,然後開始下滑。Android APP的入門基本只要1個月,所以懂的人也越來越多。

2013、2014年,IOS開發的工資明顯比Android高了,於是各類IOS培訓也火曝起來。中華大地向來不缺速成人才,估計再過一陣子IOS工程師也是白菜價了。

會Android、IOS只是基本要求,不信去51job搜搜Android或IOS,職位要求裡肯定其他要求。

  1.2.2 業務邏輯

舉個簡單例子,做一個打卡軟體,你需要考慮這些東西:

①正常流程是上班下班時都要打卡

②有人忘記了怎麼辦?作為異常記錄在案,推送給管理員

③請假時怎麼處理?

④加班怎麼處理?

對於更復雜的例子,視訊會議系統裡,各個模組怎麼對接,各類協議怎麼相容,你不深入這個行業,你根本搞不清楚。

應用開發的職位永遠是最多的,入門門檻也低。基本上只要你會C語言,面試時表現比較得體,一般公司都會給你機會。因為:

①你進公司後,還需要重新培訓你:熟悉它們的業務邏輯。

②你要做的,基本也就是一個個模組,框架都有人給你定好了,你去填程式碼就可以了。

說點讓你高興的事:軟體公司裡,做領導的基本都是寫應用程式的(當然還有做市場的)。寫應用程式的人,對外可以研究市場接待客戶,對內可以管理程式設計師完成開發,不讓他做領導讓誰做?

如果你的志向是寫應用程式,那麼我建議你先練好基本功:資料結構、演算法是必備,然後憑興趣選擇資料庫、網路程式設計等等進行深入鑽研。

最後,選擇你看好的、感興趣的行業深耕個10年吧。做應用開發的人選擇了某個行業,後面是很難換行業的,選行很重要!

  1.3 作業系統領域

UCOS太簡單,VxWorks太貴太專業,Windows不玩嵌入式了,IOS不開源,所以對於作業系統領域我們也只能玩Linux了。

在嵌入式領域Linux一家獨大!

Android呢?Android跟QT一樣,都是一套GUI系統。只是Google的實力太強了,現在Android無處不在,所以很多時候Linux+Android成了標配。注意,在這裡我們關心的是Android的整個系統、裡面的機制,而不是學習幾個API然後開發介面程式。

作業系統領域所包含的內容,簡單地說,就是製作出一臺裝好系統的專用“電腦”,可以分為:

①為產品規劃硬體:

按需求、效能、成本選擇主晶片,搭配周邊外設,交由硬體開發人員設計。

②給單板製作、安裝作業系統、編寫驅動

③定製維護、升級等系統方案

④還可能要配置、安裝Android等GUI系統:

⑤為應用開發人員配置開發環境

⑥從系統角度解決疑難問題

這個領域,通常被稱為“底層系統”或是“驅動開發”。

先解決2個常見誤區:

①這份工作是寫驅動程式嗎?

看看上面羅列的6點,應該說,它包含驅動開發,但遠遠不只有驅動開發。

②我們還需要寫驅動嗎?不是有原廠嗎?或者只需要改改就可以?

經常有人說,晶片原廠都做好驅動了,拿過來改改就可以了。如果,你的硬體跟原廠的公板完全一樣,原廠原始碼毫無BUG,不想優化效能、削減成本,不想做一些有特色的產品,那這話是正確的。

但是在這個不創新就是找死的年代,可能嗎?!原因有二:

①即使只是修改程式碼,能修改的前提是能理解;能理解的最好煅煉方法是從零寫出若干驅動程式

②很多時候,需要你深度定製系統。

以前做聯發科手機只需要改改介面就可以出貨了,現在山寨廠一批批倒下。大家都使用原廠的方案而不加修改時,最後只能拼成本。

舉個例子,深圳有2家做交通攝像頭、監控攝像頭的廠家,他們曾經找我做過4個專案:

①改進廠家給的SD卡驅動效能,使用DMA。

②換了Flash型號後,系統經常出問題,需要修改驅動BUG。

③觸控式螢幕點選不準,找原因,後來發現是旁路電容導致的。

④裁減成本,把4片DDR換為2片DDR,需要改bootloader對DDR的初始化。

這些專案都很急,搞不定就無法出貨,這時候找原廠?除非你是中興華為等大客戶,否則誰理你?

我在中興公司上班時,寫驅動的時間其實是很少的,大部分時間是除錯:系統調優,上幫APP工程師、下幫硬體工程師查詢問題。

我們從廠家、網上得到的原始碼,很多都是標準的,當然可以直接用。但是在你的產品上也許優化一下更好。比如我們可以把攝像頭驅動和DMA驅動揉合起來,讓攝像頭的資料直接通過DMA發到DSP去。

我們可以在軟體和硬體之間起橋樑作用,對於實體產品,有可能是軟體出問題也可能是硬體出問題,一般是底層系統工程師比較容易找出問題。

當硬體、軟體應用出現問題,他們解決不了時,從底層軟體角度給他們出主意,給他們提供工具。

再比如方案選擇:晶片效能能否達標、可用的BSP是否完善等等,這隻能由負責整個方案的人來考慮,他必須懂底層。

在作業系統領域,對知識的要求很多:

①懂硬體知識才能看懂電路圖

②英文好會看晶片手冊

③有編寫、移植驅動程式的能力

④對作業系統本身有一定的理解,才能解決各類疑難問題

⑤理解Android內部機制

⑥懂彙編、C語言、C++、JAVA

它絕對是一個大坑,沒有興趣、沒有毅力的人慎選。

①這行的入門,絕對需要半年以上,即使全天學習也要半年。

②它的職位,絕對比APP的職位少

③並且你沒有1、2年經驗,招你到公司後一開始你做的還是APP。

優點就是:

①學好後,行業通殺,想換行就換行;想自己做產品就自己做產品。

②相比做應用程式的人,不會被經常變動的需求搞得天天加班。

③門檻高,當然薪水相對就高。

作業系統領域,我認為適合於這些人:

①硬體工程師想轉軟體工程師,從底層軟體入門會比較好

②微控制器工程師,想升級一下。會Linux底層的人肯定會微控制器,會微控制器的人不一定會Linux。

③時間充足的學生:如果你正讀大二大三,那麼花上半年學習嵌入式Linux底層多有益處。

④想掌握整個系統的人,比如你正在公司裡寫APP,但是想升為系統工程師,那麼底層不得不學。

⑤想自己創業做實體產品的工程師,你有錢的話什麼技術都不用學,但是如果沒錢又想做產品,那麼Linux底層不得不學。

⑥做Linux APP的人,沒錯,他們也要學習。

這部分人不需要深入,瞭解個大概就可以:bootloader是用來啟動核心,Linux的檔案系統(第1個程式是什麼、做什麼、各目錄幹嘛用)、APP跟驅動程式的呼叫關係、工具鏈,有這些概念就可以了

本文中,就把作業系統預設為Linux,講講怎麼學習嵌入式Linux+Android系統。

1.4 嵌入式Linux+Android系統包含哪些內容

嵌入式Linux系統包含哪些東西?不要急,舉一個例子你就知道了。

①電腦一開機,那些介面是誰顯示的?

是BIOS,它做什麼?一些自檢,然後從硬碟上讀入windows,並啟動它。

類似的,這個BIOS對應於嵌入式Linux裡的bootloader。這個bootloader要去Flash上讀入Linux核心,並啟動它。

②啟動windows的目的是什麼?

當然執行應用程式以便上網、聊天什麼的了。

這些上網程式、聊天程式在哪?

在C盤、D盤上。

所以,windows要先識別出C盤、D盤。在Linux下我們稱之為根檔案系統。

③windows能識別出C盤、D盤,那麼肯定有讀寫硬碟的能力。

這個能力我們稱之為驅動程式。當然不僅僅是操作硬碟,還有網絡卡、USB等等其他硬體。

嵌入式Linux能從Flash上讀出並執行應用程式,肯定也得有Flash的驅動程式啊,當然也不僅僅是Flash。

簡單地說,嵌入式LINUX系統裡含有bootloader、核心、驅動程式、根檔案系統、應用程式這5大塊。而應用程式,我們又可以分為:C/C++、Android。

所以,嵌入式Linux+Android系統包含以下6部分內容:

①bootloader

②Linux核心

③驅動程式

④使用C/C++編寫的應用程式

⑤Android系統本身

⑥Android應用程式

Android跟Linux的聯絡實在太大了,它的應用是如此廣泛,學習了Linux之後沒有理由停下來不學習Android。在大多數智慧裝置中,執行的是Linux作業系統;它上面要麼安裝有Android,要麼可以跟Android手機互聯。現在,Linux+Android已成標配。

2. 怎麼學習嵌入式Linux作業系統

本文假設您是零基礎,以實用為主,用最快的時間讓你入門;後面也會附上想深入學習時可以參考的資料。

在實際工作中,我們從事的是“作業系統”周邊的開發,並不會太深入學習、修改作業系統本身。

①作業系統具有程序管理、儲存管理、檔案管理和裝置管理等功能,這些核心功能非常穩定可靠,基本上不需要我們修改程式碼。我們只需要針對自己的硬體完善驅動程式

②學習驅動時必定會涉及其他知識,比如儲存管理、程序排程。當你深入理解了驅動程式後,也會加深對作業系統其他部分的理解

③Linux核心中大部分程式碼都是裝置驅動程式,可以認為Linux核心由各類驅動構成

但是,要成為該領域的高手,一定要深入理解Linux作業系統本身,要去研讀它的原始碼。

在忙完工作,閒暇之餘,可以看看這些書:

①趙炯的《linux核心完全註釋》,這本比較薄,推薦這本。他後來又出了《Linux 核心完全剖析》,太厚了,搞不好看了後面就忘記前面了。

②毛德操、胡希明的《LINUX核心原始碼情景分析》,此書分上下冊,巨厚無比。當作字典看即可:想深入理解某方面的知識,就去看某章節。

③其他好書還有很多,我沒怎麼看,沒有更多建議