跳到正文

Wiki

即時迴圈與非同步通訊

約 3 分鐘閱讀

本文由簡體中文內容確定性轉換,並受版本化術語表保護。

裝置通訊負責等待和收發,控制迴圈負責按週期處理有效快照。兩者用明確的資料交接連線。

1.示例 1:分開執行緒職責

Asio 线程:收字节 → 拼帧 → 校验 → 保存反馈快照
Asio 线程:取最新目标 → 打包 → 异步发送
控制线程:read 取反馈 → update 更新命令 → write 保存待发目标

介面變數由控制執行緒更新。通訊回撥不能同時直接改控制器正在讀取的狀態變數,否則會產生資料競爭。

2.示例 2:理解 realtime buffer

從零編寫控制器的訂閱回撥用 writeFromNonRT 儲存固定大小 Target,update 用 readFromRT 讀取。

readFromRT 嘗試取得新資料,無法立即取得時可以繼續使用已有快照。writeFromNonRT 可能等待鎖,所以不能因為型別叫 RealtimeBuffer,就把所有成員函式都放入即時週期。

讀取返回的指標不能被其它執行緒任意長期儲存。update 中取得當前需要的資料後再進行介面寫入。

3.示例 3:狀態、目標與離散命令

資料 常見交接方式 為什麼
週期狀態 保留最新完整快照 舊狀態沒有繼續排隊的價值
連續位置目標 保留最新目標 避免積壓過期目標
使能、清錯和停止 有序命令與確認 不能簡單覆蓋尚未完成的操作

下一章只演示連續位置目標和反饋,不把簡化報文當作完整裝置協議。

3.1.兩種超時不同

上游目標過期表示不再有新目標;下游反饋過期表示裝置狀態不可信。控制器的 cmd_vel_timeout 無法替代硬體反饋看門狗,下位機也需要自己的失聯處理。

3.2.try-lock 是否就保證硬即時

不是。排程、驅動、記憶體、日誌和演算法都影響時限。教學實現採用 try-lock 減少控制執行緒等待,但不宣稱獲得硬即時保證。

4.閱讀原始碼

realtime_tools/include/realtime_tools/realtime_buffer.hpp中檢查鎖的使用和即時側指標交換,再對照控制器回撥與 update 所線上程。理解資料所有權後,再考慮框架提供的非同步元件或不同更新頻率。


返回 Jazzy 總覽 · 上一篇:管理器與資源管理原始碼 · 下一篇:虛擬序列埠與模擬下位機