新聞中心
隨著物聯(lián)網(wǎng)技術(shù)的發(fā)展,嵌入式設(shè)備使用越來越廣泛。作為非常重要的嵌入式系統(tǒng)之一,嵌入式Linux在應(yīng)用中也越來越多。而嵌入式Linux系統(tǒng)中,多任務(wù)切換技巧是非常重要的一部分。在嵌入式Linux應(yīng)用開發(fā)中,如何實現(xiàn)高效的多任務(wù)切換,是開發(fā)者必須要面對和解決的問題。因此,本文將從以下幾個方面,詳細介紹嵌入式linux多任務(wù)切換技巧。

創(chuàng)新互聯(lián)服務(wù)項目包括江油網(wǎng)站建設(shè)、江油網(wǎng)站制作、江油網(wǎng)頁制作以及江油網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,江油網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到江油省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
之一部分,多任務(wù)機制簡介
在嵌入式Linux系統(tǒng)中,多任務(wù)機制是實現(xiàn)多任務(wù)切換的基礎(chǔ)。多任務(wù)機制可以讓多個任務(wù)在同一時間內(nèi)并行執(zhí)行,提高了系統(tǒng)的并發(fā)性能。因此,我們首先需要了解在嵌入式Linux系統(tǒng)中實現(xiàn)多任務(wù)的機制。
在嵌入式Linux系統(tǒng)中,有兩種實現(xiàn)多任務(wù)的機制:進程機制和線程機制。
進程機制是指將一個任務(wù)封裝成一個進程,一個進程可以獨立占用整個CPU資源,并擁有獨立的內(nèi)存空間等資源,進程與進程之間是互相隔離的。但進程之間的通信較為復(fù)雜,需要借助IPC機制實現(xiàn)。
線程機制是指將一個任務(wù)分解成若干個子任務(wù),每個子任務(wù)是一個線程,線程與線程之間共享進程內(nèi)的資源,例如內(nèi)存、文件和信號等。線程之間通信簡單,可以直接進行全局變量操作、信號量操作等,但線程的調(diào)度管理較為復(fù)雜。
在實際應(yīng)用中,進程機制和線程機制各有優(yōu)缺點,開發(fā)者也可以根據(jù)不同的應(yīng)用場景,選擇合適的多任務(wù)機制。
第二部分,多任務(wù)切換原理
在了解了多任務(wù)機制之后,我們接下來就需要了解多任務(wù)切換的原理。多任務(wù)切換是指CPU在處理多個任務(wù)時,按照一定的模式進行快速切換,使得所有任務(wù)看起來像是同時運行。
多任務(wù)切換的原理,可以分為兩個方面:系統(tǒng)調(diào)用和時鐘中斷。系統(tǒng)調(diào)用指應(yīng)用程序請求系統(tǒng)服務(wù)的過程,如讀、寫、打開文件等。而時鐘中斷,則指CPU在運行程序時,按照一定時間間隔產(chǎn)生中斷,以保證其他任務(wù)可以得到運行。
在嵌入式Linux系統(tǒng)中,每次中斷發(fā)生時,CPU會停止當(dāng)前正在執(zhí)行的任務(wù),轉(zhuǎn)而執(zhí)行中斷服務(wù)程序。中斷服務(wù)程序是預(yù)定義的,可以實現(xiàn)一些特定的功能,例如保存寄存器值,處理數(shù)據(jù)等。當(dāng)中斷服務(wù)程序執(zhí)行結(jié)束后,CPU會根據(jù)調(diào)度算法選擇一個合適的任務(wù)執(zhí)行。因為多任務(wù)切換的速度非???,所以用戶幾乎感覺不到任務(wù)之間的切換。
第三部分,多任務(wù)調(diào)度算法
在嵌入式Linux系統(tǒng)中,執(zhí)行多個任務(wù)時,需要根據(jù)多個任務(wù)的不同優(yōu)先級,確定哪個任務(wù)先執(zhí)行,哪個任務(wù)后執(zhí)行。因此,多任務(wù)調(diào)度算法的選擇和優(yōu)化是至關(guān)重要的。
常用的多任務(wù)調(diào)度算法有以下幾種:
1. 先來先服務(wù)(FIFO)算法,也叫作FCFS算法。該算法將任務(wù)按照到達順序排列,并按順序執(zhí)行。先進先出算法優(yōu)劣平衡,但難以對緊急任務(wù)作出及時相應(yīng)。
2. 時間片輪轉(zhuǎn)(RR)算法,在每個任務(wù)分配固定時間片,當(dāng)時間片用完后,該任務(wù)會被放置到隊列的末端等待下一次調(diào)度。時間片輪轉(zhuǎn)算法能夠保證所有任務(wù)在相同的等待時間內(nèi)得到執(zhí)行,不過對于短任務(wù),這種方法產(chǎn)生的開銷較高。
3. 優(yōu)先級調(diào)度算法,該算法為每個任務(wù)分配不同的優(yōu)先級,優(yōu)先級高的任務(wù)的執(zhí)行時間也隨之增加。但若某個任務(wù)優(yōu)先級較高,或某些任務(wù)沒有完成,系統(tǒng)進行任務(wù)調(diào)度時,會導(dǎo)致低優(yōu)先級任務(wù)的饑餓,即始終未能得到執(zhí)行。
4. 多級反饋隊列算法,該算法將任務(wù)按優(yōu)先級分成若干個隊列,每個隊列的任務(wù)所分配的時間片長度不同,任務(wù)執(zhí)行完后,可能會被分配到更高或更低優(yōu)先級隊列中。相較于其他算法,多級反饋隊列算法實現(xiàn)相對復(fù)雜,但可以有效平衡短任務(wù)和長任務(wù)。
第四部分,多任務(wù)調(diào)度優(yōu)化
在實際應(yīng)用場景中,多任務(wù)調(diào)度算法也需要進行優(yōu)化,以滿足應(yīng)用需求。以下是常用的多任務(wù)調(diào)度優(yōu)化方法:
1. 搶占調(diào)度。在任務(wù)執(zhí)行期間,若有更高優(yōu)先級的任務(wù)被調(diào)度,在可搶占的情況下,則會中斷當(dāng)前任務(wù),轉(zhuǎn)而執(zhí)行高優(yōu)先級任務(wù)。
2. 空閑措施。在任務(wù)調(diào)度失效時,可以設(shè)置空閑任務(wù),讓CPU休眠,直到有任務(wù)可調(diào)度時再繼續(xù)執(zhí)行。
3. 服務(wù)時間預(yù)測。通過記錄任務(wù)的歷史服務(wù)時間,可以預(yù)測任務(wù)在接下來的勸告時間內(nèi)需要的時間片長度,以提高任務(wù)執(zhí)行的效率。
4. 其他優(yōu)化策略。如對任務(wù)集束處理、加速任務(wù)退出等。
結(jié)論
在嵌入式Linux應(yīng)用開發(fā)中,多任務(wù)切換技巧是必須掌握的技能。本文從多個角度詳細介紹了嵌入式Linux多任務(wù)切換技巧,包括多任務(wù)機制簡介、多任務(wù)切換原理、多任務(wù)調(diào)度算法以及多任務(wù)調(diào)度優(yōu)化方法等。通過本文的學(xué)習(xí),讀者可以深入了解嵌入式Linux多任務(wù)切換的實現(xiàn)過程和技術(shù)優(yōu)化方法,幫助開發(fā)者進行優(yōu)化和改進,提高多任務(wù)并發(fā)執(zhí)行的效率和性能。
相關(guān)問題拓展閱讀:
- 「干貨」嵌入式Linux系統(tǒng)移植的四大步驟(上)
「干貨」嵌入式Linux系統(tǒng)移植的四大步驟(上)
在學(xué)習(xí)系統(tǒng)移植的相關(guān)知識,在學(xué)習(xí)和調(diào)試過程中,發(fā)現(xiàn)了很多問題,也解決了很多問題,但總是對于我們的開發(fā)結(jié)果有一種莫名其妙的感覺,糾其原因,主要對于我們的開發(fā)環(huán)境沒有一個深刻的認識,有時候幾個簡單的命令就可以完成非常復(fù)雜的功能,可是我們有沒有想過,為什么會有這樣的效果?
如果沒有去追問,只是機械地完成,并且看到實驗效果,這樣做其實并沒有真正的掌握系統(tǒng)移植的本質(zhì)。
在做每一個步驟的時候,
首先問問自己,為什么純纖要這樣做,然后再問問自己正在做什么?
搞明白這幾個問題,我覺得就差不多了,以后不管更換什么平臺,什么芯片,什么開發(fā)環(huán)境,你都不會迷糊,很快就會上手。對于嵌入式的學(xué)習(xí)方法,我個人方法就是:從宏觀上把握(解決為什么的問題),微觀上研究(解決正在做什么的問題),下面以自己學(xué)習(xí)的arm-cortex_a8開發(fā)板為目標(biāo),介紹下自己的學(xué)習(xí)方法和經(jīng)驗。
嵌入式Linux系統(tǒng)移植主要由四大部分組成:
一、搭建交叉開發(fā)環(huán)境
二、bootloader的選擇和移植
三、kernel的配置、編譯、和移植
四、根文件系統(tǒng)的制作
之一部分:搭建交叉開發(fā)環(huán)境
先介紹之一分部的內(nèi)容:搭建交叉開發(fā)環(huán)境,首先必須得思考兩個問題,什么是交叉環(huán)境? 為什么需要搭建交叉環(huán)境?
先回答之一個問題,在嵌入式開發(fā)中,交叉開發(fā)是很重要的一個概念,開發(fā)的之一個環(huán)節(jié)就是搭建環(huán)境,之一步不能完成,后面的步驟從無談起,這里所說的交叉開發(fā)環(huán)境主要指的是:在開發(fā)主機上(通常是我的pc機)開發(fā)出能夠在目標(biāo)機(通常是我們的開發(fā)板)上運行的程序。嵌入式比較特殊的是不能在目標(biāo)機上開發(fā)程序(狹義上來說),因為對于一個原始的開發(fā)板,在沒有任何程序的情況下它根本都跑不起來,為了讓它能夠跑起來,我們還必須要借助pc機進行燒錄程序等相關(guān)工作,開發(fā)板才能跑起來,這里的pc機就是我們說的開發(fā)主機,想想如果沒有開發(fā)主機,我們的目標(biāo)機基本上就是無法開發(fā),做兆仿這也就是電子行業(yè)的一句名言:搞電子,說白了,就是玩電腦!
然后回答第二個問題,為什么需要交叉開發(fā)環(huán)境?主要原因有以下幾點:
原因
1:
嵌入式系統(tǒng)的硬件資源有很多限制,比如cpu主頻相對較低,內(nèi)存容量較小等,想想讓幾百MHZ主猜盯頻的MCU去編譯一個Linux kernel會讓我們等的不耐煩,相對來說,pc機的速度更快,硬件資源更加豐富,因此利用pc機進行開發(fā)會提高開發(fā)效率。
原因2:
嵌入式系統(tǒng)MCU體系結(jié)構(gòu)和指令集不同,因此需要安裝交叉編譯工具進行編譯,這樣編譯的目標(biāo)程序才能夠在相應(yīng)的平臺上比如:ARM、MIPS、 POWEPC上正常運行。
交叉開發(fā)環(huán)境的硬件組成主要由以下幾大部分
:
1.開發(fā)主機
2.目標(biāo)機(開發(fā)板)
3.二者的鏈接介質(zhì),常用的主要有3種方式:(1)串口線 (2)USB線 (3)網(wǎng)線
對應(yīng)的硬件介質(zhì),還必須要有相應(yīng)的軟件“介質(zhì)”支持:
1.對于串口,通常用的有串口調(diào)試助手,putty工具等,工具很多,功能都差不多,會用一兩款就可以;
2.對于USB線,當(dāng)然必須要有USB的驅(qū)動才可以,一般芯片公司會提供,比如對于三星的芯片,USB下載主要由DNW軟件來完成;
3.對于網(wǎng)線,則必須要有網(wǎng)絡(luò)協(xié)議支持才可以,
常用的服務(wù)主要兩個
之一:tftp服務(wù):
主要用于實現(xiàn)文件的下載,比如開發(fā)調(diào)試的過程中,主要用tftp把要測試的bootloader、kernel和文件系統(tǒng)直接下載到內(nèi)存中運行,而不需要預(yù)先燒錄到Flash芯片中,一方面,在測試的過程中,往往需要頻繁的下載,如果每次把這些要測試的文件都燒錄到Flash中然后再運行也可以,但是缺點是:過程比較麻煩,而且Flash的擦寫次數(shù)是有限的;另外一方面:測試的目的就是把這些目標(biāo)文件加載到內(nèi)存中直接運行就可以了,而tftp就剛好能夠?qū)崿F(xiàn)這樣的功能,因此,更沒有必要把這些文件都燒錄到Flash中去。
第二:
nfs服務(wù):
主要用于實現(xiàn)網(wǎng)絡(luò)文件的掛載,實際上是實現(xiàn)網(wǎng)絡(luò)文件的共享,在開發(fā)的過程中,通常在系統(tǒng)移植的最后一步會制作文件系統(tǒng),那么這是可以把制作好的文件系統(tǒng)放置在我們開發(fā)主機PC的相應(yīng)位置,開發(fā)板通過nfs服務(wù)進行掛載,從而測試我們制作的文件系統(tǒng)是否正確,在整個過程中并不需要把文件系統(tǒng)燒錄到Flash中去,而且掛載是自動進行掛載的,bootload啟動后,kernel運行起來后會根據(jù)我們設(shè)置的啟動參數(shù)進行自動掛載,因此,對于開發(fā)測試來講,這種方式非常的方便,能夠提高開發(fā)效率。
另外,還有一個名字叫
samba
的服務(wù)也比較重要,主要用于文件的共享,這里說的共享和nfs的文件共享不是同一個概念,nfs的共享是實現(xiàn)網(wǎng)絡(luò)文件的共享,而samba實現(xiàn)的是開發(fā)主機上
Windows主機和Linux虛擬機之間的文件共享,是一種跨平臺的文件共享
,方便的實現(xiàn)文件的傳輸。
以上這幾種開發(fā)的工具在嵌入式開發(fā)中是必備的工具,對于嵌入式開發(fā)的效率提高做出了偉大的貢獻,因此,要對這幾個工具熟練使用,這樣你的開發(fā)效率會提高很多。等測試完成以后,就會把相應(yīng)的目標(biāo)文件燒錄到Flash中去,也就是等發(fā)布產(chǎn)品的時候才做的事情,因此對于開發(fā)人員來說,所有的工作永遠是測試。
通過前面的工作,我們已經(jīng)準(zhǔn)備好了交叉開發(fā)環(huán)境的硬件部分和一部分軟件,最后還缺少交叉編譯器,讀者可能會有疑問,為什么要用交叉編譯器?前面已經(jīng)講過,交叉開發(fā)環(huán)境必然會用到交叉編譯工具,通俗地講就是在一種平臺上編譯出能運行在體系結(jié)構(gòu)不同的另一種平臺上的程序,開發(fā)主機PC平臺(X86 CPU)上編譯出能運行在以ARM為內(nèi)核的CPU平臺上的程序,編譯得到的程序在X86 CPU平臺上是不能運行的,必須放到ARM CPU平臺上才能運行,雖然兩個平臺用的都是Linux系統(tǒng)。相對于交叉編譯,平常做的編譯叫本地編譯,也就是在當(dāng)前平臺編譯,編譯得到的程序也是在本地執(zhí)行。用來編譯這種跨平臺程序的編譯器就叫交叉編譯器,相對來說,用來做本地編譯的工具就叫本地編譯器。所以要生成在目標(biāo)機上運行的程序,必須要用交叉編譯工具鏈來完成。
這里又有一個問題,不就是一個交叉編譯工具嗎?為什么又叫交叉工具鏈呢?原因很簡單,程序不能光編譯一下就可以運行,還得進行匯編和鏈接等過程,同時還需要進行調(diào)試,對于一個很大工程,還需要進行工程管理等等,所以,這里 說的交叉編譯工具是一個由
編譯器、連接器和解釋器
組成的綜合開發(fā)環(huán)境,交叉編譯工具鏈主要由binutils(主要包括匯編程序as和鏈接程序ld)、gcc(為GNU系統(tǒng)提供C編譯器)和glibc(一些基本的C函數(shù)和其他函數(shù)的定義) 3個部分組成。有時為了減小libc庫的大小,也可以用別的 c 庫來代替 glibc,例如 uClibc、dietlibc 和 newlib。
那么,如何得到一個交叉工具鏈呢?是從網(wǎng)上下載一個“程序”然后安裝就可以使用了嗎?回答這個問題之前先思考這樣一個問題,我們的交叉工具鏈顧名思義就是在PC機上編譯出能夠在我們目標(biāo)開發(fā)平臺比如ARM上運行的程序,這里就又有一個問題了,我們的ARM處理器型號非常多,難道有專門針對我們某一款的交叉工具鏈嗎?若果有的話,可以想一想,這么多處理器平臺,每個平臺專門定制一個交叉工具鏈放在網(wǎng)絡(luò)上,然后供大家去下載,想想可能需要找很久才能找到適合你的編譯器,顯然這種做法不太合理,且浪費資源!因此,要得到一個交叉工具鏈,就像我們移植一個Linux內(nèi)核一樣,我們只關(guān)心我們需要的東西,編譯我們需要的東西在我們的平臺上運行,不需要的東西我們不選擇不編譯,所以,交叉工具鏈的制作方法和系統(tǒng)移植有著很多相似的地方,也就是說,交叉開發(fā)工具是一個支持很多平臺的工具集的(類似于Linux源碼),然后我們只需從這些工具集中找出跟我們平臺相關(guān)的工具就行了,那么如何才能找到跟我們的平臺相關(guān)的工具,這就是涉及到一個如何制作交叉工具鏈的問題了。
通常構(gòu)建交叉工具鏈有如下三種方法:
方法一 :
分步編譯和安裝交叉編譯工具鏈所需要的庫和源代碼,最終生成交叉編譯工具鏈。該方法相對比較困難,適合想深入學(xué)習(xí)構(gòu)建交叉工具鏈的讀者。如果只是想使用交叉工具鏈,建議使用下列的方法二構(gòu)建交叉工具鏈。
方法二:
通過Crosstool-ng腳本工具來實現(xiàn)一次編譯,生成交叉編譯工具鏈,該方法相對于方法一要簡單許多,并且出錯的機會也非常少,建議大多數(shù)情況下使用該方法構(gòu)建交叉編譯工具鏈。
方法三 :
直接通過網(wǎng)上下載已經(jīng)制作好的交叉編譯工具鏈。該方法的優(yōu)點不用多說,當(dāng)然是簡單省事,但與此同時該方法有一定的弊端就是局限性太大,因為畢竟是別人構(gòu)建好的,也就是固定的,沒有靈活性,所以構(gòu)建所用的庫以及編譯器的版本也許并不適合你要編譯的程序,同時也許會在使用時出現(xiàn)許多莫名其妙的錯誤,建議讀者慎用此方法。
crosstool-ng是一個腳本工具,可以制作出適合不同平臺的交叉編譯工具鏈,在進行制作之前要安裝一下軟件:
$ sudo apt-get install g++ libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk
crosstool腳本工具可以在
1. 設(shè)定源碼包路徑和交叉編譯器的安裝路徑
2. 修改交叉編譯器針對的構(gòu)架
3. 增加編譯時的并行進程數(shù),以增加運行效率,加快編譯,因為這個編譯會比較慢。
4. 關(guān)閉JAVA編譯器 ,減少編譯時間
5. 編譯
6. 添加環(huán)境變量
7. 刷新環(huán)境變量。
8. 測試交叉工具鏈
到此,嵌入式Linux系統(tǒng)移植四大部分的之一部分工作全部完成,接下來可以進行后續(xù)的開發(fā)了。
第二部分:bootloader的選擇和移植
01
Boot Loader 概念
就是在操作系統(tǒng)內(nèi)核運行之前運行的一段小程序。通過這段小程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間的映射圖,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的狀態(tài),以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境,他就是所謂的引導(dǎo)加載程序(Boot Loader)。
02
為什么系統(tǒng)移植之前要先移植BootLoader?
BootLoader的任務(wù)是引導(dǎo)操作系統(tǒng),所謂引導(dǎo)操作系統(tǒng),就是啟動內(nèi)核,讓內(nèi)核運行就是把內(nèi)核加載到內(nèi)存RAM中去運行,那先問兩個問題:之一個問題,是誰把內(nèi)核搬到內(nèi)存中去運行?第二個問題:我們說的內(nèi)存是SDRAM,大家都知道,這種內(nèi)存和SRAM不同,更大的不同就是SRAM只要系統(tǒng)上電就可以運行,而SDRAM需要軟件進行初始化才能運行,那么在把內(nèi)核搬運到內(nèi)存運行之前必須要先初始化內(nèi)存吧,那么內(nèi)存是由誰來初始化的呢?其實這兩件事情都是由bootloader來干的,目的是為內(nèi)核的運行準(zhǔn)備好軟硬件環(huán)境,沒有bootloadr我們的系統(tǒng)當(dāng)然不能跑起來。
03
bootloader的分類
首先更正一個錯誤的說法,很多人說bootloader就是U-boot,這種說法是錯誤的,確切來說是u-boot是bootloader的一種。也就是說bootloader具有很多種類,
由上圖可以看出,不同的bootloader具有不同的使用范圍,其中最令人矚目的就是有一個叫U-Boot的bootloader,是一個通用的引導(dǎo)程序,而且同時支持X86、ARM和PowerPC等多種處理器架構(gòu)。U-Boot,全稱 Universal Boot Loader,是遵循GPL條款的開放源碼項目,是由德國DENX小組開發(fā)的用于多種嵌入式CPU的bootloader程序,對于Linux的開發(fā),德國的u-boot做出了巨大的貢獻,而且是開源的。
u-boot具有以下特點:
① 開放源碼;
② 支持多種嵌入式操作系統(tǒng)內(nèi)核,如Linux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS;
③ 支持多個處理器系列,如PowerPC、ARM、x86、MIPS、XScale;
④ 較高的可靠性和穩(wěn)定性;
⑤ 高度靈活的功能設(shè)置,適合U-Boot調(diào)試、操作系統(tǒng)不同引導(dǎo)要求、產(chǎn)品發(fā)布等;
⑥ 豐富的設(shè)備驅(qū)動源碼,如串口、以太網(wǎng)、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、鍵盤等;
⑦ 較為豐富的開發(fā)調(diào)試文檔與強大的網(wǎng)絡(luò)技術(shù)支持;
其實,把u-boot可以理解為是一個小型的操作系統(tǒng)。
04
u-boot的目錄結(jié)構(gòu)
* board 目標(biāo)板相關(guān)文件,主要包含SDRAM、FLASH驅(qū)動;
* common 獨立于處理器體系結(jié)構(gòu)的通用代碼,如內(nèi)存大小探測與故障檢測;
* cpu 與處理器相關(guān)的文件。如mpc8xx子目錄下含串口、網(wǎng)口、LCD驅(qū)動及中斷初始化等文件;
* driver 通用設(shè)備驅(qū)動,如CFI FLASH驅(qū)動(目前對INTEL FLASH支持較好)
* doc U-Boot的說明文檔;
* examples可在U-Boot下運行的示例程序;如hello_world.c,timer.c;
* include U-Boot頭文件;尤其configs子目錄下與目標(biāo)板相關(guān)的配置頭文件是移植過程中經(jīng)常要修改的文件;
* lib_xxx 處理器體系相關(guān)的文件,如lib_ppc, lib_arm目錄分別包含與PowerPC、ARM體系結(jié)構(gòu)相關(guān)的文件;
* net 與網(wǎng)絡(luò)功能相關(guān)的文件目錄,如bootp,nfs,tftp;
* post 上電自檢文件目錄。尚有待于進一步完善;
* rtc RTC驅(qū)動程序;
* tools 用于創(chuàng)建U-Boot S-RECORD和BIN鏡像文件的工具;
05
u-boot的工作模式
U-Boot的工作模式有
啟動加載模式和下載模式
。啟動加載模式是Bootloader的正常工作模式,嵌入式產(chǎn)品發(fā)布時,Bootloader必須工作在這種模式下,Bootloader將嵌入式操作系統(tǒng)從FLASH中加載到SDRAM中運行,整個過程是自動的。
下載模式
就是Bootloader通過某些通信手段將內(nèi)核映像或根文件系統(tǒng)映像等從PC機中下載到目標(biāo)板的SDRAM中運行,用戶可以利用Bootloader提供的一些令接口來完成自己想要的操作,這種模式主要用于測試和開發(fā)。
06
u-boot的啟動過程
大多數(shù)BootLoader都分為stage1和stage2兩大部分,U-boot也不例外。依賴于cpu體系結(jié)構(gòu)的代碼(如設(shè)備初始化代碼等)通常都放在stage1且可以用匯編語言來實現(xiàn),而stage2則通常用C語言來實現(xiàn),這樣可以實現(xiàn)復(fù)雜的功能,而且有更好的可讀性和移植性。
1、 stage1(start.s代碼結(jié)構(gòu))
U-boot的stage1代碼通常放在start.s文件中,它用匯編語言寫成,其主要代碼部分如下:
(1) 定義入口。由于一個可執(zhí)行的image必須有一個入口點,并且只能有一個全局入口,通常這個入口放在rom(Flash)的0x0地址,因此,必須通知編譯器以使其知道這個入口,該工作可通過修改連接器腳本來完成。
(2)設(shè)置異常向量(exception vector)。
(3)設(shè)置CPU的速度、時鐘頻率及中斷控制寄存器。
(4)初始化內(nèi)存控制器 。
(5)將rom中的程序復(fù)制到ram中。
(6)初始化堆棧 。
(7)轉(zhuǎn)到ram中執(zhí)行,該工作可使用指令ldrpc來完成。
2、 stage2(C語言代碼部分)
lib_arm/board.c中的start armboot是C語言開始的函數(shù),也是整個啟動代碼中C語言的主函數(shù),同時還是整個u-boot(armboot)的主函數(shù),該函數(shù)主要完成如下操作:
(1)調(diào)用一系列的初始化函數(shù)。
(2)初始化flash設(shè)備。
(3)初始化系統(tǒng)內(nèi)存分配函數(shù)。
(4)如果目標(biāo)系統(tǒng)擁有nand設(shè)備,則初始化nand設(shè)備。
(5)如果目標(biāo)系統(tǒng)有顯示設(shè)備,則初始化該類設(shè)備。
(6)初始化相關(guān)網(wǎng)絡(luò)設(shè)備,填寫ip,c地址等。
(7)進入命令循環(huán)(即整個boot的工作循環(huán)),接受用戶從串口輸入的命令,然后進行相應(yīng)的工作。
07
基于cortex-a8的s5pc100bootloader啟動過程分析
s5pc100支持兩種啟動方式,分別為USB啟動方式和NandFlash啟動方式:
1. S5PC100 USB啟動過程
A8 reset, 執(zhí)行iROM中的程序
iROM中的程序根據(jù)S5PC100的配置管腳(SW1開關(guān)4,撥到4對面),判斷從哪里啟動(USB)
iROM中的程序會初始化USB,然后等待PC機下載程序
利用DNW程序,從PC機下載SDRAM的初始化程序到iRAM中運行,初始化SDRAM
SDRAM初始化完畢,iROM中的程序繼續(xù)接管A8, 然后等待PC下載程序(BootLoader)
PC利用DNW下載BootLoader到SDRAM
在SDRAM中運行BootLoader
2. S5PC100 Nandflash啟動過程
A8 reset, 執(zhí)行IROM中的程序
iROM中的程序根據(jù)S5PC100的配置管腳(SW1開關(guān)4,撥到靠4那邊),判斷從哪里啟動(Nandflash)
iROM中的程序驅(qū)動Nandflash
iROM中的程序會拷貝Nandflash前16k到iRAM
前16k的程序(BootLoader前半部分)初始化SDRAM,然后拷貝完整的BootLoader到SDRAM并運行
BootLoader拷貝內(nèi)核到SDRAM,并運行它
內(nèi)核運行起來后,掛載rootfs,并且運行系統(tǒng)初始化腳本
08
u-boot移植(基于cortex_a8的s5pc100為例)
1.建立自己的平臺
(1).下載源碼包2023.03版本,比較穩(wěn)定
(2).解壓后添加我們自己的平臺信息,以dkc100為參考版,移植自己s5pc100的開發(fā)板
(3).修改相應(yīng)目錄的文件名,和相應(yīng)目錄的Makefile,指定交叉工具鏈。
(4).編譯
(5).針對我們的平臺進行相應(yīng)的移植,主要包括修改SDRAM的運行地址,從0x
(6).“開關(guān)”相應(yīng)的宏定義
(7).添加Nand和網(wǎng)卡的驅(qū)動代碼
(8).優(yōu)化go命令
(9).重新編譯 make distclean(徹底刪除中間文件和配置文件) make s5pc100_config(配置我們的開發(fā)板) make(編譯出我們的u-boot.bin鏡像文件)
(10).設(shè)置環(huán)境變量,即啟動參數(shù),把編譯好的u-boot下載到內(nèi)存中運行,過程如下:
1. 配置開發(fā)板網(wǎng)絡(luò)
ip地址配置:
$setenv ipaddr 192.168.0.6 配置ip地址到內(nèi)存的環(huán)境變量
$saveenv 保存環(huán)境變量的值到nandflash的參數(shù)區(qū)
網(wǎng)絡(luò)測試:
在開發(fā)開發(fā)板上ping虛擬機:
$ ping 192.168.0.157(虛擬機的ip地址)
如果網(wǎng)絡(luò)測試失敗,從下面幾個方面檢查網(wǎng)絡(luò):
1. 網(wǎng)線連接好
2. 開發(fā)板和虛擬機的ip地址是否配置在同一個網(wǎng)段
3. 虛擬機網(wǎng)絡(luò)一定要采用橋接(VM–Setting–>option)
4. 連接開發(fā)板時,虛擬機需要設(shè)置成
靜態(tài)ip地址
2. 在開發(fā)板上,配置tftp服務(wù)器(虛擬機)的ip地址
$setenv serverip 192.168.0.157(虛擬機的ip地址)
$saveenv
3. 拷貝u-boot.bin到/tftpboot(虛擬機上的目錄)
4. 通過tftp下載u-boot.bin到開發(fā)板內(nèi)存
$ tftp(內(nèi)存地址即可) u-boot.bin(要下載的文件名)
如果上面的命令無法正常下載:
1. serverip配置是否正確
2. tftp服務(wù)啟動失敗,重啟tftp服務(wù)
#sudo service tftpd-hpa restart
5. 燒寫u-boot.bin到nandflash的0地址
$nand erase 0(起始地址) 40000(大小) 擦出nandflashk的區(qū)域
$nand write((緩存u-boot.bin的內(nèi)存地址) 0(nandflash上u-boot的位置) 40000(燒寫大小)
6. 切換開發(fā)板的啟動方式到nandflash
1. 關(guān)閉開發(fā)板
2. 把SW1的開關(guān)4撥到4的那邊
關(guān)于嵌入式linux多任務(wù)切換的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
成都網(wǎng)站設(shè)計制作選創(chuàng)新互聯(lián),專業(yè)網(wǎng)站建設(shè)公司。
成都創(chuàng)新互聯(lián)10余年專注成都高端網(wǎng)站建設(shè)定制開發(fā)服務(wù),為客戶提供專業(yè)的成都網(wǎng)站制作,成都網(wǎng)頁設(shè)計,成都網(wǎng)站設(shè)計服務(wù);成都創(chuàng)新互聯(lián)服務(wù)內(nèi)容包含成都網(wǎng)站建設(shè),小程序開發(fā),營銷網(wǎng)站建設(shè),網(wǎng)站改版,服務(wù)器托管租用等互聯(lián)網(wǎng)服務(wù)。
當(dāng)前題目:嵌入式Linux多任務(wù)切換技巧大揭秘 (嵌入式linux多任務(wù)切換)
URL分享:http://fisionsoft.com.cn/article/copsogi.html


咨詢
建站咨詢
