熟練掌握C/C++,熟悉Linux/Windows操作系統,對于OS的軟、硬件資源的分配、任務調度,控制、協調并發活動有較深的研究。熟悉TCP/IP及無線網絡(Zigbee、Wi-Fi、藍牙、2/3/4G)協議,熟悉TCP/IP、USB、串口、SPI協議的處理;行業的需求帶動人才的發展,越來越多的人選擇嵌入式技術,今天我們來談談嵌入式Linux的入門。
一、系統環境
1、環境搭建
開發嵌入式需要大量輔助軟件,一般來說,我們是在電腦上開發好程序,然后通過某些方式將程序下載到開發板上運行。按這個順序列出一些我認為必須的:
Linux系統:主要作為程序開發的系統,選擇多人使用并資源豐富的版本,建議ubuntu或fedora,目前我使用ubuntu。可以使用在虛擬機或物理機上。
虛擬機:有條件的推薦使用物理機安裝,但一般經常使用vmware這類虛擬機軟件,通過這個軟件安裝ubuntu系統,然后設置共享。然后在這個系統上交叉編譯。
共享方式:有的人喜歡用vmware自帶共享功能,有的人喜歡用samba共享。個人建議在ubuntu中設置samba共享,這樣可以在windows上將ubuntu共享目錄映射成為其中一個盤符,這樣做,就可以在windows下操作linux系統的目錄、文件了,不過前提是需要網絡性能良好。另一種常見的共享方式是nfs,多用于主機和開發板之間的文件傳輸。
開發IDE:有的人建議在linux系統中用vim或emacs,但作為初學者入門,不要如此,使用vim、emacs學習成本高,而會打擊積極性。在samba共享情況下,建議使用Notepad++、source insight進行代碼編譯。
交叉編譯:交叉編譯是嵌入式一個很重要的概念。由于我們編譯的程序是在開發板(開發板又稱目標板)上運行的,但開發板又沒有環境進行編譯,所以帶出“交叉編譯”概念。即在一臺linux主機系統上使用交叉編譯器對代碼進行編譯,但編譯得到的二進制文件無法在該主機運行,只能在開發板上運行。不同的板子使用的交叉編譯器不同。一般使用商家自帶的交叉編譯器。
下載手段:根據應用場合,可以用jtag燒錄器下載程序(適用如u-boot開發)。可以使用tftp方式下載程序(適用kernel開發)。在開發板系統啟動后且網絡正常情況下,可以使用tftp下載、nfs拷貝等方式進行調試(適用于應用層程序開發)。
另外對于USB轉串口線、網絡這類的東西,就不一一詳細說明了。
掌握程度:不同人使用的開發環境不盡相同。原則上只要是自己熟悉的環境就可以了,以提高開發效率為準則。
推薦軟件:vmware、notepad++、source insight、tftpd32(均為windows系統軟件)。
2、系統使用
工欲善其事,必先利其器。系統環境使用熟悉程度越高,越能提高開發速度。舉個例了,曾經遇到過別人在設備上調試應用程序,步驟是:編碼、編譯、制作軟件包、用工具升級軟件包到設備上,設備上電看效果。這一系列步驟中,制作包、升級軟件包耗時很長,對于調試十分不利。如果使用NFS,時間能省至少三分之二。所以說,環境的熟悉是十分重要和必要的。
這里主要針對Linux系統,對于入門者而言,Linux系統的使用是一個大坎。但要知道,嵌入式開發是離不開linux系統的,是必須學的。目前網絡資料十分廣泛,幾乎遇到的問題都在找到答案,但質量往往良莠不齊,有些甚至會誤導人。因此,建議一邊學一邊做筆記,把自己的疑問、心得、步驟都記錄下來(比如,記錄第1小節提到的nfs、samba服務安裝的步驟)。
如果時間允許,最好找書本來學習,邊看書邊敲命令。因為書籍介紹比較系統,有利于了解全貌,再逐個知識點深入,做到胸有成竹。下面列一下需要學習的知識點。
1、掌握常用命令。必須要學的命令不多,像查看文件、拷貝文件、創建文件、查找文件、顯示日期、查看/修改IP,等等。這些常用命令只要使用次數多了,就能熟練掌握。具體的自行搜索。
2、掌握軟件安裝步驟。一般linux系統發行版自帶有安裝工具,如unbutu,在聯網情況下直接輸入命令apt-get install tool-name,就能安裝了。
3、編譯源碼方式安裝軟件。有些工具提供源碼需要自己進行編譯(比如要在開發板上運行的程序,則無法通過apt-get來安裝,需要交叉編譯)。linux編譯一般有三個步驟:
l配置:./configure
l編譯:make
l安裝:make install。
這個知識點請大家自行百度吧,這里由于篇幅原因就不細說了。
4、了解linux文件系統、目錄結構、設備文件。如根目錄名稱是“/”,配置文件一般位于/etc目錄,運行程序一般位于/bin、/sbin、/usr/bin、/usr/sbin,等等。因為嵌入式涉及到根文件系統概念,因而需要對linux目錄結構有了解。如果感興趣,可以去搜索一下LFS。
5、學習IO重定向、管道概念,學習并會寫簡單shell腳本。
6、學習編輯器vi的簡單使用(因為有些情況下只有這個編輯器可用)、編譯器gcc用法、Makefile知識、gdb調試。(此項針對開發而言)
學習建議:
1、看書、網絡搜索
2、學會man命令(這是linux內置的幫助命令,比如要了解cp命令的用法,則輸入man cp)
3、記錄筆記
二、應用層
1、C/C++語言
C/C++語言本身與具體平臺相關不大,但必須結合具體環境平臺才能展現其作用。比如,MFC使用C/C++,QT也使用C/C++,Linux內核中使用C,單片機使用C,等等。環境不同,其側重點不同。在學校里學習C/C++語法,考完試,卻沒有結合實際項目編程,就有人糾結學了C/C++不懂能做什么。只有真正在某一領域使用了C語言,它才是一個可以看得見、摸得著的東西,而不再是抽象的。
這里結合Linux系統,列舉出一些要掌握、學習的知識點。
1、linux系統編程基本概念:Makefile、gcc、gdb。
2、文件IO操作。
3、進程控制、進程間通信、多線程操作
4、信號處理
5、網絡編程
6、串口編程
另外也列舉C/C++語言的學習點:
1、標準庫
輸入輸出(fprintf、sscanf)、文件操作(fopen、fclose)、字符類操作(isalpha、islower)、字符串操作(strcpy、strcmp、memcpy)、信號處理(signal)、日期時間(mktime、ctime)
2、C++ STL
向量vector、隊列queue、棧stack、列表list。
推薦網站:http://www.cplusplus.com/reference/
下面列出一些我認為較好的書籍。每種類型的書籍應用場合不同,按需求學習。——不僅嵌入式Linux領域,其它很多領域同時需要C,因而要提高C技能。
入門篇:
《Linux C 編程一站式學習》
《Linux C從入門到精通》
《Linux C編程從初學到精通》
《Linux C編程實戰》
《嵌入式linux應用開發完全手冊》 (該書對嵌入式Linux開發整體都有講述,一書以看窺全貌,入門適用)
學習路線:
環境:安裝虛擬機linux,配置好samba,有windows下用notepad++編寫代碼,然后在命令行使用gcc編譯并運行。像ubuntu安裝必要開發工具sudo apt-get install build-essential 這類的知識點本文就不涉及了。
實踐:首先了解linux下gcc編譯基本概念,然后逐個知識點學習。以上每點均是一個知識塊,需要手動寫代碼。建議在github上建立倉庫,形成自己的代碼庫,方便日后使用。
2、版本控制
版本控制可以提高開發效率,目前很多公司使用svn或git進行代碼管理,很多開源項目——包括kernel,都使用git來管理。對于不涉密的代碼,推薦使用github托管,而不便公開的代碼,可以在bitbucket上托管。養成保存代碼的習慣很重要。筆者很多年前沒有代碼托管意識,一次電腦被偷,導致很多代碼消失了,如今想找也想不回來了。
版本控制學習成本不大,無非創建倉庫、提交代碼這些過程,結合日常編碼練習,慢慢熟悉掌握即可。
3、腳本
Linux系統的腳本語言有很多,使用場合也不同,主要目的是提高開發效率。比如:在shell腳本中完成代碼的編譯并拷貝到nfs共享目錄(或tftp服務目錄)。這樣只需要執行腳本就完成多項工作,節省很多時間。
4、界面開發
界面開發不是筆者強項,就寫一寫筆者的經歷。筆者接觸過的界面開發有QT、SDL、MFC。這些都是作為工具而存在的,不是專門研究,都是工作需要時再去學習,邊學習邊實踐。
比如,做一個視頻采集的軟件,使用了SDL進行顯示。
比如,為了顯示YUV格式的文件,使用MFC編寫一個播放器。
5、其它書籍推薦
內功修煉篇:
《程序員的自我修養——鏈接、裝載與庫》(偏底層的人建議看看)
《高效程序員的45個習慣敏捷開發修煉之道》
《高質量程序設計指南》(建議看看,工作中編寫代碼一定要注意編碼規范,否則維護難度太大)
《Linux開發工具箱:項目開發的最有效途徑》(對應英文版本《The Linux Programmer's Toolbox》,網絡有資源)
(注:入門級別書籍不建議購買,通過網絡資源或去圖書館借書等手段來學習就行了。當然經濟條件允許的除外)
三、底層
這里說的底層包括三大方面,這三大方面缺一不可。
bootloader:作為上電運行的第一個程序,負責最原始的初始化操作,初始化芯片、初始化內存、初始化IO復用,讀取內核代碼并將控制權移交到內核,從而完成使命。
kernel:提供基本的運行環境,提供外設操作控制接口。
rootfs:向用詞(應用層)提供基本操作環境,包括命令行、程序庫等。
1、bootloader(啟動裝載程序)
嵌入式Linux常見的bootloader是u-boot,而X86領域中一般稱為BIOS。u-boot的學習沒有捷徑,最好是在有ARM開發板情況下進行研究,通過打印信息的方法跟蹤其流程。但是,看懂u-boot代碼需要電路基本知識、芯片手冊知識等等。這些知識,同樣適用于內核驅動的開發。
首先要建立的是整體概念和認識。建議先把廠商提供的u-boot源碼編譯通過,并下載到開發板上看到正常結果后,再用串口打印信息搜索代碼,以了解u-boot的代碼流程。然后再慢慢研究。如果bootloader不是學習重點,在有一定概念前提下就可以跳過到內核驅動層了,不過就筆者經驗來看,bootloader和內核關系十分密切且部分代碼是相通的。
一般初始化的代碼是匯編代碼,對于入門者而言,初學階段不用追究,等有一定基礎后再回頭研究也不晚。
2、kernel(內核)
內核是比較大的一塊,涉及內容十分多。作為入門者,與u-boot類似,首先要建立的整體概念。先把廠商提供的內核源碼編譯通過,并下載到開發板上,串口會打印很多啟動信息,這些啟動信息能幫助我們學習內核,自己也可以在內核中打印語句,以了解其流程。
每一個平臺芯片不同,外設不同,內核均不同,需要進行移植。所謂的“移植”,就是找到合適的驅動,修改適應到該平臺的過程。比如,某平臺使用2個LCD屏,一個是3.5寸的,另一個是4.3寸的,這需要對內核進行修改。比如,這個平臺使用nand flash是1GB的,另一個平臺使用的是512MB的,也需要修改內核。其它如EEPROM、電源芯片、網卡,等等,均如此。
內核知識點分2部分,一是kernel本身的知識點,如內存管理機制(MMU)、時間管理、同步機制,等等。二是外設驅動,如LED燈、GPIO、按鍵。
初學者建議學習:
1、了解內核編譯的過程:配置內核、編譯uImage。
2、了解platform驅動模型(筆者文章有現成的模板,已經應用于很多個平臺上)。
3、了解一般外設驅動模型。建議從簡單的LED、GPIO入門。
高階知識點:
1、學習各種子系統,如MTD、USB、IIC、SPI、RTC、WDT。
2、學習內核知識,如延時隊列、時間管理,同步機制,等等。
3、rootfs(根文件系統)
一般情況下,開發板廠商會提供根文件系統,如果沒有,則可以自己編譯制作。一般嵌入式Linux使用busybox制作文件系統必要的程序、庫、配置文件。因為busybox編譯出來的內容體積小,節省空間,所以很多ARM開發板上都是用busybox的。另外還涉及到文件系統格式,像Yaffs2、ramfs、ext4、UBI,等等。
掌握程度:
1、知道系統啟動過程涉及到哪些腳本。知道上電啟動時如何添加自己程序啟動。
2、了解各目錄功能、存儲哪些文件(如改IP在哪個配置文件,動態庫在哪些目錄)。
四、其他知識
1、電路原理圖、datasheet
作為底層開發人員來說,能看懂硬件原理圖和datasheet是必要的一項技能。
看懂硬件原理圖,就可以知道這個系統上有什么器件,哪些器件有什么功能,如何連接(使用什么協議),提供什么接口。有了這些認知后,才會對系統有一個全局整體的認識掌握。對于開發人員來說絕對是有利的。
看懂datasheet,才能知道如何訪問器件,如何操作器件,了解其時序。
另外,對于嵌入式經常接觸到的如I2C協議,SPI協議等等的協議也要掌握。
掌握程度:不需要像硬件專業同學那樣學習數電、模電課程。但起碼掌握上升沿、下降沿的概念,知道高電平、低電平概念,懂得看I2C協議的時序圖。懂得如何找到datasheet中關鍵信息(寄存器說明、時序圖)。
學習路線:碎片時間多的人,建議在遇到不懂知識點時上網搜索學習。有條件的建議借書或買來學習。
五、入門路線
這里以偏重嵌入式Linux(ARM)驅動開發為例,給出一條入門的路線。
1、買一款使用廣泛、資料多的ARM開發板。因為使用的人多,你遇到的問題別人可能早就遇到并解決了,這樣能省很多時間,并且提高自信心。可以到某寶上看看板子。因為是學習使用,最好便宜又適用的。
2、使用vmware安裝一個ubuntu系統。在vmware軟件中設置物理橋接方式上網。在ubuntu設置好samba服務、nfs服務、tftp服務。
3、首先自己動手親自編譯u-boot、kernel,燒寫到板子上(注:有可能rootfs不提供源碼,而是提供img鏡像文件)。
4、自己修改kernel,并編譯busybox,燒寫到板子,在板子掛載NFS,在虛擬機交叉編譯一個Helloworld程序,并在板子上運行。
5、根據興趣,開始搗鼓:u-boot、kernel、應用層開發、QT開發。
5、選擇自己重點關注方面,繼續研究。
這個路線不一定要嚴格遵守時間軸。
六、補充
以上這些項,因不同人的基礎而異。像硬件專業的同學,數電、模電和電路圖已經掌握,就要加強C和Linux系統的學習。反之,計算機軟件專業的同學,就要去學習硬件知識。等等。
對于書籍,有的可能一下子無法理解,那是因為功力不到。有的可能覺得沒有用處,那是因為還沒有涉及此方面。比如,非計算專業的人看《編譯原理》,《操作系統原理》,《計算機體系結構》,肯定是看不懂的,而且初學者也不必要看。又比如,嵌入式有的領域使用到H264編碼、MPEG編碼,802.11、CDMA,如果不是進入有關行業的,也不必學習。另外網上很多人寫的嵌入式入門文章提到0.11內核版本、2.4內核版本的書,還有離散數字、算法導論的書,并不是都適用所有人。所以大家一定要量體裁衣,有多大胃口吃多少飯,有多大頭戴多大帽,根據自己已有的知識和所處的階段進行選擇。
另外要說明的是,很多知識點是密不可分的,且界線是很模糊的。比如應用層和底層。因為有時出現問題,并不知道具體哪里的問題,這就需要站在比較高的層面(系統視野)看問題,才會快速定位并解決問題。建議以某一方面為核心點,另一方面做了解掌握。如果有能力,最好都學。
一般情況下,嵌入式Linux沒有速成。但可以達到入門速成,根據個人能力,我認為大約半個月~2個月即可,不過入門后就要不斷學習和積累了,——這個積累,需要精力、時間的投入。
-
嵌入式
+關注
關注
5090文章
19176瀏覽量
307003 -
Linux
+關注
關注
87文章
11342瀏覽量
210182 -
操作系統
+關注
關注
37文章
6889瀏覽量
123625
原文標題:一位嵌入式er總結分享一些嵌入式Linux入門的步驟和經驗
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論