Skip to content

Wiki

实时循环与异步通信

About 3 min read

Existing English translations were reused. 18 current source blocks remain in Simplified Chinese, without triggering paid translation.

设备通信负责等待和收发,控制循环负责按周期处理有效快照。两者用明确的数据交接连接。

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 总览 · 上一篇:管理器与资源管理源码 · 下一篇:虚拟串口与模拟下位机