基于ZYNQ 的多轴运动控制平台关键技术研发-Linux+xenomai开源实时系统设计(三)
4.3 非周期任务通信技术
在多轴运动控制过程中,双核系统非周期任务通信主要用于实现 Linux 系统对伺服系统的信息读取,如伺服参数。
4.3.1 数据链路设计
在非周期任务通信中,双核系统的通信数据多样化,消息长度不固定。因此采用可变长度邮箱完成非周期通信的数据链路,并使用核间信号量完成系统通信状态的切换。非周期任务通信的数据链路如图 4.13 所示,在 OCM 上完成数据帧的定义。
同时,Linux 系统和伺服系统在应用程序中定义相应的数据帧,用于保存目的数据帧和响应数据帧。

在非周期通信过程中,设置核间信号量表示 OCM 的访问状态。当核间信号量为
1 时,表示 OCM 空闲,非周期通信未开始或已完成;当核间信号量为 0 时,表示
OCM 忙,非周期通信正在进行。双核系统通过核间信号量确定通信的实时状态,从而进行具体操作并完成状态切换。在 OCM 上完成可变长度邮箱的定义,用于保存通信数据帧。通信开始后,Linux 系统发起任务通信,将封装完成的数据帧写进邮箱;伺服系统从邮箱中读取数据帧并完成解析,响应完成后将响应数据封装成新的数据帧,重新写进邮箱。
4.3.2 基于轮询机制的非周期任务实现
非周期任务通信不会周期性发生,因此本文提出基于伺服系统轮询信号量的通信方法。在伺服系统中循环查询非周期通信的信号量,根据信号量判断 Linux 是否发起通信;如果通信已经发起,则伺服系统进行响应操作,完成核间通信任务。
双核间非周期性任务通信的流程如图 4.14 所示。其中,Linux 系统的具体操作如下:(1)根据系统命令完成目的数据帧的封装;
(2)读取核间信号量,判断通信是否处于存在错误或超时,如果有错误或超时则进行相应处理;(3)通信状态正常,将目 的数据帧写入邮箱;(4)数据帧写入完成后,设置核间信号量,通知伺服进行响应;
(5)查询核间信号量,判断伺服是否完成响应;(6)伺服响应成功后,读取伺服响应帧数据(7)Linux 系统任务通信结束。
伺服系统的具体操作如下:(1)通过 while(1)程序轮询核间信号量,判断通信是否处于存在错误或超时,如果有错误或超时则进行相应处理;(2)如果 Linux 已发起任务通信,则从邮箱中读取目的数据帧;(3)解析目的数据帧,完成相应的指令操作;
(4)将响应数据封装成数据帧,并重新写入邮箱;5)数据帧写入完成后,设置核间信号量,通知 Linux 系统已完成响应;(6)伺服系统任务通信结束。

4.4 周期任务通信技术
在多轴运动控制过程中,双核系统的周期任务通信主要用于完成周期性控制指令的更新和伺服反馈数据的读取,进而实现多轴运动控制。
4.4.1 数据链路设计
在周期任务通信中,双核系统的通信数据类别固定,数据量小。因此采用固定长度邮箱完成周期通信的数据链路,并使用核间信号量完成系统通信状态的切换。周期通信数据分为控制指令和反馈数据两类,在双核间进行单向传输。为了提高数据传输效率,分别设置发送邮箱区和接收邮箱区。其中,发送邮箱区保存 Linux 系统的控制指令,接收邮箱区保存伺服系统的反馈数据。周期任务通信数据链路如图 4.15 所示。

周期通信过程中,设置核间信号量表示OCM的访问状态。当核间信号量为1时,表示 OCM 空闲,周期通信未开始或已完成;当核间信号量为 0 时,表示 OCM 忙,周期通信正在进行。双核系统通过核间信号量确定通信的实时状态,从而进行具体操作并完成状态切换。在 OCM 上完成发送邮箱区和接收邮箱区的定义,用于保存通信数据。在通信周期内,Linux 系统从接收邮箱区读取反馈数据,并将控制指令写入发送邮箱区;伺服系统从发送邮箱区读取控制指令,并将反馈数据写入接收邮箱区。
4.4.2 基于硬件中断机制的周期任务实现
双核间周期任务通信采用 FPGA 硬件中断进行,即 Linux 系统和伺服系统均同步与 FPGA。在 FPGA 中断信号到来时,双核系统分别进行响应,通过执行中断服务程序完成双核间数据通信。
为了保证实时性,Linux 系统通过 Xenomai 完成中断服务,如图 4.16 和图 4.17
所示。在用户程序中首先创建一个 Xenomai 域下的实时任务线程,该任务实现了循环等待中断信号的功能。在 Adeos 进行任务调度时,会将 Xenomai 等待信号的任务加入到等待队列中,此时线程进入睡眠。当系统接收到 FPGA 的中断信号时,Xenomai
的实时线程将被唤醒。线程唤醒后,执行中断服务函数实现周期任务通信。


双核间周期性任务通信的流程如图 4.18 所示。其中,Linux 系统的具体操作如下:(1)完成看门狗清零并清除中断标志,表明 Linux 系统接收到中断并进行处理;
(2)读取核间信号量,判断通信是否处于存在错误或超时,如果有错误或超时则进行相应处理;(3)通信状态正常,则切换响应缓存区,从接收邮箱区中读取响应数据;
(4)读取完成后,切换指令缓存区,将控制指令写给发送邮箱区;(5)写入完成后,设置信号量,通知伺服进行响应;(6)Linux 系统任务通信结束。
伺服系统的具体操作如下:(1)完成看门狗清零并清除中断标志,表明伺服系统接收到中断并进行处理;(2)轮询核间信号量,判断通信是否处于存在错误或超时,如果有错误或超时则进行相应处理;(3)如果 Linux 已发起任务通信,则切换指令缓存区,从发送邮箱区中读取指令数据;(4)读取完成后,切换响应缓存区,将伺服响应数据写给接收邮箱区;(5)写入完成后,设置信号量,周期任务通信状态恢复为空闲态;(6)伺服系统任务通信结束。

信迈提供ZYNQ+LINUX+XENOMAI的实时运动控制解决方案。