本方案旨在解决系统开发中“高性能实时控制 与“丰富人机交互”的需求矛盾。它采用 混合部署的架构,将系统清晰地分为两个层面:
1. 实时层:部署在 睿擎派 设备的 RT-Thread 实时系统中,负责执行高频率、高确定性的核心控制算法、EtherCat 等工业总线通信、故障保护等硬实时任务。
2. 交互层:基于 Qt Framework 开发,运行在 Linux 操作系统上,提供图形化用户界面,用于参数配置、状态监控、曲线显示、数据记录、报警管理和网络通信等软实时或非实时任务。
两个层面通过高速通信机制进行数据交换和指令传递,从而形成一个兼顾实时性能与开发效率的完整解决方案。
混合部署双系统指的是单一芯片上同时运行两个系统,既运行Linux,又运行RT-Thread系统。
● Linux 系统:运行在应用核心,负责图形界面和非实时任务
● RT-Thread 系统:运行在实时核心,负责电机控制和实时通信
● 核间通信通道:基于 rpmsg 机制实现两个系统间的高速数据交换,是整个方案的技术核心
睿擎派RC3506上运行Linux系统日志图通过串口1查看

睿擎派RC3506上运行RT-Thread系统日志图通过串口3查看


● 绘制电机启停按钮
● 设计电机运行方向控制
● 实现电机期望位置和当前位置显示
● 创建位置曲线实时显示界面


● rpmsg 端点管理:通过 rpmsg_char_create_eptdev 创建通信端点,rpmsg_char_destroy_eptdev 销毁端点
● 数据发送:send_msg 函数通过 write 接口向 RT-Thread 侧发送控制命令
● 数据接收:MotorStateThread 线程通过 recv_msg 函数接收 RT-Thread 侧的状态数据
● 数据同步:sync_data 函数在控制参数变化时触发数据传输
● 状态更新:MotorStateRecv 接收并更新电机状态数据到 UI 界面

创建打开Linux侧/dev/rpmsg字符设备节点,初始化电机ctrl_data结构体成员值

Linux MASTER端地址是0x1001,RT-Thread远端地址是0x3001

Linux侧将电机的启动停止,运行方向和电机位置控制值通过send_msg接口实际是write接口将ctrl_data结构体写入RT-Thread侧。
● 通信初始化:通过 rt_device_find 查找并打开 rpmsg 设备
● 线程创建:创建 rpmsg_ethercat_read 和 rpmsg_ethercat_write 线程
● 数据同步:使用 dynamic_sem 信号量实现数据传输同步
● 状态反馈:将电机状态实时更新到 ctrl_data 结构体并发送到 Linux 侧

创建打开RT-Thread侧/dev/rpmsg字符设备节点,创建两个rpmsg读写线程

RT-Thread源地址是0x3001,Linux目的地址是0x1001
RT-Thread侧 rpmsg读线程

rpmsg读线程里RT-Thread源端的电机控制值,电机运行状态,电机运行方向赋值给 ctrl_data结构体中
RT-Thread侧 rpmsg写线程

rpmsg写线程会不断的获取dynamic_sem信号量,这个信号量会在每次改变电机控制偏移值,改变电机运行状态,改变电机运行方向都会去释放,一旦获取到信号量就会通过rt_device_write接口将ctrl_data结构体写入到Linux目的端。
rpmsg 是一种用于 Linux 与 RT-Thread 操作系统之间进行多核异构通信的机制,是整个方案的技术核心。通过前面的实现分析,我们可以总结出以下技术要点:
● 双端通信:Linux 端作为 MASTER(地址 0x1001),RT-Thread 端作为 REMOTE(地址 0x3001)
● 数据结构:统一使用 motorctrl_data_t 结构体在两端传递数据,确保数据格式一致
● 传输机制:基于字符设备接口,通过 write/read 操作实现数据传输
● 低延迟:基于内核级通信机制,延迟低,满足实时控制需求
● 高可靠性:采用信号量同步机制,确保数据传输的完整性
● 双向通信:支持 Linux 到 RT-Thread 的控制命令传输,以及 RT-Thread 到 Linux 的状态数据回传
● 易于集成:提供了简洁的 API 接口,便于在应用层集成
● 端点管理:通过 rpmsg_char_create_eptdev 和 rpmsg_char_destroy_eptdev 管理通信端点
● 线程安全:使用独立的读写线程,确保通信的并发处理能力
● 错误处理:包含完善的设备查找、打开和通信错误处理机制
● 实时性保障:设置合理的线程优先级和通信周期,确保实时控制的响应速度
1. 控制命令流:Qt 界面 → Linux 应用 → rpmsg 发送 → RT-Thread 接收 → 电机控制
2. 状态数据流:电机状态 → RT-Thread 读取 → rpmsg 发送 → Linux 接收 → Qt 界面更新
这种双向数据流确保了用户操作与电机状态的实时同步,为整个系统提供了流畅的交互体验。
全部0条评论
快来发表一下你的评论吧 !