RTOS: Real time operating systemhtml
RTLinux | ChronOS | OSADL | |
---|---|---|---|
Open Source | No | Yes | Yes |
License | GPL-2.0 | GPLv2 | / |
Kernel Version | 4.8.12 | 3.4.82 | 4.11.12 |
Platform | Linux | Linux | Linux |
Architecture | x861 | x86/Arm | x86/Arm |
File System | full2 | full | full |
Device Drivers | inherit | inherit | inherit |
C/C++ Library | inherit | inherit | inherit |
Networking | inherit | inherit | inherit |
Flash Support | inherit | inherit | inherit |
USB Support | inherit | inherit | inherit |
Graphics Support | inherit | inherit | inherit |
GPU Support | inherit | inherit | inherit |
注:inherit表明原生linux內核支持,上述三個系統均基於原生內核,原則上支持上述特性,暫無官方文檔說明,文件系統上支持RTOS的preempt_rt特性的會有所不一樣linux
根據上述的對比,我以爲選擇OSADL做爲本次詳細調研的對象會比較好。理由有三:git
下文的內容均基於OSADL展開github
OSADL Recommended Reading算法
PREEMPT_RT的特性:工具
信號量臨界區原理:性能
嚴格來講,搶佔本來不能發生在一個非可搶佔的內核。可是,因爲訪問用戶數據的時候會發生相似頁錯誤的事情能夠顯式地訪問調度器,則搶佔功能能夠在這裏加入。學習
優先級繼承原理:(writer和多個reader之間)
實現了一個reader-writer lock, writer和reader共享,這個lock的狀態能夠被reader訪問,但沒法被reader訪問write-acquire方法。多reader優先級繼承花費的時間會影響到調度延遲上。
事件機制不適用優先級繼承原理:
引入事件機制,任何的任務都有可能調用down()方法,這樣會致使高優先級的任務被喚醒(有可能在休眠狀態)
Warning : raw_spinlock_t和raw_rwlock_t的非正確使用都會破壞PREEMPT_RT的實時機制,請注意
實時任務使用上的編碼注意事項,能夠經過spinlock_t等非raw形式訪問,或根據需求封裝raw,儘可能避免原生使用raw_lock。
# Download linux souce code wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.11.12.tar.xz xz -cd linux-4.11.12.tar.xz | tar xvf - cd linux-4.11.12 # patch rt to kernel xzcat ../patch-4.11.12-rt10.patch.xz | patch -p1 make defconfig # default is x86_64_config make
至此,新的kernel編譯成功
sudo make modules_install install remove the GRUB_HIDDEN_TIMEOUT_QUIET line from /etc/default/grub increase the GRUB_DEFAULT timeout from 0 to 15 seconds sudo update-grub2
虛擬機硬盤配置:
系統配置:
啓動配置:
方案一:Kernel.org上的Realtime測試方法
在kernel.org上的官方測試方法,Thomas Gleixner撰寫了一個測試負載系統的實時能力的工具cyclictest。對於每個CPU邏輯核心,都跑一個單獨的線程,每一個線程都在一個獨立的進程當中,測試內核的線程調度能力。
注意,cyclictest須要運行持續一段時間,等待調度算法穩定後的結果才能說明當前系統的調度時延,短期內的調度快慢不足以說明系統的實時性,非RT系統有可能在短期內剛好快於RT系統。
方案二:opersys.com/lrtbf/上的Linux RT Benchmarking Framework
該實驗須要三臺機器
可生成的報表內容包括
數據積累的實現消耗,中斷的響應時間
因爲該實驗須要三臺機器來進行,目前條件下不可進行,且結果預估也是RT系統比非RT系統性能更好,因此暫時決定先不進行該實驗,若有須要,後續再進行實驗測試。
方案一:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git cd rt-tests sudo apt-get install libnuma-dev # acquired make
方案一
#################### non-RT OS #################### >> sudo ./cyclictest -a -t -n -p99 # /dev/cpu_dma_latency set to 0us policy: fifo: loadavg: 0.25 0.11 0.04 1/299 1856 T: 0 (1853) P:99 I:1000 C: 20832 Min: 5 Act: 232 Avg: 425 Max: 23436 T: 1 (1854) P:99 I:1500 C: 13988 Min: 9 Act: 297 Avg: 427 Max: 25291 #################### RT OS #################### >> sudo ./cyclictest -a -t -n -p99 # /dev/cpu_dma_latency set to 0us policy: fifo: loadavg: 0.18 0.19 0.18 1/353 9062 T: 0 (9061) P:99 I:1000 C: 9087 Min: 7 Act: 328 Avg: 406 Max: 4636 T: 1 (9062) P:99 I:1500 C: 6118 Min: 10 Act: 367 Avg: 410 Max: 1366
最右邊的那一列表明着最重要的測試結果,最大值比平均值重要,評價實時系統的最重要指標。
上述測試是在經常使用的平臺Ubuntu14.04下進行的,兩個內核分別是官方內核4.4.0-31-generic和實時內核4.4.79-rt92
最大值對比:
CPU0 | CPU1 | |
---|---|---|
4.4.0-31-generic | 23436 | 25291 |
4.4.79-rt92 | 4636 | 1366 |
從上述結果的最差狀況分析,官方內核跑出來的成績是25.291毫秒,而實時內核跑出來的成績達到了4.636毫秒,是前者的1/4的時間延遲。
平均值對比:
CPU0 | CPU1 | |
---|---|---|
4.4.0-31-generic | 425 | 427 |
4.4.79-rt92 | 406 | 410 |
從上述結果的平均值狀況分析,官方內核跑出來的成績是0.426毫秒,而實時內核跑出來的成績達到了0.408毫秒,二者之間的區別相差不大。緣由是測試平臺基本都處於空閒的狀態中,屢次運行結果都在空閒狀態因此平均值相差不大,評價實時系統的關鍵參數依然是最大值。
RTOS的實現原理是給線程增長了一個priority參數,容許搶佔式優先調度該線程,以達到調度時延最低。
上述實驗結果中,能夠很明顯的看出,RTOS的實時性比原生的OS有明顯的性能體現,最大時延上是原生的1/4時間。
在調研的過程當中發現百度的Apollo內核中,也是使用了這個RT patch,並百度優化了以太網的驅動和解決了Nvidia驅動的bug。3 以後可使用Apollo調整過的內核。