睿擎平台核间通讯实践:QT与电机控制的无缝集成

频道:保险市场 日期: 浏览:53964

一、 方案核心概述

本方案旨在解决系统开发中“高性能实时控制与“丰富人机交互”的需求矛盾。它采用混合部署的架构,将系统清晰地分为两个层面:

1.实时层:部署在睿擎派设备的RT-Thread实时系统中,负责执行高频率、高确定性的核心控制算法、EtherCat 等工业总线通信、故障保护等硬实时任务。

2.交互层:基于Qt Framework开发,运行在Linux操作系统上,提供图形化用户界面,用于参数配置、状态监控、曲线显示、数据记录、报警管理和网络通信等软实时或非实时任务。

两个层面通过高速通信机制进行数据交换和指令传递,从而形成一个兼顾实时性能与开发效率的完整解决方案。

二、睿擎派运行混合部署方案

混合部署双系统指的是单一芯片上同时运行两个系统,既运行Linux,又运行RT-Thread系统。

●Linux 系统:运行在应用核心,负责图形界面和非实时任务

●RT-Thread 系统:运行在实时核心,负责电机控制和实时通信

●核间通信通道:基于 rpmsg 机制实现两个系统间的高速数据交换,是整个方案的技术核心

睿擎派RC3506上运行Linux系统日志图通过串口1查看

4a8bf4c2-1231-11f1-96ea-92fbcf53809c.png

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

三、Linux 侧 QT 应用界面与核间通讯实现

1.UI 设计与实现

4aa3d218-1231-11f1-96ea-92fbcf53809c.png

2.QT界面绘制及业务逻辑核心代码

●绘制电机启停按钮

●设计电机运行方向控制

●实现电机期望位置和当前位置显示

●创建位置曲线实时显示界面

4acbb738-1231-11f1-96ea-92fbcf53809c.png

3.Linux 侧核间通讯实现

●rpmsg 端点管理:通过 rpmsg_char_create_eptdev 创建通信端点,rpmsg_char_destroy_eptdev 销毁端点

●数据发送:send_msg 函数通过 write 接口向 RT-Thread 侧发送控制命令

●数据接收:MotorStateThread 线程通过 recv_msg 函数接收 RT-Thread 侧的状态数据

●数据同步:sync_data 函数在控制参数变化时触发数据传输

●状态更新:MotorStateRecv 接收并更新电机状态数据到 UI 界面

4ad672a4-1231-11f1-96ea-92fbcf53809c.png

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

4adde192-1231-11f1-96ea-92fbcf53809c.png

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

4ae9c5ac-1231-11f1-96ea-92fbcf53809c.png

Linux侧将电机的启动停止,运行方向和电机位置控制值通过send_msg接口实际是write接口将ctrl_data结构体写入RT-Thread侧。

四、RT-Thread侧核间通讯实现

●通信初始化:通过 rt_device_find 查找并打开 rpmsg 设备

●线程创建:创建 rpmsg_ethercat_read 和 rpmsg_ethercat_write 线程

●数据同步:使用 dynamic_sem 信号量实现数据传输同步

●状态反馈:将电机状态实时更新到 ctrl_data 结构体并发送到 Linux 侧

4afb0a38-1231-11f1-96ea-92fbcf53809c.png

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

4b09b16e-1231-11f1-96ea-92fbcf53809c.png

RT-Thread源地址是0x3001,Linux目的地址是0x1001

RT-Thread侧 rpmsg读线程

4b1193f2-1231-11f1-96ea-92fbcf53809c.png

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

RT-Thread侧 rpmsg写线程

4b1c9d38-1231-11f1-96ea-92fbcf53809c.png

rpmsg写线程会不断的获取dynamic_sem信号量,这个信号量会在每次改变电机控制偏移值,改变电机运行状态,改变电机运行方向都会去释放,一旦获取到信号量就会通过rt_device_write接口将ctrl_data结构体写入到Linux目的端。

五、核间通讯技术总结

rpmsg 是一种用于 Linux 与 RT-Thread 操作系统之间进行多核异构通信的机制,是整个方案的技术核心。通过前面的实现分析,我们可以总结出以下技术要点:

1.通信架构

●双端通信:Linux 端作为 MASTER(地址 0x1001),RT-Thread 端作为 REMOTE(地址 0x3001)

●数据结构:统一使用 motorctrl_data_t 结构体在两端传递数据,确保数据格式一致

●传输机制:基于字符设备接口,通过 write/read 操作实现数据传输

2.技术优势

●低延迟:基于内核级通信机制,延迟低,满足实时控制需求

●高可靠性:采用信号量同步机制,确保数据传输的完整性

●双向通信:支持 Linux 到 RT-Thread 的控制命令传输,以及 RT-Thread 到 Linux 的状态数据回传

●易于集成:提供了简洁的 API 接口,便于在应用层集成

3.实现要点

●端点管理:通过 rpmsg_char_create_eptdev 和 rpmsg_char_destroy_eptdev 管理通信端点

●线程安全:使用独立的读写线程,确保通信的并发处理能力

●错误处理:包含完善的设备查找、打开和通信错误处理机制

●实时性保障:设置合理的线程优先级和通信周期,确保实时控制的响应速度

4.数据流程

1.控制命令流:Qt 界面 → Linux 应用 → rpmsg 发送 → RT-Thread 接收 → 电机控制

2.状态数据流:电机状态 → RT-Thread 读取 → rpmsg 发送 → Linux 接收 → Qt 界面更新

这种双向数据流确保了用户操作与电机状态的实时同步,为整个系统提供了流畅的交互体验。

  • 随机文章
  • 热门文章
  • 热评文章