操作系統(tǒng)向下進(jìn)行硬件資源管理,向上提供任務(wù)調(diào)度和通信接口。當(dāng)前Ubuntu(一款Linux發(fā)行版)+ROS(Robot Operating System)已經(jīng)成為機(jī)器人運(yùn)行環(huán)境的事實標(biāo)準(zhǔn),而對于無人機(jī)飛控,我們期望操作系統(tǒng)是實時的且高度可剪裁配置、可擴(kuò)展。主流飛控的嵌入式實時內(nèi)核依據(jù)軟件架構(gòu)、接口標(biāo)準(zhǔn)兼容性等劃分為兩大類:類Unix如NuttX等,微內(nèi)核類如FreeRTOS和uCOSii等。其中實時主要是指具備高優(yōu)先級任務(wù)搶占低優(yōu)先級任務(wù)的能力,調(diào)度延遲以系統(tǒng)時鐘量級來計。上述兩類操作系統(tǒng)都滿足實時要求,類Unix、微核本質(zhì)是調(diào)度器,由一些線性數(shù)據(jù)結(jié)構(gòu)實現(xiàn)對任務(wù)線程的管理;而ROS本質(zhì)是多進(jìn)程Socket通信中間件。
?
一、類Unix操作系統(tǒng)
PC端Unix操作系統(tǒng)啟動之后呈現(xiàn)出進(jìn)程樹和文件系統(tǒng)樹,進(jìn)程樹表達(dá)所有進(jìn)程之間都具有親緣關(guān)系,而文件系統(tǒng)樹表達(dá)文件系統(tǒng)路徑之間的掛載關(guān)系。
NuttX是類Unix嵌入式實時操作系統(tǒng),因為處理器架構(gòu)不同,又限于資源壓力,相比于Linux,它對機(jī)制實現(xiàn)做了一些簡化。麻雀雖小,五臟俱全,NuttX支持8bit到64bit微處理器環(huán)境,支持POSIX/ANSI標(biāo)準(zhǔn)的任務(wù)控制、命名管道,計數(shù)信號量,信號,互斥量以及文件系統(tǒng)等機(jī)制,下面是NuttX架構(gòu)圖:
NuttX架構(gòu)圖
首先, NuttX支持用戶線程和內(nèi)核線程,而不具有Linux意義下的進(jìn)程概念。取而代之的是NuttX線程組,包括一個主任務(wù)線程和由主線程創(chuàng)建的pthreads,線程組線程彼此共享資源如環(huán)境變量、文件描述符、文件流、sockets等。另外,在NuttX上有task的概念,task是一種特殊的pthread,和pthread資源共享程度相比,task有一定獨(dú)立度。對于線程/任務(wù)控制,NuttX提供了VxWorks與POSIX風(fēng)格的API,實現(xiàn)最大程度兼容性。對于內(nèi)核線程,他們相比于用戶態(tài)有內(nèi)核資源訪問權(quán)限。
默認(rèn)情況下,NuttX按照優(yōu)先級調(diào)度,高優(yōu)任務(wù)在阻塞之前獨(dú)占CPU,同優(yōu)先級任務(wù)按下來先調(diào)度順序執(zhí)行,NuttX任務(wù)或線程可以通過選項配置round-robin或sporadic方式調(diào)度。
除了線程與任務(wù)之外,NuttX還有一種任務(wù)執(zhí)行方案,work queue:work queue是一系列需要執(zhí)行的工作加入到隊列中,由一些線程來消費(fèi)執(zhí)行。NuttX支持三種類型work queue,包括高優(yōu)內(nèi)核work queue:一般用于處理中斷句柄中的延遲任務(wù),也可用于驅(qū)動底層處理工作,因為這些任務(wù)通常是高優(yōu)快速運(yùn)行的;還有低優(yōu)內(nèi)核work queue:低優(yōu)先級工作隊列更適合于處理面向應(yīng)用層的工作,比如文件系統(tǒng)清理,內(nèi)存垃圾回收,異步IO操作等;還有用戶模式work queue:同樣面向應(yīng)用層,但是訪問內(nèi)核資源需要系統(tǒng)調(diào)用增加開銷,用戶自行結(jié)合實際情況選取。
在任務(wù)同步、通信,資源互斥保護(hù)方面,NuttX支持命名管道,計數(shù)信號量,信號,共享內(nèi)存等。父子關(guān)系的線程或任務(wù)之間可以用waitpid等同步,非父子關(guān)系可以用其他如命名管道等方式做同步,PX4中的uORB就是基于命名管道實現(xiàn)的,命名管道支持POSIX標(biāo)準(zhǔn)文件系統(tǒng)操作,如下介紹: ? NuttX符合“一切皆文件”的哲學(xué),接口上對外暴露Open、Close、Read、Write、Ioctl以及Poll。如設(shè)備驅(qū)動,又如命名管道。NuttX偽根文件系統(tǒng)是全內(nèi)存的,其他或真實文件系統(tǒng)可以掛載到根下。NuttX設(shè)備驅(qū)動包括字符設(shè)備驅(qū)動,如常見串口驅(qū)動,模數(shù)驅(qū)動,PWM驅(qū)動,CAN驅(qū)動,正交編碼器,定時器驅(qū)動,RTC驅(qū)動,F(xiàn)OC(Field Oriented Control)控制交流電機(jī)驅(qū)動等。除了最常見的字符設(shè)備驅(qū)動之外,還有字符設(shè)備驅(qū)動,它們以塊為單位讀寫訪問,以及一些特殊設(shè)備驅(qū)動:SYSLOG,RAM LOG等。PX4中傳感器驅(qū)動是對字符設(shè)備的進(jìn)一步開發(fā),放在PX4-Autopilotsrcdrivers路徑中,讀者可以自行查看調(diào)用關(guān)系。 ? ? ?
二、微內(nèi)核
?
與類Unix相比,微核的調(diào)度、通信等機(jī)制都是獨(dú)立實現(xiàn),不遵守接口標(biāo)準(zhǔn),因此更輕量。相比于裸機(jī)編程,使用微內(nèi)核,業(yè)務(wù)被模塊化可以使架構(gòu)更清楚,開發(fā)者對調(diào)度和通信的實現(xiàn)無需過多關(guān)注。微內(nèi)核代表產(chǎn)品包括FreeRTOS、uCOSii,以及國產(chǎn)RT-thread,我們以FreeRTOS為例介紹一下:
FreeRTOS支持消息隊列,用于任務(wù)間通信,本質(zhì)是一段對各個任務(wù)可見的共享內(nèi)存。也支持二值信號量(或互斥信號量)做資源互斥保護(hù)以及多值信號量做同步,他們的本質(zhì)也是共享內(nèi)存空間以及有PV語義的接口。
對中斷的響應(yīng)和處理也是嵌入式編程需要關(guān)注的一個特性,在FreeRTOS中,中斷事件可以與常規(guī)task進(jìn)行通信和同步。此外,微核支持臨界區(qū)來關(guān)閉調(diào)度和中斷,臨界區(qū)邏輯需要盡可能短小,以保證實時性。
內(nèi)存管理方面,與NuttX一樣,對于沒有MMU的STM32F4處理器, TCB(Task Control Block)與各自的棧鏈表形式保存在扁平內(nèi)存中,內(nèi)存布局可以類比下圖:
微核內(nèi)存管理示意圖 總地來說,對于類Unix和微核,應(yīng)該沒有程序運(yùn)行效率上差別,類Unix操作系統(tǒng)遵守協(xié)議標(biāo)準(zhǔn),對Linux特性熟悉的可以很容易上手開發(fā),同時可以使用KConfig剪裁配置系統(tǒng)功能;微核優(yōu)勢在于輕量級,系統(tǒng)代碼占用幾K空間,比較受到國內(nèi)MCU開發(fā)者青睞。當(dāng)然也有裸機(jī)編程的,自己開發(fā)定時器中斷回調(diào),完成周期任務(wù)執(zhí)行,但是顯然,這樣的開發(fā)方式只適用于小規(guī)模項目。? ??
三、ROS
ROS(Robot Operating System)從2007年誕生至今已經(jīng)成為機(jī)器人操作系統(tǒng)事實標(biāo)準(zhǔn),經(jīng)歷過兩個主要版本ROS1和ROS2。雖然被叫做操作系統(tǒng),但是ROS本質(zhì)只是一個中間件,不具備原生調(diào)度硬件的能力,更不滿足實時性要求。
下面是ROS發(fā)行版與Ubuntu版本匹配情況:
? 下面簡單介紹一些ROS概念和用法: ? 包是項目的功能單元和發(fā)布單元,工作空間是包開發(fā)和運(yùn)行的路徑范圍。ROS提供catkin基礎(chǔ)包幫助用戶做開發(fā)包的構(gòu)建管理,catkin本質(zhì)是CMake與一些python腳本實現(xiàn)的,此外,ROS也提供了一些包管理的命令行工具。
包中可以包含一個或多個可運(yùn)行二進(jìn)制,稱為節(jié)點。運(yùn)行中的節(jié)點彼此存在消息流交互,構(gòu)成圖,在ROS1中,由master節(jié)點提供名稱索引服務(wù)與消息通訊,由參數(shù)服務(wù)器提供系統(tǒng)參數(shù)增刪改查服務(wù)。節(jié)點之間通信采用SOCKET。ROS2干掉了master概念,節(jié)點可消息直傳,系統(tǒng)更魯棒。另外,ROS2構(gòu)建于 Data Distribution Service(DDS)之上,因其支持多種傳輸模式,因此更適合于實時性更好的操作系統(tǒng)。
ROS架構(gòu) 來源:《Exploring?the?performance?of?ROS2》
此外,ROS有著豐富的輔助開發(fā)工具,包括可視化工具Rviz,仿真工具gazebo。此外,ROS也有著龐大的開發(fā)者基礎(chǔ),支持的功能包也涵蓋優(yōu)化,控制,導(dǎo)航,視覺,AI等領(lǐng)域。如果有機(jī)會,我們后面會選取SOTA成果,對包做測評。
這篇只是簡單聊聊這兩類操作系統(tǒng),并沒有事無巨細(xì)介紹,因為我還是覺得操作系統(tǒng)實現(xiàn)或開發(fā),實操效果會更好,可以研究研究嵌入式操作系統(tǒng)的調(diào)度特性,內(nèi)存管理,文件系統(tǒng),以及ROS包開發(fā),功能包評測來加深理解。
編輯:黃飛
?
評論
查看更多