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