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