前言
首先,請(qǐng)問大家?guī)讉€(gè)小小問題,你清楚:
基于AUTOSAR的應(yīng)用層如何獲取準(zhǔn)確的時(shí)間戳嗎?
時(shí)間同步的具體過程包含哪些細(xì)節(jié)呢?
如何正確地獲取到全局時(shí)間戳呢?
今天,我們來一起探索并回答這些問題。為了便于大家理解,以下是本文的主題大綱:
正文
時(shí)間同步軟件框架
正如前文《AUTOSAR基礎(chǔ)篇之CanTsyn》所述,CanTsyn模塊負(fù)責(zé)時(shí)間同步之間的協(xié)議處理,StbM模塊則用來負(fù)責(zé)抽象底層不同的時(shí)間同步協(xié)議,為上層提供統(tǒng)一的時(shí)間戳接口以及當(dāng)前的時(shí)間同步狀態(tài)的接口。
通過如下圖1所示的Tsync則用來代表基于不同總線通訊的時(shí)間同步協(xié)議,StbM則是時(shí)間同步協(xié)議層基礎(chǔ)上的抽象,OS作為Triggered Customer,SW-C則作為Active Customer,后文將解釋這兩者之間的區(qū)別。
圖1 AUTOSAR時(shí)間同步協(xié)議軟件框架
在上圖中,我們可以看到存在5個(gè)不一樣的數(shù)據(jù)流,下面將一一解釋每個(gè)數(shù)據(jù)流的基本作用:
數(shù)據(jù)流1表示StbM主動(dòng)調(diào)用TriggerCustomer提供的函數(shù)接口來完成時(shí)間同步,當(dāng)前主要應(yīng)用場景為OS Schedule Table的同步;
數(shù)據(jù)流2表示Active Customer(SW-C)主動(dòng)調(diào)用StbM提供的標(biāo)準(zhǔn)接口來獲取當(dāng)前時(shí)間戳或者時(shí)間同步狀態(tài);
數(shù)據(jù)流3表示Active Customer(SW-C)主動(dòng)調(diào)用StbM提供的標(biāo)準(zhǔn)接口來更新StbM維護(hù)的時(shí)間基準(zhǔn);
數(shù)據(jù)流4表示StbM模塊通過Tsyn模塊提供的標(biāo)準(zhǔn)函數(shù)接口來更新StbM的時(shí)間基準(zhǔn);
數(shù)據(jù)流5表示StbM模塊主動(dòng)通過Tsyn模塊提供的標(biāo)準(zhǔn)函數(shù)接口來將當(dāng)前的時(shí)間同步信息發(fā)送到相應(yīng)的bus總線上。
在時(shí)間同步領(lǐng)域內(nèi)涉及到諸多專有名詞,因此為了便于大家理解后續(xù)的內(nèi)容,有必要在此跟大家解釋些重要的標(biāo)準(zhǔn)術(shù)語,具體細(xì)節(jié)如下圖2所示:
圖2 時(shí)間同步標(biāo)準(zhǔn)術(shù)語解釋
啟動(dòng)階段
在該階段StbM模塊將會(huì)提供完成必要的初始化來提供針對(duì)上層應(yīng)用的時(shí)間同步服務(wù)。
前置條件
StbM模塊通過調(diào)用函數(shù)接口StbM_Init來完成初始化工作,但是在此之前需務(wù)必完成基礎(chǔ)通訊模塊的初始化,如Canif模塊初始化,CanTsyn模塊初始化等。
初始化
通過調(diào)用上述函數(shù)完成初始化之后,將會(huì)完成如下基本動(dòng)作:
變量StbMSynchrinizedTimeBase將會(huì)被初始化為0;
timeBaseStatus將會(huì)將所有的bit初始化為0;
如果參數(shù)StbMStoreTimebaseNonVolatile等于STORAGE_AT_SHUTDOWN,那么就會(huì)從NVM中獲取數(shù)據(jù)(一般包含s跟ns部分),如果NVM獲取數(shù)據(jù)不成功,則都會(huì)賦值為0處理。
正常工作
Synchronized Time Base
每一次調(diào)用函數(shù)接口StbM_BusSetGlobalTime()時(shí)就會(huì)更新對(duì)應(yīng)的同步time base以及對(duì)應(yīng)的Time Base Status。
Time Master 同步狀態(tài)監(jiān)控
如下圖3所示,一個(gè)全局時(shí)間網(wǎng)絡(luò)至少一個(gè)Time Master跟一個(gè)Time Slave, Time Master將會(huì)將其時(shí)間信息傳遞至在同一Time Domain下的Time Slave。
圖3 Time Master 同步狀態(tài)更新示意圖
由上圖可知,Time Master通過reference本地clock來更新本地全局時(shí)間,然后通過sync/FUP報(bào)文發(fā)送給到總線上。其中,如果Time Domain為0-15則為synchronized time base,而Time Domain 16-31則為Offset Time Base。
通過調(diào)用函數(shù)接口 StbM_GetCurrentTime() 來獲取當(dāng)前對(duì)應(yīng)Time Domain下的Time Base,對(duì)應(yīng)的timebasestatus以及user data;
通過調(diào)用函數(shù)接口StbM_GetCurrentTimeRaw() 來獲取當(dāng)前時(shí)間Time Base的ns部分;
通過調(diào)用函數(shù)接口StbM_GetCurrentTimeDiff() 來獲取輸入的時(shí)間戳與當(dāng)前時(shí)間戳的時(shí)間間隔,單位為ns;
通過調(diào)用函數(shù)接口StbM_BusSetGlobalTime()來更新當(dāng)前的Time Base以及設(shè)置對(duì)應(yīng)的timebaseStatus;
通過調(diào)用函數(shù)接口 StbM_SetGlobalTime()并且會(huì)就將GLOBAL_TIME_BASE bit位置1,同時(shí)清除其他bit 位;
Time Slave 同步狀態(tài)監(jiān)控
如下圖4所示體現(xiàn)了Time Slave的數(shù)據(jù)流交互關(guān)系,在下圖中我們可以看到Time Slave會(huì)接收來自同一Time Domin下的sync/fup 報(bào)文,同時(shí)加上本地計(jì)算出來的接收sync/fup報(bào)文的時(shí)間差最終用于更新當(dāng)前StbM的Time Base,該Time Base將最終被應(yīng)用到應(yīng)用層。
圖4 Time Slave同步狀態(tài)更新圖
Time Slave在完成上述時(shí)間同步的過程中,需要注意幾點(diǎn):
每次更新調(diào)用函數(shù)StbM_BusSetGlobalTime時(shí),都會(huì)比較下當(dāng)前更新的時(shí)間戳與當(dāng)前內(nèi)部正在使用的時(shí)間戳的差值是否超過StbMSyncLossThreshold參數(shù)設(shè)定的值,如果該值為0,則會(huì)取消該部分的檢查,如果超過了設(shè)定的值, 那么將會(huì)將timeBaseStatus中的狀態(tài)位TIMELEAP 置1;
如果下一次更新,差值保證在范圍內(nèi),那么timeBaseStatus中的狀態(tài)位TIMELEAP將會(huì)被清0;
TIme Slave會(huì)實(shí)時(shí)確認(rèn)下當(dāng)前的時(shí)間戳與最近一次調(diào)用該函數(shù)的時(shí)間差距是否在參數(shù)StbMSyncLossTimeout設(shè)定的范圍內(nèi),如果Timeout發(fā)生,那么需置timeBaseStatus中的TIMEOUT bit位,一旦調(diào)用StbM_BusSetGlobalTime函數(shù)將會(huì)清除該TIMEOUT bit位。
如果從來沒有發(fā)生過時(shí)間同步, 那么TIMEOUT位將不會(huì)置位,只要發(fā)生過一次成功的時(shí)間同步,后續(xù)同步?jīng)]有按照預(yù)期發(fā)送,那么就會(huì)啟動(dòng)這個(gè)Timeout檢查。
如果參數(shù)syncToTimeBase設(shè)定為sync to GTM,那么調(diào)用StbM_BusSetGlobalTime() 將會(huì)清除timeBaseStatus中的SYNC_TO_GATEWAY bit位;
如果參數(shù)syncToTimeBase設(shè)定為sync to subdomain,那么調(diào)用StbM_BusSetGlobalTime() 將會(huì)置位timeBaseStatus中的SYNC_TO_GATEWAY bit位;
一旦調(diào)用函數(shù)接口fStbM_BusSetGlobalTime(),那么就會(huì)設(shè)置timeBaseStatus中的GLOBAL_TIME_BASE Bit位,一旦置位,則不會(huì)清除。
Time Gateway同步狀態(tài)監(jiān)控
Time Gateway既作為屬于某個(gè)Time Domain的Time slave,同時(shí)也會(huì)作為某個(gè)Time Domain下的Time Master而存在,如果存在Time Gateway的節(jié)點(diǎn),那么必然存在Time SubDomain的概念。
如果Time Gateway作為某個(gè)Time Domain的Time Slave存在,同樣存在著如下特性需要了解:
每次更新調(diào)用函數(shù)StbM_BusSetGlobalTime時(shí),都會(huì)比較下當(dāng)前更新的時(shí)間戳與當(dāng)前內(nèi)部正在使用的時(shí)間戳的差值是否超過StbMSyncLossThreshold參數(shù)設(shè)定的值,如果該值為0,則會(huì)取消該部分的檢查,如果超過了設(shè)定的值, 那么將會(huì)將timeBaseStatus中的狀態(tài)位TIMELEAP 置1;
如果下一次更新,差值保證在范圍內(nèi),那么timeBaseStatus中的狀態(tài)位TIMELEAP將會(huì)被清0;
TIme Slave會(huì)實(shí)時(shí)確認(rèn)下當(dāng)前的時(shí)間戳與最近一次調(diào)用該函數(shù)的時(shí)間差距是否在參數(shù)StbMSyncLossTimeout設(shè)定的范圍內(nèi),如果Timeout發(fā)生,那么需置timeBaseStatus中的TIMEOUT bit位,一旦調(diào)用StbM_BusSetGlobalTime函數(shù)將會(huì)清除該TIMEOUT bit位。
如果從來沒有發(fā)生過時(shí)間同步, 那么TIMEOUT位將不會(huì)置位,只要發(fā)生過一次成功的時(shí)間同步,后續(xù)同步?jīng)]有按照預(yù)期發(fā)送,那么就會(huì)啟動(dòng)這個(gè)Timeout檢查。
如果參數(shù)syncToTimeBase設(shè)定為sync to GTM,那么調(diào)用StbM_BusSetGlobalTime() 將會(huì)清除timeBaseStatus中的SYNC_TO_GATEWAY bit位;
如果參數(shù)syncToTimeBase設(shè)定為sync to subdomain,那么調(diào)用StbM_BusSetGlobalTime() 將會(huì)置位timeBaseStatus中的SYNC_TO_GATEWAY bit位;
一旦調(diào)用函數(shù)接口fStbM_BusSetGlobalTime(),那么就會(huì)設(shè)置timeBaseStatus中的GLOBAL_TIME_BASE Bit位,一旦置位,則不會(huì)清除。
Offset Time Base
對(duì)于Offset Time Base,相比Synchronized Time Base存在著如下一些特性:
每次調(diào)用StbM_SetOffset()就會(huì)用來更新相應(yīng)的Time base的 Offset Time;
函數(shù)StbM_SetOffset() 與StbM_GetOffset() 只能接收16-31的TimeBaseId;
每一次調(diào)用函數(shù)StbM_GetOffset()將會(huì)返回對(duì)應(yīng)的Offset Time Base的Offset Time;
在配置上也會(huì)存在限制,即只有StbMSynchronizedTimeBaseIdentifier為16至31,StbMOffsetTimeBase才會(huì)真實(shí)有效。
Customer
Customers作為理解為基于StbM模塊基礎(chǔ)之上的一種應(yīng)用角色,按照其功能作用可劃分為如下兩種角色:
Active customers:顧名思義就是一種主動(dòng)觸發(fā)調(diào)用StbM相關(guān)函數(shù)接口的應(yīng)用角色;
Triggered customers:就是一種被動(dòng)被StbM模塊調(diào)用其自身接口的應(yīng)用角色;
Active customers
對(duì)于Active customers,為了便于理解,我們可以列出如下場景來體現(xiàn)其基本作用:
讀取當(dāng)前的time base value,同步狀態(tài)以及user data;
設(shè)置對(duì)應(yīng)time base的value以及相應(yīng)的user data;
Triggered customers
對(duì)于Triggered customer,當(dāng)前僅用于同步OS的schedule table,通過調(diào)用OS提供的API函數(shù) SyncScheduleTable() 來實(shí)現(xiàn)Schedule Table之間的counter同步。
通過配置參數(shù)STBM_TRIGGERED_CUSTOMER_PERIOD來完成StbM定周期調(diào)用上述函數(shù)接口來完成各個(gè)sechdule table的os counter間的同步;
同時(shí)StbM僅在Schedule Table 處于WAITING,RUNNING,或者 RUNNING_SYNCHRONOUS狀態(tài)時(shí)完成同步,因此也就意味著StbM在同步前先要確認(rèn)下當(dāng)前需同步的Schedule Table的狀態(tài),然后才能進(jìn)行同步。
關(guān)閉階段
針對(duì)Shutdown階段,僅存在一個(gè)需要做的操作,如果參數(shù)StbMStoreTimebaseNonVolatile等于STORAGE_AT_SHUTDOWN,那么便會(huì)將當(dāng)前實(shí)時(shí)時(shí)間戳(S跟ns部分)存儲(chǔ)在NVM中。
常用函數(shù)接口說明
為了便于大家了解StbM模塊所提供的基本功能,因此將常見的函數(shù)接口列舉如下,以方便大家的查閱:
圖5 StbM模塊常用函數(shù)接口
編輯:黃飛
-
AUTOSAR
+關(guān)注
關(guān)注
10文章
349瀏覽量
21444 -
總線通訊
+關(guān)注
關(guān)注
0文章
23瀏覽量
10744
原文標(biāo)題:AUTOSAR基礎(chǔ)篇之StbM
文章出處:【微信號(hào):eng2mot,微信公眾號(hào):汽車ECU開發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論