當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]嵌入式Linux跟桌面Linux一樣,是一個操作系統(tǒng)。從單片機走過來的童鞋往往習(xí)慣于直接控制寄存器,事必躬親,從零開始實現(xiàn)想要的功能。而在嵌入式Linux的世界里,我們首先要拋

嵌入式Linux跟桌面Linux一樣,是一個操作系統(tǒng)。從單片機走過來的童鞋往往習(xí)慣于直接控制寄存器,事必躬親,從零開始實現(xiàn)想要的功能。而在嵌入式Linux的世界里,我們首先要拋棄這個思想,應(yīng)把它作為最后沒辦法的辦法。
就像我們想要在windows系統(tǒng)中編寫一個程序,首先想到的不是操作CPU芯片的寄存器,而是學(xué)習(xí)Windows API一樣。我們在嵌入式linux編程時,首先想到的應(yīng)該是使用現(xiàn)成的驅(qū)動或軟件或Linux API。沒有的話看看能不能修改一下現(xiàn)成的資源為己所用。還是不行的話才考慮自己從頭開始寫。
嵌入式Linux大廈是由很多層組成的,當(dāng)我們想找一個人時,首先要明確他在那一層樓。同樣的,我們遇到問題時,首先要知道是哪個方面的問題,然后才有可能知道到哪里尋找答案。下面我們把這座大廈進行一下拆解。
我們平時使用Linux系統(tǒng)的話,最常用的工具就是Shell(或者用windows中常見的說法:命令行),初學(xué)者接觸Linux的第一個東西往往也是shell。也許你已經(jīng)知道,把shell命令組合起來寫成一個文件,亦即shell編程,也是一門大學(xué)問,它能做的事很多很強大,但僅限于對Linux系統(tǒng)的操作。
我們一定不會用shell命令去編寫一個顯示屏程序,或者一個GPS導(dǎo)航程序。而且作為嵌入式Linux開發(fā)來說,shell不可能作為最終產(chǎn)品工作的平臺,因為我們不能要求用戶在屏幕中輸入代碼來實現(xiàn)功能。因此我認(rèn)為對嵌入式開發(fā)來說,shell命令無需深究,掌握基本操作就夠了。
shell基本操作主要包括:獲取命令幫助,到達指定目錄,查看目錄內(nèi)容,權(quán)限修改,文件的復(fù)制粘貼等基本操作,文件搜索,文件內(nèi)容查看和編輯,系統(tǒng)關(guān)機重啟……(這些只是最基本的,后面再慢慢學(xué)別的命令,比如學(xué)習(xí)進程編程時,再學(xué)習(xí)進程相關(guān)的命令;學(xué)習(xí)C語言編程時,再學(xué)各種編譯和調(diào)試命令也不遲)
學(xué)習(xí)嵌入式Linux,我們的最終目的是制作一套嵌入式系統(tǒng)來實現(xiàn)功能。往往需要用C/C++或Python等其他語言來編寫程序,但是編程之前我們要先明確一些基本概念。
最基本的,當(dāng)我們編寫程序時,首先要明確嵌入式Linux分為用戶空間和內(nèi)核空間。用戶空間是應(yīng)用程序運行的空間,內(nèi)核空間就是操作系統(tǒng)和驅(qū)動程序運行的空間。這是從軟件的角度來說的,對應(yīng)于ARM芯片來說,就是芯片的不同“工作模式”。這兩個空間是通過“地理隔離”實現(xiàn)互相完全獨立的,它們各自的程序使用不同的內(nèi)存地址區(qū)間,各自使用自己的頭文件(有些頭文件在兩個空間內(nèi)甚至是重名的,要注意區(qū)分)、各自調(diào)用屬于自己空間的函數(shù)(哪怕實現(xiàn)的功能相同,比如printf()和printk()),而且不能互相直接訪問(用指針也不行)。(意味著學(xué)習(xí)這兩部分的編程時要學(xué)習(xí)兩套獨立的知識體系)
內(nèi)核空間相關(guān)的東西有:Linux內(nèi)核源碼、內(nèi)核編譯和配置、內(nèi)核移植、文件系統(tǒng)、Busybox、設(shè)備驅(qū)動程序編寫、中斷編程……
用戶空間相關(guān)的東西有:Shell、應(yīng)用程序編譯和調(diào)試、進程、線程、文件IO編程、網(wǎng)絡(luò)通信相關(guān)、Qt圖形界面編程……
如果你僅僅要開發(fā)應(yīng)用程序,那你就可以遠離內(nèi)核空間那些東西了。對你來說,驅(qū)動程序、底層硬件、操作系統(tǒng)的工作方式等都是透明的,你寫的程序在別的芯片上也能跑得很好。
但如果你想要開發(fā)驅(qū)動程序,或者定制自己的操作系統(tǒng),或者你想向一片“全裸”芯片中寫入操作系統(tǒng),并使它正常運行起來,那就得學(xué)習(xí)內(nèi)核空間的知識了。
如果你想讓“全裸”芯片運行起來,還會遇到一塊比內(nèi)核更底層的東西,Bootloader。它是在內(nèi)核啟動前運行的一段程序,用來初始化硬件、建立內(nèi)存空間映射等,與芯片的品牌、型號極其相關(guān)。我們通常對一些現(xiàn)成的Bootloader進行修改來滿足需求,常見的Bootloader有U-Boot、Vivi等。
再多說一句,如果想從零開始做一個嵌入式設(shè)備,還有更底層的問題需要解決和學(xué)習(xí):電路設(shè)計、PCB布線等。
因此,我們看到的嵌入式Linux書籍就可以粗略分成兩個方向:一類講嵌入式Linux應(yīng)用程序編程,另一類講如何搭建一個完整的嵌入式Linux平臺。分別對應(yīng)的就是用戶空間和內(nèi)核空間的事情。
雖然用戶空間和內(nèi)核空間是獨立的,但就像Windows提供了API,允許我們對系統(tǒng)進行操作一樣,用戶空間的程序也可以通過系統(tǒng)調(diào)用來訪問內(nèi)核(就是一些的C語言函數(shù))。但由于系統(tǒng)調(diào)用非常基礎(chǔ),所以有時使用起來很麻煩。比如說一個簡單的給變量分配內(nèi)存空間的操作,就需要動用多個系統(tǒng)調(diào)用。Linux定義一些庫函數(shù)(API)來將系統(tǒng)調(diào)用組合成某些常用的功能,以方便我們編程(同樣是C語言函數(shù))。因此,我們在讀別人的程序時,就要區(qū)分其中的函數(shù)是系統(tǒng)調(diào)用,還是庫函數(shù),還是C/C++標(biāo)準(zhǔn)庫中的函數(shù),還是用戶自己定義的函數(shù)。如果是前三者,就可以到各個地方搜索相應(yīng)的資料,這樣學(xué)習(xí)起來就快很多。
那么shell程序和我們用C/C++編寫的程序有什么區(qū)別呢?事實上,我們在shell中寫的每一個命令,都對應(yīng)了一個程序,在程序內(nèi)部就是通過調(diào)用各種API來實現(xiàn)相應(yīng)功能的。因此用shell能實現(xiàn)的功能,理論上都能用C語言實現(xiàn)。
作為嵌入式Linux開發(fā)初學(xué)者,簡單熟悉了shell以后,就可以開始進行一些C語言編程的嘗試了。
我們最早接觸編程一般都是在大學(xué)的編程課上,而且往往用的是Visual C++ 6.0。竊以為這是讓我對編程原理長期困惑不解的罪魁禍?zhǔn)?!啥是環(huán)境變量?為啥要設(shè)置include路徑,lib路徑?為啥一點編譯按鈕就會出來那么多后綴名不同的文件?這些很基礎(chǔ)很重要的問題都被VC6.0這個外殼掩蓋了。但哪怕你在Linux中使用gcc編譯一個最簡單程序,一定就會像我一樣馬上明白把一個.c的源文件變成一個可執(zhí)行文件,中間究竟發(fā)生了什么事情。如果你再用gdb調(diào)試一個程序,就會明白得更多一點。
關(guān)于C/C++編程的基本工具,我們需要學(xué)習(xí)的有:vim等代碼編輯器、diff等文件比較的shell命令、gcc等編譯器、gdb等調(diào)試工具、交叉編譯等。這里需要特別提到一個重要工具(網(wǎng)站):github,根據(jù)百度的解釋,它是一個“分布式的版本控制系統(tǒng)”,初學(xué)者還用不到版本控制,那就可以單純把它當(dāng)成一個開放的源代碼庫。這個網(wǎng)站里有大量優(yōu)秀的源代碼供學(xué)習(xí)和使用。
學(xué)習(xí)了基本的編程方法,我們就該接觸Linux的API等內(nèi)容了。畢竟,我們的嵌入式系統(tǒng)要與設(shè)備進行交互,只用C/C++標(biāo)準(zhǔn)庫是不夠的。在此之前,需要建立一個Linux的重要概念:一切皆文件。甚至硬件設(shè)備對Linux系統(tǒng)來說,也是文件。這樣對設(shè)備的操作就等同于對文件進行讀、寫,或讀寫以外的操作。這部分內(nèi)容在各種書籍資料中通常以“文件IO編程”命名,作為一個章節(jié)來寫。我覺得這是應(yīng)當(dāng)?shù)谝粋€來學(xué)的東西,因為看到自己能隨意操控文件和外設(shè)是一件讓人很振奮的事情!成就感是繼續(xù)學(xué)習(xí)的一大動力!
另外一個重要內(nèi)容是,理解進程和線程。通過學(xué)習(xí)這個部分,能管中窺豹地大致領(lǐng)略到Linux系統(tǒng)如何進行調(diào)度,你的程序是怎么在Linux中運行的。這是操作系統(tǒng)原理的內(nèi)容,但作為非軟件專業(yè)出身的人,沒辦法,只能自學(xué)了。
其他應(yīng)用程序編程如網(wǎng)絡(luò)編程、Qt圖形編程等就不一一說明了。
驅(qū)動程序可能是我們將來接觸內(nèi)核空間遇到的第一個內(nèi)容。不過暫時還沒什么特別想說的。內(nèi)核空間距離初學(xué)者還是有點遠的……以后再來學(xué)這部分內(nèi)容。0次

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉