px4原生源码学习二--实时操作系统篇
??po上我使用到的硬件和開發(fā)環(huán)境
? px4硬件:某寶銷量最高的pixhawk套件(主機,gps+指南針,數(shù)傳,pwm轉(zhuǎn)pmm,安全開關(guān),蜂鳴器,電源轉(zhuǎn)換接頭)
? 遙控器:某國產(chǎn)神器
? 開發(fā)環(huán)境:虛擬機vm12+ubuntu14
?ps:此文章只針對純代碼分析,關(guān)于那些個飛機類型啦,硬件什么的我就不多說了,這個得自己去親身體驗才行,切不可貿(mào)然飛行,這個還是很危險的!!!!!
?還有就是什么Git,Linux,make什么的也不會多說,畢竟只是工具屬性。
?獲得更好支持可以訪問http//:px4.io 我知道的大部分來自這個網(wǎng)站。
? **************************************************************************************************************/
??? 為什么我要談到實時操作系統(tǒng)?首先據(jù)我所知,國內(nèi)除了軟件工程專業(yè)和計算機專業(yè),其它專業(yè)應(yīng)該很少會開操作系統(tǒng)這門課程,對于廣大的自控和電子專業(yè)的學(xué)生來說,其實這非常不利的!!!!如果你只是開發(fā)一個簡簡單單的單片機程序,不用考慮以后對于程序的升級與修改,那么你簡簡單單寫個main函數(shù)的while循環(huán)其實沒什么不好。但你要遇到那種開發(fā)周期長,系統(tǒng)復(fù)雜的產(chǎn)品或者項目,那最好是基于實時操作系統(tǒng)開發(fā),因為這對于代碼重用和添加新功能或者新設(shè)備來說會方便挺很多,代碼的編寫程度也會簡單很多。像早期的apm飛控也是基于板子的main函數(shù),導(dǎo)致其代碼復(fù)雜,冗余,后面直接被棄,因為可能每添加一個功能或者設(shè)備,代碼就可能要重構(gòu)。我們要講的px4飛控其實也是基于一個叫做Nuttx的實時操作系統(tǒng)的(在此提醒各位拿到代碼找main函數(shù)的同志們,不要白費力氣,你找不到的,因為確實系統(tǒng)不是main函數(shù)啟動的!!!,后面我會專門講一下px4是如何啟動的),其實我沒猜錯的話大疆飛控用的應(yīng)該是在國內(nèi)外很出名的開源實時操作系統(tǒng)μC/OS。所以要更好理解px4,就一定要有操作系統(tǒng)概念。下面我就基于兩點談?wù)?#xff1a;第一:什么是實時操作系統(tǒng),第二:px4的實時操作系統(tǒng)Nuttx。
?????首先談?wù)劜僮飨到y(tǒng),說到操作系統(tǒng),大家首先會想到windows,linux或者Mac os,亦或者手機的一些操作系統(tǒng)。沒錯這些都是操作系統(tǒng),但這些操作系統(tǒng)和今天要談的實時操作系統(tǒng)有一些基本的概念和理論都是一樣的,但他們又有一些不同。
?? 相同點:所以操作系統(tǒng)無非由以下四大部分組成(熟記這四個模塊):
?????????????????? 1.任務(wù)調(diào)度
?????????????????? 2.內(nèi)存管理
?????????????????? 3.文件系統(tǒng)
?????????????????? 4.?I/O
???? 對于主流的操作系統(tǒng)而言,這四個缺一不可!!,而對于一些非常簡單的實時操作系統(tǒng)可能會沒有3和4。
???? px4所使用的的Nuttx這四個模塊都有。
???? 什么是任務(wù)調(diào)度(很多課本上會說進程管理,但后面操作系統(tǒng)發(fā)展出了線程,這個說法其實不嚴謹)?
???? 想想你日常使用的手機,有各式各樣的APP,其實每個APP都可以把它抽象為一個簡單的task(任務(wù)),你在各個APP之間切換自如,包括有一些后臺運行的APP,假設(shè)你手機是單核的,一次只能運行一個task,那手機是怎么實現(xiàn)后臺運行多個APP的呢?這個就得歸功于操作系統(tǒng)的任務(wù)調(diào)度功能,由于大部分的APP都不會涉及到太多的計算,所以這些APP真正使用CPU的時間少之又少,大部分時間是在等待輸入和輸出操作的,這個時候就可以把他們掛起,讓別的task使用CPU了,由于這個切換很快,你感覺不到,所以你就感覺事實上有多個程序在同時運行。
????簡單點說任務(wù)調(diào)度就是一個程序,這個程序決定其他程序什么時候使用CPU,什么時候掛起。
????上面的說法就引出了一個問題,如果同時有兩個task都要求使用CPU呢?怎么辦!誰先用?這就引進了另外一個概念:優(yōu)先級。誰優(yōu)先級高誰用CPU。而這個就是實時操作系統(tǒng)同普通操作系統(tǒng)的區(qū)別。實時操作系統(tǒng)有嚴密的等級制度和相應(yīng)制度即:高優(yōu)先級task搶低優(yōu)先級task (即使這個task在用CPU)CPU,對于高優(yōu)先級的程序,要求系統(tǒng)有快速的反映時間(這是衡量一個實時操作系統(tǒng)好壞的主要標準)。
????什么是內(nèi)存管理?
??? 程序要運行首先要干嘛?要把它從ROM(可理解為硬盤)里面加載到RAM(可理解為內(nèi)存)里面。如果單片機就跑一個程序,整個內(nèi)存都是你的,你想怎么用就怎么用。可是引入操作系統(tǒng)后,要對多個task進行調(diào)度,就得把他們?nèi)考虞d到內(nèi)存中,可是畢竟單片機或者mcu的內(nèi)存有限(即使電腦的也有限),這就引出了內(nèi)存管理。
???簡單點說內(nèi)存管理也是一個程序,這個程序決定誰駐留在內(nèi)存,誰離開內(nèi)存。
????
??什么是文件系統(tǒng)?
??在ROM里面保存的東西,如果是少量的東西,你可以隨便保存。可是當你有幾十個g種子的時候,你也直接用單片機的方式一個一個寫到flash里面!!!你雜亂無章的保存會導(dǎo)致后面查找,刪除,修改變得非常麻煩,使用我們要用文件系統(tǒng)來幫我們管理這些個文件,而我們只要對文件系統(tǒng)進行操作就能對文件操作了。
??簡單點說文件系統(tǒng)是一個程序,它幫我們管理我們的文件,使我們操作文件更方便。
? 什么是I/O?
???CPU不能獨立的存在,它得和周圍的設(shè)備通信,內(nèi)存也好,flash也罷,這些都可以通歸為I/O設(shè)備。對于px4來說I/O設(shè)備就更多了,什么gps,陀螺儀,加速計,氣壓計,空速計,pmm輸入等等,還在一直加呢!我們自己寫個main數(shù),也可以讀出這些設(shè)備的數(shù)據(jù),但在操作系統(tǒng)中,對這些設(shè)備進行操作就不是那么簡單了。由于I/O算的上計算機組件當中最復(fù)雜的東西了,你不能簡簡單單把它歸類為某個程序。Unix系統(tǒng)對I/O設(shè)備有個很好的抽象:文件。Unix系統(tǒng)中把所有東西都抽象成文件,I/O設(shè)備是一種特殊的文件。因為事實上我們并不關(guān)心你I/O設(shè)備是什么,我們只想要其中的數(shù)據(jù),文件可以存取數(shù)據(jù),傳感器數(shù)據(jù)不斷更新,我就不斷更新這個文件內(nèi)容,其他程序想要里面的數(shù)據(jù)可以去讀這個文件就行。
???不同系統(tǒng)對于I/O管理的理念大不相同,我無法把它抽象為一個程序或者文件,后面我會針對Nuttx的I/O談?wù)劇?/span>
??px4的實時操作系統(tǒng)Nuttx
???
??? 首先說說px4和Nuttx的淵源:PX4是一個軟、硬件開源項目(遵守BSD協(xié)議),目的在于為學(xué)術(shù)、愛好和工業(yè)團體提供一款低成本高性能的高端的自駕儀。這個項目源于?ETH Zurich (蘇黎世聯(lián)邦理工大學(xué))的計算機視覺與幾何實驗室的PIXHAWK項目、并得到了自主系統(tǒng)實驗室和?自動控制實驗室的支持。而Nuttx也是蘇黎世聯(lián)邦理工大學(xué)的一個開源項目(這個學(xué)校在計算機方面可能算的上是歐洲最強的了,那個提出最短路徑算法和信號量的教授就是這個學(xué)校的)。所以他們兩個就走到了一起。
? 下面背下書:NuttX 是一個實時操作系統(tǒng)(RTOS),強調(diào)標準兼容和小型封裝,具有從8位到32位微控制器環(huán)境的高度可擴展性。NuttX 主要遵循? Posix 和 ANSI 標準,對于在這些標準下不支持的功能,或者不適用于深度嵌入環(huán)境的功能(如 fork()),采用來自 Unix 和常見 RTOS (如 VxWorks)的額外的標準 API。
?? 下面一篇文章我將著重講解一下Nuttx系統(tǒng)的使用。
總結(jié)
以上是生活随笔為你收集整理的px4原生源码学习二--实时操作系统篇的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: px4原生源码学习一
- 下一篇: px4原生源码学习三--Nuttx实时操