px4原生原始碼學習-(2)--實時作業系統篇
po上我使用到的硬體和開發環境
px4硬體:某寶銷量最高的pixhawk套件(主機,gps+指南針,數傳,pwm轉pmm,安全開關,蜂鳴器,電源轉換接頭)
遙控器:某國產神器
開發環境:虛擬機器vm12+ubuntu14
ps:此文章只針對純程式碼分析,關於那些個飛機型別啦,硬體什麼的我就不多說了,這個得自己去親身體驗才行,切不可貿然飛行,這個還是很危險的!!!!!
還有就是什麼Git,Linux,make什麼的也不會多說,畢竟只是工具屬性。
獲得更好支援可以訪問http//:px4.io 我知道的大部分來自這個網站。
**************************************************************************************************************/
為什麼我要談到實時作業系統?首先據我所知,國內除了軟體工程專業和計算機專業,其它專業應該很少會開作業系統這門課程,對於廣大的自控和電子專業的學生來說,其實這非常不利的!!!!如果你只是開發一個簡簡單單的微控制器程式,不用考慮以後對於程式的升級與修改,那麼你簡簡單單寫個main函式的while迴圈其實沒什麼不好。但你要遇到那種開發週期長,系統複雜的產品或者專案,那最好是基於實時作業系統開發,因為這對於程式碼重用和新增新功能或者新裝置來說會方便挺很多,程式碼的編寫程度也會簡單很多。像早期的apm飛控也是基於板子的main函式,導致其程式碼複雜,冗餘,後面直接被棄,因為可能每新增一個功能或者裝置,程式碼就可能要重構。我們要講的px4飛控其實也是基於一個叫做Nuttx的實時作業系統的(在此提醒各位拿到程式碼找main函式的同志們,不要白費力氣,你找不到的,因為確實系統不是main函式啟動的!!!,後面我會專門講一下px4是如何啟動的),其實我沒猜錯的話大疆飛控用的應該是在國內外很出名的開源實時作業系統µC/OS
首先談談作業系統,說到作業系統,大家首先會想到windows,linux或者Mac os,亦或者手機的一些作業系統。沒錯這些都是作業系統,但這些作業系統和今天要談的實時作業系統有一些基本的概念和理論都是一樣的,但他們又有一些不同。
相同點:所以作業系統無非由以下四大部分組成(熟記這四個模組):
1.任務排程
2.記憶體管理
3.檔案系統
4. I/O
對於主流的作業系統而言,這四個缺一不可!!,而對於一些非常簡單的實時作業系統可能會沒有3和4。
px4所使用的的Nuttx這四個模組都有。
什麼是任務排程(很多課本上會說程序管理,但後面作業系統發展出了執行緒,這個說法其實不嚴謹)?
想想你日常使用的手機,有各式各樣的APP,其實每個APP都可以把它抽象為一個簡單的task(任務),你在各個APP之間切換自如,包括有一些後臺執行的APP,假設你手機是單核的,一次只能執行一個task,那手機是怎麼實現後臺執行多個APP的呢?這個就得歸功於作業系統的任務排程功能,由於大部分的APP都不會涉及到太多的計算,所以這些APP真正使用CPU的時間少之又少,大部分時間是在等待輸入和輸出操作的,這個時候就可以把他們掛起,讓別的task使用CPU了,由於這個切換很快,你感覺不到,所以你就感覺事實上有多個程式在同時執行。
簡單點說任務排程就是一個程式,這個程式決定其他程式什麼時候使用CPU,什麼時候掛起。
上面的說法就引出了一個問題,如果同時有兩個task都要求使用CPU呢?怎麼辦!誰先用?這就引進了另外一個概念:優先順序。誰優先順序高誰用CPU。而這個就是實時作業系統同普通作業系統的區別。實時作業系統有嚴密的等級制度和相應制度即:高優先順序task搶低優先順序task (即使這個task在用CPU)CPU,對於高優先順序的程式,要求系統有快速的反映時間(這是衡量一個實時作業系統好壞的主要標準)。
什麼是記憶體管理?
程式要執行首先要幹嘛?要把它從ROM(可理解為硬碟)裡面載入到RAM(可理解為記憶體)裡面。如果微控制器就跑一個程式,整個記憶體都是你的,你想怎麼用就怎麼用。可是引入作業系統後,要對多個task進行排程,就得把他們全部載入到記憶體中,可是畢竟微控制器或者mcu的記憶體有限(即使電腦的也有限),這就引出了記憶體管理。
簡單點說記憶體管理也是一個程式,這個程式決定誰駐留在記憶體,誰離開記憶體。
什麼是檔案系統?
在ROM裡面儲存的東西,如果是少量的東西,你可以隨便儲存。可是當你有幾十個g種子的時候,你也直接用微控制器的方式一個一個寫到flash裡面!!!你雜亂無章的儲存會導致後面查詢,刪除,修改變得非常麻煩,使用我們要用檔案系統來幫我們管理這些個檔案,而我們只要對檔案系統進行操作就能對檔案操作了。
簡單點說檔案系統是一個程式,它幫我們管理我們的檔案,使我們操作檔案更方便。
什麼是I/O?
CPU不能獨立的存在,它得和周圍的裝置通訊,記憶體也好,flash也罷,這些都可以通歸為I/O裝置。對於px4來說I/O裝置就更多了,什麼gps,陀螺儀,加速計,氣壓計,空速計,pmm輸入等等,還在一直加呢!我們自己寫個main數,也可以讀出這些裝置的資料,但在作業系統中,對這些裝置進行操作就不是那麼簡單了。由於I/O算的上計算機元件當中最複雜的東西了,你不能簡簡單單把它歸類為某個程式。Unix系統對I/O裝置有個很好的抽象:檔案。Unix系統中把所有東西都抽象成檔案,I/O裝置是一種特殊的檔案。因為事實上我們並不關心你I/O裝置是什麼,我們只想要其中的資料,檔案可以存取資料,感測器資料不斷更新,我就不斷更新這個檔案內容,其他程式想要裡面的資料可以去讀這個檔案就行。
不同系統對於I/O管理的理念大不相同,我無法把它抽象為一個程式或者檔案,後面我會針對Nuttx的I/O談談。
px4的實時作業系統Nuttx
首先說說px4和Nuttx的淵源:PX4是一個軟、硬體開源專案(遵守BSD協議),目的在於為學術、愛好和工業團體提供一款低成本高效能的高階的自駕儀。這個專案源於
下面背下書:NuttX 是一個實時作業系統(RTOS),強調標準相容和小型封裝,具有從8位到32位微控制器環境的高度可擴充套件性。NuttX 主要遵循 Posix 和 ANSI 標準,對於在這些標準下不支援的功能,或者不適用於深度嵌入環境的功能(如 fork()),採用來自 Unix 和常見 RTOS (如 VxWorks)的額外的標準 API。
下面一篇文章我將著重講解一下Nuttx系統的使用。