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 總覽 · 上一篇:管理器與資源管理原始碼 · 下一篇:虛擬序列埠與模擬下位機