uv0tz4vuv0s64012787303.gif
6 Z$ S( c9 O' T7 t9 D% t. b1 T# p
点击上方蓝色字体,关注我们& C/ h& C* T7 R, `2 ]9 w% T
, c$ \ ?' v. i d$ U
在仲裁过程中,所有节点同时监视总线信号。. A! F! U! ~. b+ C: b- p
+ K; v& S: t# e2 }( R" F9 U8 P: Z当一个节点在发送过程中检测到总线上的信号与自己发送的不同(自身发送“1”却检测到“0”),它会立即退出仲裁,转为监听状态。
( W" _$ J4 p! G7 S' W7 P
& \ ^. Y. D4 x& B( q8 P% s最终,优先级最高的节点赢得仲裁,成功发送数据。0 ^! r7 Y/ Y4 V/ a
1 _6 m; j+ `# N
这种机制保障了总线的高效利用,但也带来了低优先级帧可能长期无法发送的风险。, S2 f, x" b; y" _8 i
- I' B* N2 D$ s M
在极端情况下,如果高优先级帧的发送间隔小于或等于低优先级帧的发送间隔,低优先级帧会持续在仲裁中失败。这种情况称为“总线饥饿”或“优先级反转”问题。* o) t. Y. B" u" H& r
8 {) t) w7 X0 ~. }例如:高优先级帧每5ms发送一次。低优先级帧每10ms发送一次。
5 y2 u+ D! {/ R4 p0 _0 V1 K
, |6 ^: q" `* _0 |如果两个帧同时到达发送队列,高优先级帧将总是赢得仲裁,导致低优先级帧可能永远无法发送。9 V3 _9 i1 W7 q: \) D$ [( }
1 K. N P+ ?2 l$ N& @3 B* _
CAN协议本身并未直接解决优先级反转问题,因此需要通过系统设计和应用层协议来确保低优先级帧的发送。
3 }5 c+ w/ K# u* c8 M5 z+ |0 [2 `; ~& |/ }
但可以通过以下措施解决:
! E. V' |0 ]# c9 |0 ?5 G14 e" }7 v; }) P$ P6 j8 g
时间触发通信调度(TTC)
5 g+ W! x, S8 C9 n0 @. ~时间触发通信调度通过预定义的时间表,确保各个节点在特定的时间段内发送帧。如下:
8 u3 }) w9 [8 a( u$ m2 V) ]周期性帧调度:定义不同优先级帧的发送周期,确保每帧都有机会发送。例如,可以在5ms内分配若干时间窗口给高优先级和低优先级帧。发送时间偏移:在节点内引入发送时间偏移,使得高优先级帧和低优先级帧发送时不会总是同时触发仲裁。* ]( ]* [6 T7 C0 r. S' R
{! R( j3 J/ q3 ]2
2 a& f- O+ b3 F0 n7 l软件死锁检测与重传机制9 R" P! O. y( H# { `
节点内部的软件可以检测低优先级帧长时间未成功发送的情况:如果检测到帧长期饥饿,可以通过人工增加重发频率或强制暂停高优先级帧的发送,给低优先级帧留出发送机会。9 ?: }6 Z8 X7 p9 g
3
. }8 U1 N7 C6 F动态优先级调整
1 B% v$ F3 R* I某些应用层协议(如CANopen或J1939)允许动态调整帧的优先级。例如:在低优先级帧因饥饿而长期无法发送时,可以暂时调高其优先级。一旦发送成功,恢复其正常优先级。
: a; }$ f" h+ P) G# o# K4
, k! Z" J8 U3 W& L- [CAN FD的应用
t) Q. |/ C! ^" Q- |! b- Q4 _' e% ^4 a对于数据量较大的应用,可以考虑CAN FD(Flexible Data-rate):通过较大的数据负载能力减少帧数量,从而降低仲裁冲突概率。结合时间触发模式进一步优化调度。5 y0 S* E# W1 J4 J- d3 L7 c
0 b* n. ], Y) K* Y' Q, l5- J6 m$ M7 P$ v: }; l* ]2 H. M
帧合并技术& I& }$ K6 a( e* ~8 j1 y
在应用层中,可以将多个低优先级数据帧合并为一个帧,减少仲裁失败的次数。% l+ d& }3 ]/ W: O
. e& i/ Y% X8 i. G* {8 T! r通过协议层和应用层结合设计,低优先级帧可以被可靠地发送出去,保证系统的整体性能和稳定性。8 H6 m* v/ P7 A; R" {
tpcxnm0cwuh64012787404.jpg
/ e( R P1 R5 `; H- g8 t, O! ^
lg2kxsn550l64012787504.gif
* H) |3 L" k' A o k$ H
点击阅读原文,更精彩~ |