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