我們都知道對於機械人應用來說實時性很重要, 以及linux不是乙個實時系統, 但是說:
所以這裡簡單的做個實驗, 來直觀的認識一下.
注: 下面的測試資料, 都是在cpu滿載的情況下得出.
乙個簡單ros程式邏輯如下: 以100hz向外傳送資料.
while (1)
我們接下來就用這個程式的迴圈週期間隔
來評估這個程式的實時性.
ps: robotics上常見的高頻率基本也就集中在200hz~100hz, 比如說imu感測器的週期和各種控制的取樣週期
預設linux的排程器為cfs.
在cfs排程器下, ros應用跑了5分鐘, 其**現的最大延遲為50ms
[ info] [1551423662.755795004]: dt: now 10893.000000 max 54892.000000
下面我們設定這個應用為rt排程策略
chrt --rr -p pid
跑了5分鐘, 其**現的最大延遲為13ms
[ info] [1551425162.716713135]: dt: now 10447.000000 max 13020.000000
可以看到, 在預設cfs排程器的情況, 乙個程式的週期執行時間在cpu高負載的情況下是得不到保障的.
對關鍵的程式來說設定rt排程非常有必要.
不然疊加起來, 就有可能出現數百毫秒的延遲.
如果這是乙個剎車鏈路, 那在80km/h的速度下剎車距離就會上下浮動10幾公尺,
在上面rt排程的情況, 可以看到最大的週期間隔13ms, 而不是嚴格的10ms.
造成這個3ms的原因有很多, 包括核心不支援搶占等等.
而rt-linux補丁, 就是為了解決這些原因而產生的.
上車繼續執行測試程式(rt排程)
跑了5分鐘, 其**現的最大延遲為10.7ms
[ info] [1551434073.434294415]: dt: now 10284.000000 max 10701.000000
rt-linux補丁可以解決預設linux下毫秒級的排程誤差
上文研究迴圈週期間隔
所針對的都是排程
上的實時性.
對實時性而言, 像process時間
也要考慮起來, 這針對的是程式執行
上的實時性.
一些影響程式實時性的點:
i/o阻塞
多執行緒同步阻塞
其他......
這裡不再詳細描述, 有興趣可看以下參考:
上文兩者都做到確定後, 就可以計算任務的deadline
.
以下兩條命令, 可以看程式主動/被動施放cpu的次數.
sar -w 1 3
pidstat -w
嵌入式Linux實時效能優化
1 引言 分析了linux的實時性,針對其在實時應用中的技術障礙,在參考了與此相關研究基礎上,從三方面提出了改善linux實時效能的改進措施。為提高嵌入式應用響應時間精度,提出兩種細化linux時鐘粒度方法 為增強系統核心對實時任務的響應能力,採用插入搶占點和修改核心法增強linux核心的可搶占性 ...
一些優秀的實時開發社群
stack overflow 全球最受程式設計師歡迎的開發社群之一,而且也是內容最豐富的社群之一。官方 reddit 很有個性的社群,在該 上可以提交一些你感興趣的topic,也可以和其他人討論一些開發問題和當前的it熱點,程式設計開發板塊只是它其中的一小部分 官方 google communiti...
實時系統的一些理論資料
rt linux 部分的中斷處理部分讀到一句話 因此它不會影響那些不通過 軟體的實時中斷,保證了rt linux的實時性。這個實時中斷是個啥?和普通中斷在實現機制上有啥區別?接著看下面的文章 明白了,實際這個東西純粹是個概念,至於說實現上有什麼不同,首先系統架構不一樣了,看文中圖,在此基礎上看發出中...