CAN协议的核心是非破坏性仲裁机制(Non-destructive Arbitration)。优先级通过标识符(ID)的值定义,标识符越小,优先级越高。
在仲裁过程中,所有节点同时监视总线信号。
当一个节点在发送过程中检测到总线上的信号与自己发送的不同(自身发送“1”却检测到“0”),它会立即退出仲裁,转为监听状态。
最终,优先级最高的节点赢得仲裁,成功发送数据。
这种机制保障了总线的高效利用,但也带来了低优先级帧可能长期无法发送的风险。
在极端情况下,如果高优先级帧的发送间隔小于或等于低优先级帧的发送间隔,低优先级帧会持续在仲裁中失败。这种情况称为“总线饥饿”或“优先级反转”问题。
例如:高优先级帧每5ms发送一次。低优先级帧每10ms发送一次。
如果两个帧同时到达发送队列,高优先级帧将总是赢得仲裁,导致低优先级帧可能永远无法发送。
CAN协议本身并未直接解决优先级反转问题,因此需要通过系统设计和应用层协议来确保低优先级帧的发送。
但可以通过以下措施解决:
1
时间触发通信调度(TTC)
时间触发通信调度通过预定义的时间表,确保各个节点在特定的时间段内发送帧。如下:
周期性帧调度:定义不同优先级帧的发送周期,确保每帧都有机会发送。例如,可以在5ms内分配若干时间窗口给高优先级和低优先级帧。
发送时间偏移:在节点内引入发送时间偏移,使得高优先级帧和低优先级帧发送时不会总是同时触发仲裁。
2
软件死锁检测与重传机制
节点内部的软件可以检测低优先级帧长时间未成功发送的情况:如果检测到帧长期饥饿,可以通过人工增加重发频率或强制暂停高优先级帧的发送,给低优先级帧留出发送机会。
3
动态优先级调整
某些应用层协议(如CANopen或J1939)允许动态调整帧的优先级。例如:在低优先级帧因饥饿而长期无法发送时,可以暂时调高其优先级。一旦发送成功,恢复其正常优先级。
4
CAN FD的应用
对于数据量较大的应用,可以考虑CAN FD(Flexible Data-rate):通过较大的数据负载能力减少帧数量,从而降低仲裁冲突概率。结合时间触发模式进一步优化调度。
5
帧合并技术
在应用层中,可以将多个低优先级数据帧合并为一个帧,减少仲裁失败的次数。
通过协议层和应用层结合设计,低优先级帧可以被可靠地发送出去,保证系统的整体性能和稳定性。