QA1:CAN報(bào)文發(fā)送,有優(yōu)先級(jí)嗎? 答:有。以英飛凌tc3xx系列為例,MCMCAN模塊有多個(gè)硬件發(fā)送緩沖區(qū),也就是說(shuō)同一時(shí)刻可以緩存多個(gè)待發(fā)送的報(bào)文,這些報(bào)文放入待發(fā)送的緩沖區(qū)以后,會(huì)置位發(fā)送Pending標(biāo)志,等待發(fā)送,誰(shuí)先發(fā)送呢?在回答這個(gè)問(wèn)題之前,我們先說(shuō)待發(fā)送的報(bào)文在硬件緩存區(qū)中的存儲(chǔ)方式:Dedicated Tx Buffers 、Tx FIFO、 Tx Queue。 對(duì)于Dedicated Tx Buffers與 Tx Queue兩種存儲(chǔ)方式,根據(jù)lowest Message ID原則發(fā)送,即:發(fā)送的CanID數(shù)值越小,優(yōu)先級(jí)越高。具體發(fā)送順序示例如下: 如果使用Dedicated Tx Buffers與 Tx Queue兩種存儲(chǔ)方式,優(yōu)先級(jí)低的報(bào)文(比如:網(wǎng)絡(luò)管理報(bào)文、診斷報(bào)文、標(biāo)定報(bào)文等,優(yōu)先級(jí)比應(yīng)用報(bào)文低),是不是永遠(yuǎn)得不到發(fā)送了?不是,我們要清楚:發(fā)送的硬件緩存區(qū)不止一個(gè),而是多個(gè)(比如:tc397有32個(gè)發(fā)送緩沖區(qū)),足以在某一時(shí)刻緩存多個(gè)待發(fā)送的報(bào)文。是否存在某一時(shí)刻(如下t1),發(fā)送報(bào)文的個(gè)數(shù)超過(guò)硬件緩存區(qū)個(gè)數(shù)?這種可能性是存在的,這也是為什么會(huì)有發(fā)送報(bào)文丟幀的原因。 QA2:Tx FIFO發(fā)送方式可能引發(fā)的問(wèn)題有什么? 答:對(duì)于CAN報(bào)文,使用FIFO方式發(fā)送,我能想到的場(chǎng)景:診斷中,發(fā)送診斷指令使用FIFO緩存,保證診斷指令請(qǐng)求的順序。不知道大家在何種情況下使用過(guò)Tx FIFO,還請(qǐng)大家給普及。 這里思考到了一種工況,可能會(huì)因使用FIFO發(fā)送方式,導(dǎo)致報(bào)文的發(fā)送延遲,具體如下所示: 假設(shè):CAN BUS上有兩個(gè)節(jié)點(diǎn):ECU1::CAN1和ECU2::CAN1,ECU1::CAN1使用Tx FIFO緩存待發(fā)送數(shù)據(jù),ECU2::CAN1使用Dedicated Tx Buffers方式緩存待發(fā)送數(shù)據(jù)。在某一時(shí)刻,ECU1::CAN1的Buffer Index0待發(fā)送報(bào)文的CAN ID = 0x30,ECU2::CAN1待發(fā)送的6個(gè)報(bào)文的CAN ID <0x30,所以,每次總線仲裁,都會(huì)優(yōu)先發(fā)送ECU2::CAN1緩存的報(bào)文,而ECU1::CAN1因?yàn)榭偩€仲裁失敗,導(dǎo)致ECU1::CAN1 FIFO中的高優(yōu)先級(jí)報(bào)文無(wú)法及時(shí)發(fā)送出去,如下所示: 所以,在使用Tx FIFO方式時(shí),需要注意此工況。 QA3:程序應(yīng)先處理發(fā)送報(bào)文還是應(yīng)該先處理接收?qǐng)?bào)文? 對(duì)于一個(gè)節(jié)點(diǎn),接收?qǐng)?bào)文數(shù)量存在不確定性,比如:接收的報(bào)文類型如果有事件性應(yīng)用報(bào)文、高周期應(yīng)用報(bào)文(如:1ms周期性應(yīng)用報(bào)文)等。那么Com_MainFunctionRx()的處理時(shí)間就會(huì)存在一定的不確定性。相對(duì)于接收?qǐng)?bào)文,節(jié)點(diǎn)發(fā)送報(bào)文的數(shù)量相對(duì)比較確定,發(fā)送所消耗的時(shí)間也比較確定,所以,從處理順序上來(lái)說(shuō),先處理確定的發(fā)送再處理不確定的發(fā)送比較合理,這樣可以確保發(fā)送報(bào)文的時(shí)間。而對(duì)于接收,即使超一點(diǎn)時(shí)間,如果Task沒有超過(guò)Deadline Time,對(duì)程序的運(yùn)行也不會(huì)造成太大影響。 再者,對(duì)于CAN報(bào)文,發(fā)送報(bào)文還需要進(jìn)行總線仲裁,仲裁失敗也會(huì)存在一定的延時(shí)(參考QA2)。 注意:上述假設(shè)OS所使用的基準(zhǔn)計(jì)數(shù)器是可信的,即:基礎(chǔ)計(jì)數(shù)器準(zhǔn)確,一般由GPT或者STM驅(qū)動(dòng)。 QA4:周期型報(bào)文Offset的作用是啥? 答:降低同一時(shí)刻,多個(gè)發(fā)送報(bào)文的Burst Send問(wèn)題。這個(gè)問(wèn)題屬于QA1的延申。 一個(gè)節(jié)點(diǎn),發(fā)送的報(bào)文類型可以有多種(QA1提到)。其中,節(jié)點(diǎn)外發(fā)的應(yīng)用報(bào)文從幾個(gè)到幾十個(gè)不等。應(yīng)用報(bào)文又分為事件型、周期型、混合型。以周期型應(yīng)用報(bào)文為例,可能有5ms、10ms、20ms、50ms等周期。如果本節(jié)點(diǎn)外發(fā)的報(bào)文數(shù)量較大,在某一時(shí)刻會(huì)存在大量并發(fā)請(qǐng)求。比如:MsgA Cycle =5ms,MsgB Cycle = 10ms,MsgC Cycle = 10ms,如果MsgA的發(fā)送時(shí)刻為5ms、10ms、15ms、20ms、25ms、30ms.....MsgB、MsgC的發(fā)送時(shí)刻為10ms、20ms、30ms.....,在time = 10ms、time = 30ms......等時(shí)刻,MsgA 、MsgB、MsgC會(huì)同時(shí)請(qǐng)求發(fā)送,節(jié)點(diǎn)要發(fā)送的報(bào)文數(shù)量越多,某一時(shí)刻(如下圖time = 10ms 時(shí)刻),請(qǐng)求發(fā)送的報(bào)文數(shù)量可能就越多。 參考資料 SIMPLE TITLE |
|
來(lái)自: 開心果NeedCar > 《待分類》