當前位置:首頁 » 操作系統 » 技術宅源碼

技術宅源碼

發布時間: 2022-10-01 06:54:04

① 請問ygopro和ygomobile的區別在哪。。大神說明下。。。

一、作者不同

1、ygopro:原作者來自中國大陸,為一款實現《游戲王》卡牌游戲在PC上自動完成各種效果處理的聯機游戲軟體。

2、ygomobile:原作者是外國人基於ygocore源碼開發。


二、特點不同

1、ygopro:軟體引擎主要使用C++語言進行編寫實現,而卡片效果則主要使用lua語言編寫成一個個獨立的腳本來實現。

2、ygomobile:僅能連接內置平台伺服器,且卡表為TCG,難以進行約戰。

三、優勢不同

1、ygopro:此軟體為開源軟體,任何人可以免費使用或者對其進行修改,其源代碼託管在github網站上。

2、ygomobile:ygomobile的優點是有AI模式。


② 自學嵌入式的流程是什麼

原文鏈接:網頁鏈接

嵌入式linux學習路線圖

我是1999年上的大學,物理專業。在大一時,我們班裡普遍彌漫著對未來的不安,不知道學習了物理後出去能做什麼。你當下的經歷、當下的學習,在未來的一天肯定會影響到你。畢業後我們也各自找到了自己的職業:出國深造轉行做金融、留校任教做科研、設計晶元、寫程序、創辦公司等等,這一切都離不開在校時學到的基礎技能(數學、IT、電子電路)、受過煅煉的自學能力。

所以,各位正在迷茫的在校生,各位正在嘗試轉行的程序員,未來一定有你的位置,是好是壞取決於你當下的努力與積累。

我不能預言幾年後什麼行業會熱門,也不能保證你照著本文學習可以發財。我只是一個有十幾年經驗的程序員,給對編程有興趣的你,提供一些建議。

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核心源代碼情景分析》,此書分上下冊,巨厚無比。當作字典看即可:想深入理解某方面的知識,就去看某章節。

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


基於快速入門,上手工作的目的,您先不用看上面的書,先按本文學習。


2.1 入門路線圖

假設您是零基礎,我們規劃了如下入門路線圖。前面的知識,是後面知識的基礎,建議按順序學習。每一部分,不一定需要學得很深入透徹,下面分章節描述。

2.2 學習驅動程序之前的基礎知識

2.2.1 C語言

只要是理工科專業的,似乎都會教C語言。我見過很多C語言考試90、100分的,一上機就傻了,我懷疑他們都沒在電腦上寫過程序。

理論再好,沒有實踐不能幹活的話,公司招你去幹嘛?

反過來,實踐出真知,學習C語言,必須練練練、寫寫寫!

當你掌握基本語法後,就可以在電腦上練習一些C語言習題了;

當你寫過幾個C程序後,就可以進入下一階段的裸機開發了。


①不需要太深入

作為快速入門,只要你會編寫「Hello, world!」,會寫冒泡排序,會一些基礎的語法操作,暫時就夠了。

指針操作是重點,多練習;

不需要去學習過多的數據結構知識,只需要掌握鏈表操作,其他不用學習,比如:隊列、二叉樹等等都不用學;不需要去學習任何的函數使用,比如文件操作、多線程編程、網路編程等等;這些知識,在編寫Linux應用程序時會用,但是在操作系統特別是驅動學習時,用不著!

永往直前吧,以後碰到不懂的C語言問題,我們再回過頭來學習。

在後續的「裸機開發」中,會讓你繼續練習C語言,那會更實戰化。

C語言是在寫代碼中精進的。


②可以在Visual Studio下學習,也可以在Linux下學習,後者需要掌握一些編譯命令,我們暫時沒有提供C語言的教程,找一本C語言書,網上找找免費的C語言視頻(主要看怎麼搭建環境),就可以自學了。


2.2.2 PC Linux基本操作:

對於PC Linux,我們推薦使用Ubuntu,在它上面安裝軟體非常簡便。

我們的工作模式通常是這樣:在Windows下閱讀、編寫代碼,然後把代碼上傳到PC Linux去編譯。實際上,Ubuntu的桌面系統已經很好用了,我們拿到各種智能機可以很快上手,相信Ubuntu的桌面系統也可以讓你很快上手。為了提高工作效率,我們通常使用命令行來操作Ubuntu。


不用擔心,你前期只需要掌握這幾條命令就可以了,它們是如此簡單,我乾脆列出它們:

①cd : Change Directory(改變目錄)

cd 目錄名 // 進入某個目錄cd .. // cd 「兩個點」:返回上一級目錄cd - // cd 「短橫」:返回上一次所在目錄

②pwd : Print Work Directory(列印當前目錄 顯示出當前工作目錄的絕對路徑)

③mkdir : Make Directory(創建目錄)

mkdir abc // 創建文件夾abcmkdir -p a/b/c // 創建文件夾a,再a下創建文件夾b,再在b下創建文件夾c

④rm : Remove(刪除目錄或文件)

rm file // 刪除名為file的文件rm -rf dir // 刪除名為dir的目錄

⑤ls : List(列出目錄內容)

⑥mount : 掛載

mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mntmount -t yaffs /dev/mtdblock3 /mnt

⑦chown : Change owner(改變文件的屬主,即擁有者)

chown book:book /work -R //對/work目錄及其下所有內容,屬主改為book用戶,組改為book

⑧chmod : Change mode(改變許可權),下面的例子很簡單粗暴

chmod 777 /work -R // 對/work目錄及其下所有內容,許可權改為可讀、可寫、可執行

⑨vi : Linux下最常用的編輯命令,使用稍微復雜,請自己搜索用法。


要練習這些命令,你可以進入Ubuntu桌面系統後,打開終端輸入那些命令;或是用SecureCRT、putty等工具遠程登錄Ubuntu後練習。


2.2.3 硬體知識

我們學習硬體知識的目的在於能看懂原理圖,看懂通信協議,看懂晶元手冊;不求能設計原理圖,更不求能設計電路板。

對於正統的方法,你應該這樣學習:

①學習《微機原理》,理解一個計算機的組成及各個部件的交互原理。

②學習《數字電路》,理解各種門電路的原理及使用,還可以掌握一些邏輯運算(與、或等)。

③《模擬電路》?好吧,這個不用學,至少我在工作中基本用不到它,現在全忘光了。


就我個人經驗來說,這些課程是有用的,但是:

①原理有用,實戰性不強。

比如《微機原理》是基於x86系統,跟ARM板子有很大差別,當然原理相通。

我是在接觸嵌入式編程後,才理解了這些課程。

②每本書都那麼厚,內容都很多,學習時間過長,自學有難度。


針對這些校園教材的不足,並結合實際開發過程中要用到的知識點,我們推出了《學前班_怎麼看原理圖》的系列視頻:

學前班第1課第1節___怎麼看原理圖之GPIO和門電路.wmv

學前班第1課第2.1節_怎麼看原理圖之協議類介面之UART.wmv

學前班第1課第2.2節_怎麼看原理圖之協議類介面之I2C.wmv

學前班第1課第2.3節_怎麼看原理圖之協議類介面之SPI.wmv

學前班第1課第2.4節_怎麼看原理圖之協議類介面之NAND Flash.wmv

學前班第1課第2.5節_怎麼看原理圖之協議類介面之LCD.wmv

學前班第1課第3節___怎麼看原理圖之內存類介面.wmv

學前班第1課第4.1節_怎麼看原理圖之分析S3C2410開發板.wmv

學前班第1課第4.2節_怎麼看原理圖之分析S3C2440開發板.wmv

學前班第1課第4.3節_怎麼看原理圖之分析S3C6410開發板.wmv


即使你只具備初中物理課的電路知識,我也希望能通過這些視頻,讓你可以看懂原理圖,理解一些常見的通信協議;如果你想掌握更多的硬體知識,這些視頻也可以起個索引作用,讓你知道缺乏什麼知識。


這些視頻所講到的硬體知識,將在《裸板開發》系列視頻中用到,到時可以相互對照著看,加深理解。


2.2.4 要不要專門學習Windows下的單片機開發

很多學校都開通了單片機的課程,很多人都是從51單片機、AVR單片機,現在比較新的STM32單片機開始接觸嵌入式領域,並且使用Windows下的開發軟體,比如keil、MDK等。

問題來了,要不要專門學習Windows下的單片機開發?

①如果這是你們專業的必修課,那就學吧

②如果你的專業跟單片機密切相關,比如機械控制等,那就學吧

③如果你只是想從單片機入門,然後學習更廣闊的嵌入式Linux,那麼放棄在Windows下學習單片機吧!


理由如下:

①Windows下的單片機學習,深度不夠

Windows下有很好的圖形界面單片機開發軟體,比如keil、MDK等。

它們封裝了很多技術細節,比如:

你只會從main函數開始編寫代碼,卻不知道上電後第1條代碼是怎麼執行的;

你可以編寫中斷處理函數,但是卻不知道它是怎麼被調用的;

你不知道程序怎麼從Flash上被讀入內存;

也不知道內存是怎麼劃分使用的,不知道棧在哪、堆在哪;

當你想裁剪程序降低對Flash、內存的使用時,你無從下手;

當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂;

等等等。


②基於ARM+Linux裸機學習,可以學得更深,並且更貼合後續的Linux學習。實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。

在工作中,我們當然傾向於使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。


一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:

你需要了解晶元的上電啟動過程,知道第1條代碼如何運行;

你需要掌握怎麼把程序從Flash上讀入內存;

需要理解內存怎麼規劃使用,比如棧在哪,堆在哪;

需要理解代碼重定位;

需要知道中斷發生後,軟硬體怎麼保護現場、跳到中斷入口、調用中斷程序、恢復現場;

你會知道,main函數不是我們編寫的第1個函數;

你會知道,晶元從上電開始,程序是怎麼被搬運執行的;

你會知道,函數調用過程中,參數是如何傳遞的;

你會知道,中斷發生時,每一個寄存器的值都要小心對待;

等等等。


你掌握了ARM+Linux的裸機開發,再回去看Windows下的單片機開發,會驚呼:怎麼那麼簡單!並且你會完全明白這些工具沒有向你展示的技術細節。


驅動程序=Linux驅動程序軟體框架+ARM開發板硬體操作,我們可以從簡單的裸機開發入手,先掌握硬體操作,並且還可以:

①掌握如何在PC Linux下編譯程序、把程序燒錄到板子上並運行它

②為學習bootloader打基礎:掌握了各種硬體操作後,後面一組合就是一個bootloader


2.2.5 為什麼選擇ARM9 S3C2440開發板,而不是其他性能更好的?

有一個錯誤的概念:S3C2440過時了、ARM9過時了。

這是不對的,如果你是軟體工程師,無論是ARM9、ARM11、A8還是A9,對我們來說是沒有差別的。

一款晶元,上面有CPU,還有眾多的片上設備(比如UART、USB、LCD控制器)。我們寫程序時,並不涉及CPU,只是去操作那些片上設備。

所以:差別在於片上設備,不在於CPU核;差別在於寄存器操作不一樣。

因為我們寫驅動並不涉及CPU的核心,只是操作CPU之外的設備,只是讀寫這些設備的寄存器。

之所以推薦S3C2440,是因為它的Linux學習資料最豐富,並有配套的第1、2期視頻。


2.2.6 怎麼學習ARM+Linux的裸機開發

學習裸機開發的目的有兩個:

①掌握裸機程序的結構,為後續的u-boot作準備

②練習硬體知識,即:怎麼看原理圖、晶元手冊,怎麼寫代碼來操作硬體


後面的u-boot可以認為是裸機程序的集合,我們在裸機開發中逐個掌握各個部件,再集合起來就可以得到一個u-boot了。

後續的驅動開發,也涉及硬體操作,你可以在裸機開發中學習硬體知識。


注意:如果你並不關心裸機的程序結構,不關心bootloader的實現,這部分是可以先略過的。在後面的驅動視頻中,我們也會重新講解所涉及的硬體知識。


推薦兩本書:杜春蕾的《ARM體系結構與編程》,韋東山的《嵌入式Linux應用開發完全手冊》。後者也許是國內第1本涉及在PC Linux環境下開發的ARM裸機程序的書,如果我說錯了,請原諒我書讀得少。


對於裸機開發,我們提供有2部分視頻:

①環境搭建

第0課第1節_剛接觸開發板之介面接線.wmv

第0課第2節_剛接觸開發板之燒寫裸板程序.wmv

第0課第3節_剛接觸開發板之重燒整個系統.wmv

第0課第4節_剛接觸開發板之使用vmwae和預先做好的ubuntu.wmv

第0課第5節_剛接觸開發板之u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第6節_剛接觸開發板之內核u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第7節_剛接觸開發板之製作根文件系統及初試驅動.wmv

第0課第8節_在TQ2440,MINI2440上搭建視頻所用系統.wmv

第0課第9節_win7下不能使用dnw燒寫的替代方法.wmv


.................未完

原文鏈接:網頁鏈接

③ 適合初學者學習的嵌入式教程

原文鏈接:網頁鏈接

嵌入式Linux學習路線圖

我是1999年上的大學,物理專業。在大一時,我們班裡普遍彌漫著對未來的不安,不知道學習了物理後出去能做什麼。你當下的經歷、當下的學習,在未來的一天肯定會影響到你。畢業後我們也各自找到了自己的職業:出國深造轉行做金融、留校任教做科研、設計晶元、寫程序、創辦公司等等,這一切都離不開在校時學到的基礎技能(數學、IT、電子電路)、受過煅煉的自學能力。

所以,各位正在迷茫的在校生,各位正在嘗試轉行的程序員,未來一定有你的位置,是好是壞取決於你當下的努力與積累。

我不能預言幾年後什麼行業會熱門,也不能保證你照著本文學習可以發財。我只是一個有十幾年經驗的程序員,給對編程有興趣的你,提供一些建議。

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核心源代碼情景分析》,此書分上下冊,巨厚無比。當作字典看即可:想深入理解某方面的知識,就去看某章節。

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


基於快速入門,上手工作的目的,您先不用看上面的書,先按本文學習。


2.1 入門路線圖

假設您是零基礎,我們規劃了如下入門路線圖。前面的知識,是後面知識的基礎,建議按順序學習。每一部分,不一定需要學得很深入透徹,下面分章節描述。

2.2 學習驅動程序之前的基礎知識

2.2.1 C語言

只要是理工科專業的,似乎都會教C語言。我見過很多C語言考試90、100分的,一上機就傻了,我懷疑他們都沒在電腦上寫過程序。

理論再好,沒有實踐不能幹活的話,公司招你去幹嘛?

反過來,實踐出真知,學習C語言,必須練練練、寫寫寫!

當你掌握基本語法後,就可以在電腦上練習一些C語言習題了;

當你寫過幾個C程序後,就可以進入下一階段的裸機開發了。


①不需要太深入

作為快速入門,只要你會編寫「Hello, world!」,會寫冒泡排序,會一些基礎的語法操作,暫時就夠了。

指針操作是重點,多練習;

不需要去學習過多的數據結構知識,只需要掌握鏈表操作,其他不用學習,比如:隊列、二叉樹等等都不用學;不需要去學習任何的函數使用,比如文件操作、多線程編程、網路編程等等;這些知識,在編寫Linux應用程序時會用,但是在操作系統特別是驅動學習時,用不著!

永往直前吧,以後碰到不懂的C語言問題,我們再回過頭來學習。

在後續的「裸機開發」中,會讓你繼續練習C語言,那會更實戰化。

C語言是在寫代碼中精進的。


②可以在Visual Studio下學習,也可以在Linux下學習,後者需要掌握一些編譯命令,我們暫時沒有提供C語言的教程,找一本C語言書,網上找找免費的C語言視頻(主要看怎麼搭建環境),就可以自學了。


2.2.2 PC Linux基本操作:

對於PC Linux,我們推薦使用Ubuntu,在它上面安裝軟體非常簡便。

我們的工作模式通常是這樣:在Windows下閱讀、編寫代碼,然後把代碼上傳到PC Linux去編譯。實際上,Ubuntu的桌面系統已經很好用了,我們拿到各種智能機可以很快上手,相信Ubuntu的桌面系統也可以讓你很快上手。為了提高工作效率,我們通常使用命令行來操作Ubuntu。


不用擔心,你前期只需要掌握這幾條命令就可以了,它們是如此簡單,我乾脆列出它們:

①cd : Change Directory(改變目錄)

cd 目錄名 // 進入某個目錄cd .. // cd 「兩個點」:返回上一級目錄cd - // cd 「短橫」:返回上一次所在目錄

②pwd : Print Work Directory(列印當前目錄 顯示出當前工作目錄的絕對路徑)

③mkdir : Make Directory(創建目錄)

mkdir abc // 創建文件夾abcmkdir -p a/b/c // 創建文件夾a,再a下創建文件夾b,再在b下創建文件夾c

④rm : Remove(刪除目錄或文件)

rm file // 刪除名為file的文件rm -rf dir // 刪除名為dir的目錄

⑤ls : List(列出目錄內容)

⑥mount : 掛載

mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mntmount -t yaffs /dev/mtdblock3 /mnt

⑦chown : Change owner(改變文件的屬主,即擁有者)

chown book:book /work -R //對/work目錄及其下所有內容,屬主改為book用戶,組改為book

⑧chmod : Change mode(改變許可權),下面的例子很簡單粗暴

chmod 777 /work -R // 對/work目錄及其下所有內容,許可權改為可讀、可寫、可執行

⑨vi : Linux下最常用的編輯命令,使用稍微復雜,請自己搜索用法。


要練習這些命令,你可以進入Ubuntu桌面系統後,打開終端輸入那些命令;或是用SecureCRT、putty等工具遠程登錄Ubuntu後練習。


2.2.3 硬體知識

我們學習硬體知識的目的在於能看懂原理圖,看懂通信協議,看懂晶元手冊;不求能設計原理圖,更不求能設計電路板。

對於正統的方法,你應該這樣學習:

①學習《微機原理》,理解一個計算機的組成及各個部件的交互原理。

②學習《數字電路》,理解各種門電路的原理及使用,還可以掌握一些邏輯運算(與、或等)。

③《模擬電路》?好吧,這個不用學,至少我在工作中基本用不到它,現在全忘光了。


就我個人經驗來說,這些課程是有用的,但是:

①原理有用,實戰性不強。

比如《微機原理》是基於x86系統,跟ARM板子有很大差別,當然原理相通。

我是在接觸嵌入式編程後,才理解了這些課程。

②每本書都那麼厚,內容都很多,學習時間過長,自學有難度。


針對這些校園教材的不足,並結合實際開發過程中要用到的知識點,我們推出了《學前班_怎麼看原理圖》的系列視頻:

學前班第1課第1節___怎麼看原理圖之GPIO和門電路.wmv

學前班第1課第2.1節_怎麼看原理圖之協議類介面之UART.wmv

學前班第1課第2.2節_怎麼看原理圖之協議類介面之I2C.wmv

學前班第1課第2.3節_怎麼看原理圖之協議類介面之SPI.wmv

學前班第1課第2.4節_怎麼看原理圖之協議類介面之NAND Flash.wmv

學前班第1課第2.5節_怎麼看原理圖之協議類介面之LCD.wmv

學前班第1課第3節___怎麼看原理圖之內存類介面.wmv

學前班第1課第4.1節_怎麼看原理圖之分析S3C2410開發板.wmv

學前班第1課第4.2節_怎麼看原理圖之分析S3C2440開發板.wmv

學前班第1課第4.3節_怎麼看原理圖之分析S3C6410開發板.wmv


即使你只具備初中物理課的電路知識,我也希望能通過這些視頻,讓你可以看懂原理圖,理解一些常見的通信協議;如果你想掌握更多的硬體知識,這些視頻也可以起個索引作用,讓你知道缺乏什麼知識。


這些視頻所講到的硬體知識,將在《裸板開發》系列視頻中用到,到時可以相互對照著看,加深理解。


2.2.4 要不要專門學習Windows下的單片機開發

很多學校都開通了單片機的課程,很多人都是從51單片機、AVR單片機,現在比較新的STM32單片機開始接觸嵌入式領域,並且使用Windows下的開發軟體,比如keil、MDK等。

問題來了,要不要專門學習Windows下的單片機開發?

①如果這是你們專業的必修課,那就學吧

②如果你的專業跟單片機密切相關,比如機械控制等,那就學吧

③如果你只是想從單片機入門,然後學習更廣闊的嵌入式Linux,那麼放棄在Windows下學習單片機吧!


理由如下:

①Windows下的單片機學習,深度不夠

Windows下有很好的圖形界面單片機開發軟體,比如keil、MDK等。

它們封裝了很多技術細節,比如:

你只會從main函數開始編寫代碼,卻不知道上電後第1條代碼是怎麼執行的;

你可以編寫中斷處理函數,但是卻不知道它是怎麼被調用的;

你不知道程序怎麼從Flash上被讀入內存;

也不知道內存是怎麼劃分使用的,不知道棧在哪、堆在哪;

當你想裁剪程序降低對Flash、內存的使用時,你無從下手;

當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂;

等等等。


②基於ARM+Linux裸機學習,可以學得更深,並且更貼合後續的Linux學習。實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。

在工作中,我們當然傾向於使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。


一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:

你需要了解晶元的上電啟動過程,知道第1條代碼如何運行;

你需要掌握怎麼把程序從Flash上讀入內存;

需要理解內存怎麼規劃使用,比如棧在哪,堆在哪;

需要理解代碼重定位;

需要知道中斷發生後,軟硬體怎麼保護現場、跳到中斷入口、調用中斷程序、恢復現場;

你會知道,main函數不是我們編寫的第1個函數;

你會知道,晶元從上電開始,程序是怎麼被搬運執行的;

你會知道,函數調用過程中,參數是如何傳遞的;

你會知道,中斷發生時,每一個寄存器的值都要小心對待;

等等等。


你掌握了ARM+Linux的裸機開發,再回去看Windows下的單片機開發,會驚呼:怎麼那麼簡單!並且你會完全明白這些工具沒有向你展示的技術細節。


驅動程序=Linux驅動程序軟體框架+ARM開發板硬體操作,我們可以從簡單的裸機開發入手,先掌握硬體操作,並且還可以:

①掌握如何在PC Linux下編譯程序、把程序燒錄到板子上並運行它

②為學習bootloader打基礎:掌握了各種硬體操作後,後面一組合就是一個bootloader


2.2.5 為什麼選擇ARM9 S3C2440開發板,而不是其他性能更好的?

有一個錯誤的概念:S3C2440過時了、ARM9過時了。

這是不對的,如果你是軟體工程師,無論是ARM9、ARM11、A8還是A9,對我們來說是沒有差別的。

一款晶元,上面有CPU,還有眾多的片上設備(比如UART、USB、LCD控制器)。我們寫程序時,並不涉及CPU,只是去操作那些片上設備。

所以:差別在於片上設備,不在於CPU核;差別在於寄存器操作不一樣。

因為我們寫驅動並不涉及CPU的核心,只是操作CPU之外的設備,只是讀寫這些設備的寄存器。

之所以推薦S3C2440,是因為它的Linux學習資料最豐富,並有配套的第1、2期視頻。


2.2.6 怎麼學習ARM+Linux的裸機開發

學習裸機開發的目的有兩個:

①掌握裸機程序的結構,為後續的u-boot作準備

②練習硬體知識,即:怎麼看原理圖、晶元手冊,怎麼寫代碼來操作硬體


後面的u-boot可以認為是裸機程序的集合,我們在裸機開發中逐個掌握各個部件,再集合起來就可以得到一個u-boot了。

後續的驅動開發,也涉及硬體操作,你可以在裸機開發中學習硬體知識。


注意:如果你並不關心裸機的程序結構,不關心bootloader的實現,這部分是可以先略過的。在後面的驅動視頻中,我們也會重新講解所涉及的硬體知識。


推薦兩本書:杜春蕾的《ARM體系結構與編程》,韋東山的《嵌入式Linux應用開發完全手冊》。後者也許是國內第1本涉及在PC Linux環境下開發的ARM裸機程序的書,如果我說錯了,請原諒我書讀得少。


對於裸機開發,我們提供有2部分視頻:

①環境搭建

第0課第1節_剛接觸開發板之介面接線.wmv

第0課第2節_剛接觸開發板之燒寫裸板程序.wmv

第0課第3節_剛接觸開發板之重燒整個系統.wmv

第0課第4節_剛接觸開發板之使用vmwae和預先做好的ubuntu.wmv

第0課第5節_剛接觸開發板之u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第6節_剛接觸開發板之內核u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第7節_剛接觸開發板之製作根文件系統及初試驅動.wmv

第0課第8節_在TQ2440,MINI2440上搭建視頻所用系統.wmv

第0課第9節_win7下不能使用dnw燒寫的替代方法.wmv

.................

原文鏈接:網頁鏈接

④ 如何自學嵌入式

原文鏈接:網頁鏈接

嵌入式Linux學習路線圖

我是1999年上的大學,物理專業。在大一時,我們班裡普遍彌漫著對未來的不安,不知道學習了物理後出去能做什麼。你當下的經歷、當下的學習,在未來的一天肯定會影響到你。畢業後我們也各自找到了自己的職業:出國深造轉行做金融、留校任教做科研、設計晶元、寫程序、創辦公司等等,這一切都離不開在校時學到的基礎技能(數學、IT、電子電路)、受過煅煉的自學能力。

所以,各位正在迷茫的在校生,各位正在嘗試轉行的程序員,未來一定有你的位置,是好是壞取決於你當下的努力與積累。

我不能預言幾年後什麼行業會熱門,也不能保證你照著本文學習可以發財。我只是一個有十幾年經驗的程序員,給對編程有興趣的你,提供一些建議。

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核心源代碼情景分析》,此書分上下冊,巨厚無比。當作字典看即可:想深入理解某方面的知識,就去看某章節。

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


基於快速入門,上手工作的目的,您先不用看上面的書,先按本文學習。


2.1 入門路線圖

假設您是零基礎,我們規劃了如下入門路線圖。前面的知識,是後面知識的基礎,建議按順序學習。每一部分,不一定需要學得很深入透徹,下面分章節描述。

2.2 學習驅動程序之前的基礎知識

2.2.1 C語言

只要是理工科專業的,似乎都會教C語言。我見過很多C語言考試90、100分的,一上機就傻了,我懷疑他們都沒在電腦上寫過程序。

理論再好,沒有實踐不能幹活的話,公司招你去幹嘛?

反過來,實踐出真知,學習C語言,必須練練練、寫寫寫!

當你掌握基本語法後,就可以在電腦上練習一些C語言習題了;

當你寫過幾個C程序後,就可以進入下一階段的裸機開發了。


①不需要太深入

作為快速入門,只要你會編寫「Hello, world!」,會寫冒泡排序,會一些基礎的語法操作,暫時就夠了。

指針操作是重點,多練習;

不需要去學習過多的數據結構知識,只需要掌握鏈表操作,其他不用學習,比如:隊列、二叉樹等等都不用學;不需要去學習任何的函數使用,比如文件操作、多線程編程、網路編程等等;這些知識,在編寫Linux應用程序時會用,但是在操作系統特別是驅動學習時,用不著!

永往直前吧,以後碰到不懂的C語言問題,我們再回過頭來學習。

在後續的「裸機開發」中,會讓你繼續練習C語言,那會更實戰化。

C語言是在寫代碼中精進的。


②可以在Visual Studio下學習,也可以在Linux下學習,後者需要掌握一些編譯命令,我們暫時沒有提供C語言的教程,找一本C語言書,網上找找免費的C語言視頻(主要看怎麼搭建環境),就可以自學了。


2.2.2 PC Linux基本操作:

對於PC Linux,我們推薦使用Ubuntu,在它上面安裝軟體非常簡便。

我們的工作模式通常是這樣:在Windows下閱讀、編寫代碼,然後把代碼上傳到PC Linux去編譯。實際上,Ubuntu的桌面系統已經很好用了,我們拿到各種智能機可以很快上手,相信Ubuntu的桌面系統也可以讓你很快上手。為了提高工作效率,我們通常使用命令行來操作Ubuntu。


不用擔心,你前期只需要掌握這幾條命令就可以了,它們是如此簡單,我乾脆列出它們:

①cd : Change Directory(改變目錄)

cd 目錄名 // 進入某個目錄cd .. // cd 「兩個點」:返回上一級目錄cd - // cd 「短橫」:返回上一次所在目錄

②pwd : Print Work Directory(列印當前目錄 顯示出當前工作目錄的絕對路徑)

③mkdir : Make Directory(創建目錄)

mkdir abc // 創建文件夾abcmkdir -p a/b/c // 創建文件夾a,再a下創建文件夾b,再在b下創建文件夾c

④rm : Remove(刪除目錄或文件)

rm file // 刪除名為file的文件rm -rf dir // 刪除名為dir的目錄

⑤ls : List(列出目錄內容)

⑥mount : 掛載

mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mntmount -t yaffs /dev/mtdblock3 /mnt

⑦chown : Change owner(改變文件的屬主,即擁有者)

chown book:book /work -R //對/work目錄及其下所有內容,屬主改為book用戶,組改為book

⑧chmod : Change mode(改變許可權),下面的例子很簡單粗暴

chmod 777 /work -R // 對/work目錄及其下所有內容,許可權改為可讀、可寫、可執行

⑨vi : Linux下最常用的編輯命令,使用稍微復雜,請自己搜索用法。


要練習這些命令,你可以進入Ubuntu桌面系統後,打開終端輸入那些命令;或是用SecureCRT、putty等工具遠程登錄Ubuntu後練習。


2.2.3 硬體知識

我們學習硬體知識的目的在於能看懂原理圖,看懂通信協議,看懂晶元手冊;不求能設計原理圖,更不求能設計電路板。

對於正統的方法,你應該這樣學習:

①學習《微機原理》,理解一個計算機的組成及各個部件的交互原理。

②學習《數字電路》,理解各種門電路的原理及使用,還可以掌握一些邏輯運算(與、或等)。

③《模擬電路》?好吧,這個不用學,至少我在工作中基本用不到它,現在全忘光了。


就我個人經驗來說,這些課程是有用的,但是:

①原理有用,實戰性不強。

比如《微機原理》是基於x86系統,跟ARM板子有很大差別,當然原理相通。

我是在接觸嵌入式編程後,才理解了這些課程。

②每本書都那麼厚,內容都很多,學習時間過長,自學有難度。


針對這些校園教材的不足,並結合實際開發過程中要用到的知識點,我們推出了《學前班_怎麼看原理圖》的系列視頻:

學前班第1課第1節___怎麼看原理圖之GPIO和門電路.wmv

學前班第1課第2.1節_怎麼看原理圖之協議類介面之UART.wmv

學前班第1課第2.2節_怎麼看原理圖之協議類介面之I2C.wmv

學前班第1課第2.3節_怎麼看原理圖之協議類介面之SPI.wmv

學前班第1課第2.4節_怎麼看原理圖之協議類介面之NAND Flash.wmv

學前班第1課第2.5節_怎麼看原理圖之協議類介面之LCD.wmv

學前班第1課第3節___怎麼看原理圖之內存類介面.wmv

學前班第1課第4.1節_怎麼看原理圖之分析S3C2410開發板.wmv

學前班第1課第4.2節_怎麼看原理圖之分析S3C2440開發板.wmv

學前班第1課第4.3節_怎麼看原理圖之分析S3C6410開發板.wmv


即使你只具備初中物理課的電路知識,我也希望能通過這些視頻,讓你可以看懂原理圖,理解一些常見的通信協議;如果你想掌握更多的硬體知識,這些視頻也可以起個索引作用,讓你知道缺乏什麼知識。


這些視頻所講到的硬體知識,將在《裸板開發》系列視頻中用到,到時可以相互對照著看,加深理解。


2.2.4 要不要專門學習Windows下的單片機開發

很多學校都開通了單片機的課程,很多人都是從51單片機、AVR單片機,現在比較新的STM32單片機開始接觸嵌入式領域,並且使用Windows下的開發軟體,比如keil、MDK等。

問題來了,要不要專門學習Windows下的單片機開發?

①如果這是你們專業的必修課,那就學吧

②如果你的專業跟單片機密切相關,比如機械控制等,那就學吧

③如果你只是想從單片機入門,然後學習更廣闊的嵌入式Linux,那麼放棄在Windows下學習單片機吧!


理由如下:

①Windows下的單片機學習,深度不夠

Windows下有很好的圖形界面單片機開發軟體,比如keil、MDK等。

它們封裝了很多技術細節,比如:

你只會從main函數開始編寫代碼,卻不知道上電後第1條代碼是怎麼執行的;

你可以編寫中斷處理函數,但是卻不知道它是怎麼被調用的;

你不知道程序怎麼從Flash上被讀入內存;

也不知道內存是怎麼劃分使用的,不知道棧在哪、堆在哪;

當你想裁剪程序降低對Flash、內存的使用時,你無從下手;

當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂;

等等等。


②基於ARM+Linux裸機學習,可以學得更深,並且更貼合後續的Linux學習。實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。

在工作中,我們當然傾向於使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。


一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:

你需要了解晶元的上電啟動過程,知道第1條代碼如何運行;

你需要掌握怎麼把程序從Flash上讀入內存;

需要理解內存怎麼規劃使用,比如棧在哪,堆在哪;

需要理解代碼重定位;

需要知道中斷發生後,軟硬體怎麼保護現場、跳到中斷入口、調用中斷程序、恢復現場;

你會知道,main函數不是我們編寫的第1個函數;

你會知道,晶元從上電開始,程序是怎麼被搬運執行的;

你會知道,函數調用過程中,參數是如何傳遞的;

你會知道,中斷發生時,每一個寄存器的值都要小心對待;

等等等。


你掌握了ARM+Linux的裸機開發,再回去看Windows下的單片機開發,會驚呼:怎麼那麼簡單!並且你會完全明白這些工具沒有向你展示的技術細節。


驅動程序=Linux驅動程序軟體框架+ARM開發板硬體操作,我們可以從簡單的裸機開發入手,先掌握硬體操作,並且還可以:

①掌握如何在PC Linux下編譯程序、把程序燒錄到板子上並運行它

②為學習bootloader打基礎:掌握了各種硬體操作後,後面一組合就是一個bootloader


2.2.5 為什麼選擇ARM9 S3C2440開發板,而不是其他性能更好的?

有一個錯誤的概念:S3C2440過時了、ARM9過時了。

這是不對的,如果你是軟體工程師,無論是ARM9、ARM11、A8還是A9,對我們來說是沒有差別的。

一款晶元,上面有CPU,還有眾多的片上設備(比如UART、USB、LCD控制器)。我們寫程序時,並不涉及CPU,只是去操作那些片上設備。

所以:差別在於片上設備,不在於CPU核;差別在於寄存器操作不一樣。

因為我們寫驅動並不涉及CPU的核心,只是操作CPU之外的設備,只是讀寫這些設備的寄存器。

之所以推薦S3C2440,是因為它的Linux學習資料最豐富,並有配套的第1、2期視頻。


2.2.6 怎麼學習ARM+Linux的裸機開發

學習裸機開發的目的有兩個:

①掌握裸機程序的結構,為後續的u-boot作準備

②練習硬體知識,即:怎麼看原理圖、晶元手冊,怎麼寫代碼來操作硬體


後面的u-boot可以認為是裸機程序的集合,我們在裸機開發中逐個掌握各個部件,再集合起來就可以得到一個u-boot了。

後續的驅動開發,也涉及硬體操作,你可以在裸機開發中學習硬體知識。


注意:如果你並不關心裸機的程序結構,不關心bootloader的實現,這部分是可以先略過的。在後面的驅動視頻中,我們也會重新講解所涉及的硬體知識。


推薦兩本書:杜春蕾的《ARM體系結構與編程》,韋東山的《嵌入式Linux應用開發完全手冊》。後者也許是國內第1本涉及在PC Linux環境下開發的ARM裸機程序的書,如果我說錯了,請原諒我書讀得少。


對於裸機開發,我們提供有2部分視頻:

①環境搭建

第0課第1節_剛接觸開發板之介面接線.wmv

第0課第2節_剛接觸開發板之燒寫裸板程序.wmv

第0課第3節_剛接觸開發板之重燒整個系統.wmv

第0課第4節_剛接觸開發板之使用vmwae和預先做好的ubuntu.wmv

第0課第5節_剛接觸開發板之u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第6節_剛接觸開發板之內核u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第7節_剛接觸開發板之製作根文件系統及初試驅動.wmv

第0課第8節_在TQ2440,MINI2440上搭建視頻所用系統.wmv

第0課第9節_win7下不能使用dnw燒寫的替代方法.wmv

.................未完

原文鏈接:網頁鏈接

⑤ bilibili裡面的視頻怎麼下載到電腦上

bilibili 嗶哩嗶哩視頻如何下載到電腦的 3 種方法

bilibili(嗶哩嗶哩)是目前國內知名的視頻彈幕網站,被粉絲們親切的稱為「B站」。

現為國內領先的年輕人文化社區,非常受年輕用戶的歡迎。

其操作界面簡潔、速度快而且廣告也不多,尤其是實時彈幕非常受歡迎。

但是B站目前暫時不支持將視頻下載到電腦本地,卷哥今天就教大家幾種B站下載到本地的方法。

STEP 1

網頁在線解析

打開B站,找到你需要下載的視頻頁面,復制當前的網頁地址。

然後打開以下web網站地址

網址:http://www.jijidown.com/

這是一個支持下載對於B站在線視頻和彈幕的一個web,並且終身免費使用。

你也可以直接在視頻網頁網址 .com 的前面加上 jj 兩個字母直接回車也可以到達web下載頁面。

點擊右邊的下載選項即可下載至電腦本地。

STEP 2

網頁瀏覽器插件

利用B站下載助手插件可以更快的在當前網頁自動解析點擊即可下載

谷歌瀏覽器。

首先打開谷歌瀏覽器右上角的自定義及控制按鈕,在下拉框中更多工具選項

然後點擊擴展程序來啟動Chrome瀏覽器的擴展管理器頁面。

找到已經下載好的Chrome離線安裝文件xxx.crx,然後將其拖動到Chrome的擴展管理界面中。

這時候用戶會發現在擴展管理器的中央部分中會多出一個」拖動以安裝「的插件按鈕。松開手就安裝成功了。

STEP 3

WIN10商店使用UWP版

在微軟商店下載嗶哩嗶哩動畫UWP版本並打開。

微軟商店的UWP版本是支持下載到本地的,還可以支持自定義下載的位置。

但是功能的豐富程度還是沒有windows版的豐富。

好了以上就是下載嗶哩嗶哩視頻到本地的三種方法。

⑥ 求手機版APK Editor軟體

APK編輯器是一款可以編輯apk文件的系統安全類軟體。包括對apk文件的解包、打包、簽名、漢化、應用共存製作、文字翻譯等等操作。APK編輯器讓你在沒有電腦的情況下,在任何地點,任何時間都能漢化修改Android軟體。 APK編輯器功能介紹 1:可視化、全自動的反編譯、編譯、簽名;支持批量編譯APK。 2:自動識別圖像資源,並提供該類資源的快捷替換功能,方便修改這類圖片資源。 3:以樹形目錄管理反編譯出的Apk源碼文件,瀏覽、打開、編輯、都可以統一在軟體中實現,不同項目間可以自由切換,方便快捷。 APK編輯器使用教程 1.先點開想要修改軟體安裝包,所在的文件夾,然後點擊安裝包,會有如下圖情況,然後點擊最後一個文件,如圖下劃線,當然這里以360優化大師為列子 2.在裡面找到想改的數據,如果看的暈,可以點擊放大鏡搜索 3.然後在下面的空中輸入想改的東西,如圖 4.改好後點返回鍵,也可以點最左邊那個鍵,點彈出菜單里的保存。點了後會彈出下圖,點是 5.點完後又會彈出一個選項,是加入詞典選項,如果以後想經常改的話就點是吧 6.修改好後會出現兩個文件,後綴名為.bak的是原文件,後綴名為apk的是改後的文件, 7.長按安裝包,會彈出一個菜單,點擊安裝,另外,安裝前建議把之前安裝的卸了,不然安不了

⑦ 學習嵌入式,要如何學好嵌入式

原文鏈接:網頁鏈接

嵌入式Linux學習路線圖

我是1999年上的大學,物理專業。在大一時,我們班裡普遍彌漫著對未來的不安,不知道學習了物理後出去能做什麼。你當下的經歷、當下的學習,在未來的一天肯定會影響到你。畢業後我們也各自找到了自己的職業:出國深造轉行做金融、留校任教做科研、設計晶元、寫程序、創辦公司等等,這一切都離不開在校時學到的基礎技能(數學、IT、電子電路)、受過煅煉的自學能力。

所以,各位正在迷茫的在校生,各位正在嘗試轉行的程序員,未來一定有你的位置,是好是壞取決於你當下的努力與積累。

我不能預言幾年後什麼行業會熱門,也不能保證你照著本文學習可以發財。我只是一個有十幾年經驗的程序員,給對編程有興趣的你,提供一些建議。

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核心源代碼情景分析》,此書分上下冊,巨厚無比。當作字典看即可:想深入理解某方面的知識,就去看某章節。

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


基於快速入門,上手工作的目的,您先不用看上面的書,先按本文學習。


2.1 入門路線圖

假設您是零基礎,我們規劃了如下入門路線圖。前面的知識,是後面知識的基礎,建議按順序學習。每一部分,不一定需要學得很深入透徹,下面分章節描述。

2.2 學習驅動程序之前的基礎知識

2.2.1 C語言

只要是理工科專業的,似乎都會教C語言。我見過很多C語言考試90、100分的,一上機就傻了,我懷疑他們都沒在電腦上寫過程序。

理論再好,沒有實踐不能幹活的話,公司招你去幹嘛?

反過來,實踐出真知,學習C語言,必須練練練、寫寫寫!

當你掌握基本語法後,就可以在電腦上練習一些C語言習題了;

當你寫過幾個C程序後,就可以進入下一階段的裸機開發了。


①不需要太深入

作為快速入門,只要你會編寫「Hello, world!」,會寫冒泡排序,會一些基礎的語法操作,暫時就夠了。

指針操作是重點,多練習;

不需要去學習過多的數據結構知識,只需要掌握鏈表操作,其他不用學習,比如:隊列、二叉樹等等都不用學;不需要去學習任何的函數使用,比如文件操作、多線程編程、網路編程等等;這些知識,在編寫Linux應用程序時會用,但是在操作系統特別是驅動學習時,用不著!

永往直前吧,以後碰到不懂的C語言問題,我們再回過頭來學習。

在後續的「裸機開發」中,會讓你繼續練習C語言,那會更實戰化。

C語言是在寫代碼中精進的。


②可以在Visual Studio下學習,也可以在Linux下學習,後者需要掌握一些編譯命令,我們暫時沒有提供C語言的教程,找一本C語言書,網上找找免費的C語言視頻(主要看怎麼搭建環境),就可以自學了。


2.2.2 PC Linux基本操作:

對於PC Linux,我們推薦使用Ubuntu,在它上面安裝軟體非常簡便。

我們的工作模式通常是這樣:在Windows下閱讀、編寫代碼,然後把代碼上傳到PC Linux去編譯。實際上,Ubuntu的桌面系統已經很好用了,我們拿到各種智能機可以很快上手,相信Ubuntu的桌面系統也可以讓你很快上手。為了提高工作效率,我們通常使用命令行來操作Ubuntu。


不用擔心,你前期只需要掌握這幾條命令就可以了,它們是如此簡單,我乾脆列出它們:

①cd : Change Directory(改變目錄)

cd 目錄名 // 進入某個目錄cd .. // cd 「兩個點」:返回上一級目錄cd - // cd 「短橫」:返回上一次所在目錄

②pwd : Print Work Directory(列印當前目錄 顯示出當前工作目錄的絕對路徑)

③mkdir : Make Directory(創建目錄)

mkdir abc // 創建文件夾abcmkdir -p a/b/c // 創建文件夾a,再a下創建文件夾b,再在b下創建文件夾c

④rm : Remove(刪除目錄或文件)

rm file // 刪除名為file的文件rm -rf dir // 刪除名為dir的目錄

⑤ls : List(列出目錄內容)

⑥mount : 掛載

mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mntmount -t yaffs /dev/mtdblock3 /mnt

⑦chown : Change owner(改變文件的屬主,即擁有者)

chown book:book /work -R //對/work目錄及其下所有內容,屬主改為book用戶,組改為book

⑧chmod : Change mode(改變許可權),下面的例子很簡單粗暴

chmod 777 /work -R // 對/work目錄及其下所有內容,許可權改為可讀、可寫、可執行

⑨vi : Linux下最常用的編輯命令,使用稍微復雜,請自己搜索用法。


要練習這些命令,你可以進入Ubuntu桌面系統後,打開終端輸入那些命令;或是用SecureCRT、putty等工具遠程登錄Ubuntu後練習。


2.2.3 硬體知識

我們學習硬體知識的目的在於能看懂原理圖,看懂通信協議,看懂晶元手冊;不求能設計原理圖,更不求能設計電路板。

對於正統的方法,你應該這樣學習:

①學習《微機原理》,理解一個計算機的組成及各個部件的交互原理。

②學習《數字電路》,理解各種門電路的原理及使用,還可以掌握一些邏輯運算(與、或等)。

③《模擬電路》?好吧,這個不用學,至少我在工作中基本用不到它,現在全忘光了。


就我個人經驗來說,這些課程是有用的,但是:

①原理有用,實戰性不強。

比如《微機原理》是基於x86系統,跟ARM板子有很大差別,當然原理相通。

我是在接觸嵌入式編程後,才理解了這些課程。

②每本書都那麼厚,內容都很多,學習時間過長,自學有難度。


針對這些校園教材的不足,並結合實際開發過程中要用到的知識點,我們推出了《學前班_怎麼看原理圖》的系列視頻:

學前班第1課第1節___怎麼看原理圖之GPIO和門電路.wmv

學前班第1課第2.1節_怎麼看原理圖之協議類介面之UART.wmv

學前班第1課第2.2節_怎麼看原理圖之協議類介面之I2C.wmv

學前班第1課第2.3節_怎麼看原理圖之協議類介面之SPI.wmv

學前班第1課第2.4節_怎麼看原理圖之協議類介面之NAND Flash.wmv

學前班第1課第2.5節_怎麼看原理圖之協議類介面之LCD.wmv

學前班第1課第3節___怎麼看原理圖之內存類介面.wmv

學前班第1課第4.1節_怎麼看原理圖之分析S3C2410開發板.wmv

學前班第1課第4.2節_怎麼看原理圖之分析S3C2440開發板.wmv

學前班第1課第4.3節_怎麼看原理圖之分析S3C6410開發板.wmv


即使你只具備初中物理課的電路知識,我也希望能通過這些視頻,讓你可以看懂原理圖,理解一些常見的通信協議;如果你想掌握更多的硬體知識,這些視頻也可以起個索引作用,讓你知道缺乏什麼知識。


這些視頻所講到的硬體知識,將在《裸板開發》系列視頻中用到,到時可以相互對照著看,加深理解。


2.2.4 要不要專門學習Windows下的單片機開發

很多學校都開通了單片機的課程,很多人都是從51單片機、AVR單片機,現在比較新的STM32單片機開始接觸嵌入式領域,並且使用Windows下的開發軟體,比如keil、MDK等。

問題來了,要不要專門學習Windows下的單片機開發?

①如果這是你們專業的必修課,那就學吧

②如果你的專業跟單片機密切相關,比如機械控制等,那就學吧

③如果你只是想從單片機入門,然後學習更廣闊的嵌入式Linux,那麼放棄在Windows下學習單片機吧!


理由如下:

①Windows下的單片機學習,深度不夠

Windows下有很好的圖形界面單片機開發軟體,比如keil、MDK等。

它們封裝了很多技術細節,比如:

你只會從main函數開始編寫代碼,卻不知道上電後第1條代碼是怎麼執行的;

你可以編寫中斷處理函數,但是卻不知道它是怎麼被調用的;

你不知道程序怎麼從Flash上被讀入內存;

也不知道內存是怎麼劃分使用的,不知道棧在哪、堆在哪;

當你想裁剪程序降低對Flash、內存的使用時,你無從下手;

當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂;

等等等。


②基於ARM+Linux裸機學習,可以學得更深,並且更貼合後續的Linux學習。實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。

在工作中,我們當然傾向於使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。


一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:

你需要了解晶元的上電啟動過程,知道第1條代碼如何運行;

你需要掌握怎麼把程序從Flash上讀入內存;

需要理解內存怎麼規劃使用,比如棧在哪,堆在哪;

需要理解代碼重定位;

需要知道中斷發生後,軟硬體怎麼保護現場、跳到中斷入口、調用中斷程序、恢復現場;

你會知道,main函數不是我們編寫的第1個函數;

你會知道,晶元從上電開始,程序是怎麼被搬運執行的;

你會知道,函數調用過程中,參數是如何傳遞的;

你會知道,中斷發生時,每一個寄存器的值都要小心對待;

等等等。


你掌握了ARM+Linux的裸機開發,再回去看Windows下的單片機開發,會驚呼:怎麼那麼簡單!並且你會完全明白這些工具沒有向你展示的技術細節。


驅動程序=Linux驅動程序軟體框架+ARM開發板硬體操作,我們可以從簡單的裸機開發入手,先掌握硬體操作,並且還可以:

①掌握如何在PC Linux下編譯程序、把程序燒錄到板子上並運行它

②為學習bootloader打基礎:掌握了各種硬體操作後,後面一組合就是一個bootloader


2.2.5 為什麼選擇ARM9 S3C2440開發板,而不是其他性能更好的?

有一個錯誤的概念:S3C2440過時了、ARM9過時了。

這是不對的,如果你是軟體工程師,無論是ARM9、ARM11、A8還是A9,對我們來說是沒有差別的。

一款晶元,上面有CPU,還有眾多的片上設備(比如UART、USB、LCD控制器)。我們寫程序時,並不涉及CPU,只是去操作那些片上設備。

所以:差別在於片上設備,不在於CPU核;差別在於寄存器操作不一樣。

因為我們寫驅動並不涉及CPU的核心,只是操作CPU之外的設備,只是讀寫這些設備的寄存器。

之所以推薦S3C2440,是因為它的Linux學習資料最豐富,並有配套的第1、2期視頻。


2.2.6 怎麼學習ARM+Linux的裸機開發

學習裸機開發的目的有兩個:

①掌握裸機程序的結構,為後續的u-boot作準備

②練習硬體知識,即:怎麼看原理圖、晶元手冊,怎麼寫代碼來操作硬體


後面的u-boot可以認為是裸機程序的集合,我們在裸機開發中逐個掌握各個部件,再集合起來就可以得到一個u-boot了。

後續的驅動開發,也涉及硬體操作,你可以在裸機開發中學習硬體知識。


注意:如果你並不關心裸機的程序結構,不關心bootloader的實現,這部分是可以先略過的。在後面的驅動視頻中,我們也會重新講解所涉及的硬體知識。


推薦兩本書:杜春蕾的《ARM體系結構與編程》,韋東山的《嵌入式Linux應用開發完全手冊》。後者也許是國內第1本涉及在PC Linux環境下開發的ARM裸機程序的書,如果我說錯了,請原諒我書讀得少。


對於裸機開發,我們提供有2部分視頻:

①環境搭建

第0課第1節_剛接觸開發板之介面接線.wmv

第0課第2節_剛接觸開發板之燒寫裸板程序.wmv

第0課第3節_剛接觸開發板之重燒整個系統.wmv

第0課第4節_剛接觸開發板之使用vmwae和預先做好的ubuntu.wmv

第0課第5節_剛接觸開發板之u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第6節_剛接觸開發板之內核u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第7節_剛接觸開發板之製作根文件系統及初試驅動.wmv

第0課第8節_在TQ2440,MINI2440上搭建視頻所用系統.wmv

第0課第9節_win7下不能使用dnw燒寫的替代方法.wmv


.................未完

原文鏈接:網頁鏈接

⑧ 安卓不同頁面跳轉到同一個頁面取返回值 在onactivityresult里怎麼寫

現有MainActivity,當它進入到SecondActivity後,在SecondActivity中進行了某些操作然後需要將值返回給MainActivity時,
於是就可以用到onActivityResult() 這個方法了,下面呢,我就具體來介紹一下用法。

不過在這之前,先講一下intent的用法:
對於intent主要的分類主要包括隱式意圖和顯式意圖。顯式意圖通常主要是啟動本應用中的Activity之間的數據,
而隱式意圖則常見於啟動系統中的某些特定的動作,比如打電話,或者是跨應用的Activity啟動。
一般來說:
顯式意圖:調用Intent.setComponent()或Intent.setClass()方法明確指定了組件名的Intent為顯式意圖,顯式意圖明確指定了Intent應該傳遞給哪個組件。
隱式意圖:沒有明確指定組件名的Intent為隱式意圖。 Android系統會根據隱式意圖中設置的動作(action)、類別(category)、
數據(URI和數據類型)找到最合適的組件來處理這個意圖。

1、MainActivity裡面的主要代碼
(1)當需要返回值時,那麼在啟動另一個Activity時要用到startActivityForResult(intent, REQUEST_CODE);
注意第二個參數是請求的int類型的值,這個值要在onActivityResult()方法中和requestCode做判斷的,
由此來判斷是啟動的某個Activity。
(2)onActivityResult()方法中的第二個參數就是SecondActivity傳回來的鍵,
第三個參數就是SecondActivity傳回來的鍵對應的值。

final int RESULT_CODE=101;

final int REQUEST_CODE=1;

public void enterSecond(View view) {

Intent intent=new Intent(this,SecondActivity.class);

startActivityForResult(intent, REQUEST_CODE);

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

Log.i(TAG, "onActivityResult"+"requestCode"+requestCode+"\n resultCode="+resultCode);

if(requestCode==REQUEST_CODE) {

if(resultCode==RESULT_CODE) {

String result=data.getStringExtra("second");

textView.setText(result);

}

}

super.onActivityResult(requestCode, resultCode, data);

}
2、SecondActivity 類中的代碼:
這個裡面的RESULT_CODE、intent分別跟上段代碼中onActivityResult()方法中的第二個、第三個參數相對應。

final int RESULT_CODE=101;

public void closeButton(View view) {

Intent intent=new Intent();

intent.putExtra("second", "I am second!");

setResult(RESULT_CODE, intent);

finish();

}
3、除此之外,onActivityResult()方法中的第二個參數resultCode還有系統自帶的一些參數,也就是說,如果我們啟動的intent是隱式意圖,那麼可以用Activity類中RESULT_OK來表示操作已經順利結束。
例如,調用系統圖庫的返回,請看代碼:

final int CROP_PIC_REQUESTCODE = 23;
final int SELECT_PICTURE = 21;

if (resultCode == RESULT_OK && requestCode == SELECT_PICTURE) {

System.out.println("調用圖庫返回,關閉activity");

Intent intent1 = new Intent("com.android.camera.action.CROP");

intent1.setDataAndType(data.getData(), "image/*");

intent1.putExtra("crop", "true");

intent1.putExtra("aspectX", 1);

intent1.putExtra("aspectY", 1);

intent1.putExtra("outputX", 80);

intent1.putExtra("outputY", 80);

intent1.putExtra("return-data", true);

startActivityForResult(intent1, CROP_PIC_REQUESTCODE);

}
當然,我們還可以看下源碼中還有哪些類似RESULT_OK的。

/** Standard activity result: operation canceled. */

public static final int RESULT_CANCELED = 0;

/** Standard activity result: operation succeeded. */

public static final int RESULT_OK = -1;

/** Start of user-defined activity results. */

public static final int RESULT_FIRST_USER = 1;
總結:本來我只是想使用一下顯示intent啟動Activity的方式,後來我又自己擴展了隱式intent啟動Activity。
總之,碰到問題,要多思考,不要拘泥在一個點上,這樣自己才會真正的進步。
如果大家有什麼更好的建議和看法,一定要提出來,互相切磋,共同進步是我們技術宅最大的願望啊,很高興和大家分享!

我的世界和迷你世界誰抄襲誰,我告訴你迷你狗給我好好的看

你皮任你皮,你皮任你皮,就不玩迷你,你抄任你抄,我吃mc大蛋糕。
「警方」逮捕了只迷你狗,對盜取mc源代碼的事實,供認不諱!

《迷你世界》在2015年前,就看上了《我的世界》,這款游戲的大蛋糕,其游戲的自由度,玩法,很是新穎;迷你狗抄襲mc,連源代碼都抄了,而臭不要臉的編造出迷你老頭的謠言,為的是與mc抗衡,這難道不是盜版要騎在正版游戲的頭上嗎,這不就是謀朝篡位么;2016年之前,mc在中國大陸沒有代理廠商,直到後來網易代理了《我的世界。中國版》。

《迷你世界》由於Q版、可愛等畫風,吸引大量小學生玩家,嚴重影響小學生的學習與三觀,無法認清事實的真相,愚昧的認為《我的世界》是後來者,或許,你們都還在穿開襠褲,《我的世界》就已經來到了這個世界。
迷你老頭的疑點
一、2007年,國產游戲開發有多爛,大家都是心知肚明的,能力那麼強,怎麼不早崛起啊。
二、連這個老頭姓什麼,叫什麼都不知道。
三、這個老頭都快死翹翹了,還會用電腦,還會做游戲開發,還會敲代碼,怕是筷子都拿不動了吧。
四、游戲開發,不是一個人的能力所能及的,需要大量的技術人員,團隊合作研發的,而且是在技術爛,技術緊缺的年代;且你說2007年就研發成功,在技術緊缺的年代,游戲的要發周期大致為5-10年,1997年,紅白機的時代知道?
五、為何他的後代發現了。
六、裡面的模型和源代碼,為何源代碼是mc的,難道老頭死而復生,又做了mc?還有這老頭真是世界上,絕無僅有的技術宅,又會建模,又會編程,還會繪圖,還是頂級配樂師,哇,真的有這牛的人,他死了全世界的人不給他燒香,不給他祭奠?醒醒吧,說謊都不經過邏輯,不會打草稿,就繼續玩你的迷你屎界吧!
你皮任你皮,把你當瓜皮,你卡任你卡,我有胡麗亞↑

⑩ 嵌入式新手入門最佳視頻教程

原文鏈接:網頁鏈接

我是1999年上的大學,物理專業。在大一時,我們班裡普遍彌漫著對未來的不安,不知道學習了物理後出去能做什麼。你當下的經歷、當下的學習,在未來的一天肯定會影響到你。畢業後我們也各自找到了自己的職業:出國深造轉行做金融、留校任教做科研、設計晶元、寫程序、創辦公司等等,這一切都離不開在校時學到的基礎技能(數學、IT、電子電路)、受過煅煉的自學能力。

所以,各位正在迷茫的在校生,各位正在嘗試轉行的程序員,未來一定有你的位置,是好是壞取決於你當下的努力與積累。

我不能預言幾年後什麼行業會熱門,也不能保證你照著本文學習可以發財。我只是一個有十幾年經驗的程序員,給對編程有興趣的你,提供一些建議。

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核心源代碼情景分析》,此書分上下冊,巨厚無比。當作字典看即可:想深入理解某方面的知識,就去看某章節。

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


基於快速入門,上手工作的目的,您先不用看上面的書,先按本文學習。


2.1 入門路線圖

假設您是零基礎,我們規劃了如下入門路線圖。前面的知識,是後面知識的基礎,建議按順序學習。每一部分,不一定需要學得很深入透徹,下面分章節描述。

2.2 學習驅動程序之前的基礎知識

2.2.1 C語言

只要是理工科專業的,似乎都會教C語言。我見過很多C語言考試90、100分的,一上機就傻了,我懷疑他們都沒在電腦上寫過程序。

理論再好,沒有實踐不能幹活的話,公司招你去幹嘛?

反過來,實踐出真知,學習C語言,必須練練練、寫寫寫!

當你掌握基本語法後,就可以在電腦上練習一些C語言習題了;

當你寫過幾個C程序後,就可以進入下一階段的裸機開發了。


①不需要太深入

作為快速入門,只要你會編寫「Hello, world!」,會寫冒泡排序,會一些基礎的語法操作,暫時就夠了。

指針操作是重點,多練習;

不需要去學習過多的數據結構知識,只需要掌握鏈表操作,其他不用學習,比如:隊列、二叉樹等等都不用學;不需要去學習任何的函數使用,比如文件操作、多線程編程、網路編程等等;這些知識,在編寫Linux應用程序時會用,但是在操作系統特別是驅動學習時,用不著!

永往直前吧,以後碰到不懂的C語言問題,我們再回過頭來學習。

在後續的「裸機開發」中,會讓你繼續練習C語言,那會更實戰化。

C語言是在寫代碼中精進的。


②可以在Visual Studio下學習,也可以在Linux下學習,後者需要掌握一些編譯命令,我們暫時沒有提供C語言的教程,找一本C語言書,網上找找免費的C語言視頻(主要看怎麼搭建環境),就可以自學了。


2.2.2 PC Linux基本操作:

對於PC Linux,我們推薦使用Ubuntu,在它上面安裝軟體非常簡便。

我們的工作模式通常是這樣:在Windows下閱讀、編寫代碼,然後把代碼上傳到PC Linux去編譯。實際上,Ubuntu的桌面系統已經很好用了,我們拿到各種智能機可以很快上手,相信Ubuntu的桌面系統也可以讓你很快上手。為了提高工作效率,我們通常使用命令行來操作Ubuntu。


不用擔心,你前期只需要掌握這幾條命令就可以了,它們是如此簡單,我乾脆列出它們:

①cd : Change Directory(改變目錄)

cd 目錄名 // 進入某個目錄cd .. // cd 「兩個點」:返回上一級目錄cd - // cd 「短橫」:返回上一次所在目錄

②pwd : Print Work Directory(列印當前目錄 顯示出當前工作目錄的絕對路徑)

③mkdir : Make Directory(創建目錄)

mkdir abc // 創建文件夾abc
mkdir -p a/b/c // 創建文件夾a,再a下創建文件夾b,再在b下創建文件夾c

④rm : Remove(刪除目錄或文件)

rm file // 刪除名為file的文件
rm -rf dir // 刪除名為dir的目錄

⑤ls : List(列出目錄內容)

⑥mount : 掛載

mount -t nfs -o nolock,vers=2 192.168.1.123:/work/nfs_root /mnt
mount -t yaffs /dev/mtdblock3 /mnt

⑦chown : Change owner(改變文件的屬主,即擁有者)

chown book:book /work -R //對/work目錄及其下所有內容,屬主改為book用戶,組改為book

⑧chmod : Change mode(改變許可權),下面的例子很簡單粗暴

chmod 777 /work -R // 對/work目錄及其下所有內容,許可權改為可讀、可寫、可執行

⑨vi : Linux下最常用的編輯命令,使用稍微復雜,請自己搜索用法。


要練習這些命令,你可以進入Ubuntu桌面系統後,打開終端輸入那些命令;或是用SecureCRT、putty等工具遠程登錄Ubuntu後練習。


2.2.3 硬體知識

我們學習硬體知識的目的在於能看懂原理圖,看懂通信協議,看懂晶元手冊;不求能設計原理圖,更不求能設計電路板。

對於正統的方法,你應該這樣學習:

①學習《微機原理》,理解一個計算機的組成及各個部件的交互原理。

②學習《數字電路》,理解各種門電路的原理及使用,還可以掌握一些邏輯運算(與、或等)。

③《模擬電路》?好吧,這個不用學,至少我在工作中基本用不到它,現在全忘光了。


就我個人經驗來說,這些課程是有用的,但是:

①原理有用,實戰性不強。

比如《微機原理》是基於x86系統,跟ARM板子有很大差別,當然原理相通。

我是在接觸嵌入式編程後,才理解了這些課程。

②每本書都那麼厚,內容都很多,學習時間過長,自學有難度。


針對這些校園教材的不足,並結合實際開發過程中要用到的知識點,我們推出了《學前班_怎麼看原理圖》的系列視頻:

學前班第1課第1節___怎麼看原理圖之GPIO和門電路.wmv

學前班第1課第2.1節_怎麼看原理圖之協議類介面之UART.wmv

學前班第1課第2.2節_怎麼看原理圖之協議類介面之I2C.wmv

學前班第1課第2.3節_怎麼看原理圖之協議類介面之SPI.wmv

學前班第1課第2.4節_怎麼看原理圖之協議類介面之NAND Flash.wmv

學前班第1課第2.5節_怎麼看原理圖之協議類介面之LCD.wmv

學前班第1課第3節___怎麼看原理圖之內存類介面.wmv

學前班第1課第4.1節_怎麼看原理圖之分析S3C2410開發板.wmv

學前班第1課第4.2節_怎麼看原理圖之分析S3C2440開發板.wmv

學前班第1課第4.3節_怎麼看原理圖之分析S3C6410開發板.wmv


即使你只具備初中物理課的電路知識,我也希望能通過這些視頻,讓你可以看懂原理圖,理解一些常見的通信協議;如果你想掌握更多的硬體知識,這些視頻也可以起個索引作用,讓你知道缺乏什麼知識。


這些視頻所講到的硬體知識,將在《裸板開發》系列視頻中用到,到時可以相互對照著看,加深理解。


2.2.4 要不要專門學習Windows下的單片機開發

很多學校都開通了單片機的課程,很多人都是從51單片機、AVR單片機,現在比較新的STM32單片機開始接觸嵌入式領域,並且使用Windows下的開發軟體,比如keil、MDK等。

問題來了,要不要專門學習Windows下的單片機開發?

①如果這是你們專業的必修課,那就學吧

②如果你的專業跟單片機密切相關,比如機械控制等,那就學吧

③如果你只是想從單片機入門,然後學習更廣闊的嵌入式Linux,那麼放棄在Windows下學習單片機吧!


理由如下:

①Windows下的單片機學習,深度不夠

Windows下有很好的圖形界面單片機開發軟體,比如keil、MDK等。

它們封裝了很多技術細節,比如:

你只會從main函數開始編寫代碼,卻不知道上電後第1條代碼是怎麼執行的;

你可以編寫中斷處理函數,但是卻不知道它是怎麼被調用的;

你不知道程序怎麼從Flash上被讀入內存;

也不知道內存是怎麼劃分使用的,不知道棧在哪、堆在哪;

當你想裁剪程序降低對Flash、內存的使用時,你無從下手;

當你新建一個文件時,它被自動加入到工程里,但是其中的機理你完全不懂;

等等等。


②基於ARM+Linux裸機學習,可以學得更深,並且更貼合後續的Linux學習。實際上它就是Linux下的單片機學習,只是一切更加原始:所有的代碼需要你自己來編寫;哪些文件加入工程,需要你自己來管理。

在工作中,我們當然傾向於使用Windows下更便利的工具,但是在學習階段,我們更想學習到程序的本質。


一切從零編寫代碼、管理代碼,可以讓我們學習到更多知識:

你需要了解晶元的上電啟動過程,知道第1條代碼如何運行;

你需要掌握怎麼把程序從Flash上讀入內存;

需要理解內存怎麼規劃使用,比如棧在哪,堆在哪;

需要理解代碼重定位;

需要知道中斷發生後,軟硬體怎麼保護現場、跳到中斷入口、調用中斷程序、恢復現場;

你會知道,main函數不是我們編寫的第1個函數;

你會知道,晶元從上電開始,程序是怎麼被搬運執行的;

你會知道,函數調用過程中,參數是如何傳遞的;

你會知道,中斷發生時,每一個寄存器的值都要小心對待;

等等等。


你掌握了ARM+Linux的裸機開發,再回去看Windows下的單片機開發,會驚呼:怎麼那麼簡單!並且你會完全明白這些工具沒有向你展示的技術細節。


驅動程序=Linux驅動程序軟體框架+ARM開發板硬體操作,我們可以從簡單的裸機開發入手,先掌握硬體操作,並且還可以:

①掌握如何在PC Linux下編譯程序、把程序燒錄到板子上並運行它

②為學習bootloader打基礎:掌握了各種硬體操作後,後面一組合就是一個bootloader


2.2.5 為什麼選擇ARM9 S3C2440開發板,而不是其他性能更好的?

有一個錯誤的概念:S3C2440過時了、ARM9過時了。

這是不對的,如果你是軟體工程師,無論是ARM9、ARM11、A8還是A9,對我們來說是沒有差別的。

一款晶元,上面有CPU,還有眾多的片上設備(比如UART、USB、LCD控制器)。我們寫程序時,並不涉及CPU,只是去操作那些片上設備。

所以:差別在於片上設備,不在於CPU核;差別在於寄存器操作不一樣。

因為我們寫驅動並不涉及CPU的核心,只是操作CPU之外的設備,只是讀寫這些設備的寄存器。

之所以推薦S3C2440,是因為它的Linux學習資料最豐富,並有配套的第1、2期視頻。


2.2.6 怎麼學習ARM+Linux的裸機開發

學習裸機開發的目的有兩個:

①掌握裸機程序的結構,為後續的u-boot作準備

②練習硬體知識,即:怎麼看原理圖、晶元手冊,怎麼寫代碼來操作硬體


後面的u-boot可以認為是裸機程序的集合,我們在裸機開發中逐個掌握各個部件,再集合起來就可以得到一個u-boot了。

後續的驅動開發,也涉及硬體操作,你可以在裸機開發中學習硬體知識。


注意:如果你並不關心裸機的程序結構,不關心bootloader的實現,這部分是可以先略過的。在後面的驅動視頻中,我們也會重新講解所涉及的硬體知識。


推薦兩本書:杜春蕾的《ARM體系結構與編程》,韋東山的《嵌入式Linux應用開發完全手冊》。後者也許是國內第1本涉及在PC Linux環境下開發的ARM裸機程序的書,如果我說錯了,請原諒我書讀得少。


對於裸機開發,我們提供有2部分視頻:

①環境搭建

第0課第1節_剛接觸開發板之介面接線.wmv

第0課第2節_剛接觸開發板之燒寫裸板程序.wmv

第0課第3節_剛接觸開發板之重燒整個系統.wmv

第0課第4節_剛接觸開發板之使用vmwae和預先做好的ubuntu.wmv

第0課第5節_剛接觸開發板之u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第6節_剛接觸開發板之內核u-boot打補丁編譯使用及建sourceinsight工程.wmv

第0課第7節_剛接觸開發板之製作根文件系統及初試驅動.wmv

第0課第8節_在TQ2440,MINI2440上搭建視頻所用系統.wmv

第0課第9節_win7下不能使用dnw燒寫的替代方法.wmv


.................

原文鏈接:網頁鏈接

熱點內容
esr演算法 發布:2025-05-17 08:16:09 瀏覽:194
安卓手機怎麼用擬我表情 發布:2025-05-17 08:10:13 瀏覽:918
給U盤安裝kalilinux 發布:2025-05-17 08:07:26 瀏覽:249
sql提示存儲過程 發布:2025-05-17 07:35:58 瀏覽:743
qq里的互動訪問 發布:2025-05-17 07:26:53 瀏覽:665
口語易賬號密碼發送到哪裡 發布:2025-05-17 07:26:52 瀏覽:62
核桃編程幼兒 發布:2025-05-17 07:26:50 瀏覽:787
2台伺服器集群搭建 發布:2025-05-17 07:18:57 瀏覽:185
北方園林配置植物有哪些 發布:2025-05-17 07:18:20 瀏覽:544
數控加工零件圖及編程 發布:2025-05-17 07:18:11 瀏覽:730