问题
下位(arm 单片机)在控制电机时要求有比较精准的周期而上位机(linux kernel)线程受操作系统负载和调度方式的影响无法精准控制,两者之间要如何同步?
解决思路
利用下位可以反馈精确的控制时间这一点来缓解上位机时间不准的问题。
具体方法
1.在下位机上设置指令缓存,一次从上位机接收一定数量的指令,假设为N,减少上位机时间不准时带来影响;
2.制定通信协议,下位机按固定周期(30ms)往上位机发送状态数据,数据包里包含下位机的时间信息或是这是第几个包,上位机收到这两种信息之后(任意一种),都能确定下位机的准确的时间;
3.上位机拿到逻辑层的控制指令时(与接收下位机数据的线程不是一个线程),不立刻下发到下位机,而是记录到一个command house里;
4.上位机的接收线程,在收到下位机的message之后,进行处理,由于tcp存在粘包问题,这时候收到的可以不只一个包(下位机过了好几个发送周期),上位机要根据2中协议里的数据来确定下位机的准确时间;
5.将发送动作放到上位机的接收线程中,如里是第一次收到下位机的数据,则从3里的command house里拿N个指令数据发送到下位机,如是不是第一次收到下位机的数据,则收到几帧下位机的数据就从command house中拿几帧指令发送到下位机,使下位机的指令缓存中始终保持为N;
总结:
上位机的时间难以精准控制,在与具有精准控制周期的下位机进行同步时带来了挑战,利用下位机精准的反馈时间,现加上同步缓存,可以在很大程度上解决这个问题。