跳到正文

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