1. 什么是調度表
1.1 調度表概念
調度表由一系列按時間先后順序排序的終結點組成,其中每個終結點都有自己的任務,有的終結點可能是激活一系列的任務,有的是設置一系列的事件,還有的可能是既激活一系列的任務又設置一系列的事件。
調度表(ScheduleTables) 通過提供一組靜態定義的到期點(expiry points)的封裝來解決同步問題。每個到期點定義:
處理時必須發生的一個或多個動作,其中動作是任務(Task)的激活或事件(event)的設置。
從調度表(ScheduleTable)開始點一個以滴答(Tick)為單位的偏移量(Offset)。
終結點在調度表上是按偏移從小到大有序排列的,因此要保證每個終結點的偏移都是獨一無二的,不能有偏移相同的終結點。
每個調度表都有一個持續時間(Duration),即調度表的一次運行時間,度量單位為計數器的計數單位 Tick。
從調度表的起點到初始終結點的距離被稱為初始偏移(InitialOffset),相鄰終結點間的距離被稱為延遲(Delay),最后一個終結點到調度表終點的距離稱之為最后延遲(FinalDelay)。
InitialOffset,Delay和FinalDelay的取值范圍如公式3—1,3—2,3-3所示,其中OsCounterMinCycle是驅動計數器的最小循環值,OsCounterMaxAIIowedValue是驅動計數器的最大計數值。
除此之外,還要區分清楚幾個概念:
驅動計數器:驅動計數器是用于驅動整個調度表運行的計數器,驅動計數器的計數周期通常是固定的,并且要大于調度表中所有任務的最小執行間隔時間,以確保每個任務都能夠被執行到。驅動計數器用于控制任務執行的時間。
驅動計數器模數:就是驅動計數器的最大值,也就是一份調度表運行完,需要多少個counter。驅動計數器的模數被定義為OsCounterMaxAllowedValue + 1;
驅動計數器的模數通常不等于調度表的duration,而是大于調度表的duration。在實際的調度系統中,通常會將驅動計數器的模數設置為調度表的duration的整數倍,以確保調度表中的所有任務都能夠被完全執行。例如,如果調度表的duration為10ms,那么可以將驅動計數器的模數設置為20ms或者30ms等,以確保每個任務都能夠被執行到。
調度表的時間:調度表的持續時間通常是預先定義的,用于確定調度表中所有任務的執行時間范圍。
驅動計數器與調度表持續時間關系:驅動計數器與調度表時間相等嗎通常情況下,驅動計數器的計數周期不等于調度表的時間。驅動計數器是用于驅動整個調度表運行的計數器,它的計數周期通常是固定的,并且要大于調度表的時間,以確保調度表中的所有任務都能夠被執行到。
例如:驅動計數器的計數周期為1,即每個計數周期的時間為1個單位。調度表中有3個任務,分別為Task A、Task B和Task C,它們的執行時間分別為3、5和2個計數周期。
注意:Task A在第一個周期中執行時間為3個計數周期,在第二個周期中執行時間為4個計數周期,在第三個周期中執行時間為2個計數周期,在第四個周期中執行時間為3個計數周期,在第五個周期中執行時間為5個計數周期。在調度表中,每個任務的執行時間和間隔時間是預先定義的。Task A的間隔時間是指Task A完成一次執行后需要等待的時間,在實際的調度系統中,任務的間隔時間可能會受到多種因素的影響,例如任務的優先級、資源的競爭等。在設計和實現調度系統時,需要根據具體的應用場景和需求進行合理的設計和實現。
同步計數器:同步計數器是一個軟件計數器,用于同步任務的執行。顯示同步中同步計數器等于驅動計數器,當驅動計數器的計數值等于同步計數器的計數值時,任務調度器會檢查任務隊列中是否有需要執行的任務。如果有,則執行該任務,否則繼續等待下一個同步計數器的計數周期。這樣,就可以實現任務的精確調度和同步,從而保證系統的穩定性和可靠性。
操作系統計數器:操作系統計數器通常由操作系統內核實現,用于記錄系統運行時間和控制系統中各個模塊和任務的執行時間和間隔時間。每個OS Counter都有一個最大計數值(OsCounterMaxAllowedValue),它表示OS Counter的最大計數范圍。同時,每個OS Counter還有一個最小計數值(OsCounterMinCycle),它表示OS Counter的最小計數周期。OS Counter的最大計數值和最小計數周期可以用來確定驅動計數器的模數和調度表的持續時間。具體來說,驅動計數器的模數應該等于OS Counter的最大計數值+1,而調度表的持續時間應該等于OS Counter的最大計數值+1乘以OS Counter的最小計數周期。
1.2調度表圖示
其實調度表就是一份計劃表,類似于工作計劃,例如下圖:
假如tick是1ms,那么上面的調度表就是50ms要做的事情,做什么事情呢?
4ms要激活TaskA和TaskB,并設置一些Event
12ms不激活task,但是要設置Enent
20ms需要激活TaskA和TaskE
32ms需要激活TaskA和TaskE,并設置Event
40ms需要激活TaskB和TaskF,并設置Event
offset就是每個時間節點都有一個相對于調度表起始點的偏移值
2. 為什么要用調度表
調度表,可以用OS Alarm、OS Counter來實現,相當于到時間了就去激活task、設置Event,那么為什么要搞一個調度表的概念呢?
因為要同步:使在OSEK OS中,可以利用一個OSEK計數器和一組附屬于該計數器的自啟動報警器來實現靜態定義的任務激活機制。在簡單情況下,可以通過設置報警器一旦啟動就不能更改來實現。然而,如果在運行時對某個報警器進行修改,就很難保證報警器之間的相對同步。為此,AUTOSAR OS規范引入了調度表(ScheduleTable,ST)。
在AUTOSAR中,調度表是用于描述任務的執行順序和時間間隔的一種數據結構。Alarm是一種定時器,用于在指定的時間點或時間間隔觸發事件。當Alarm與調度表結合使用時,調度表可以保障Alarm的同步。
3. 調度表是如何用的
3.1.操作系統允許并發處理多個調度表
一個調度表只能被一個計數器驅動,而一個計數器能驅動多個調度表;
驅動計數器的一個Tick與調度表的一個Tick的分辨率一致;操作系統使用一個迭代器遍歷調度表上的所有終結點,按照offset的大小從初始終結點(InitialExpiryPoint)開始遍歷,直到最后一個終結點IFinaIExpiryPoint)為止。在處理終結點上的操作時,操作系統必須先激活完所有的任務后,才能設置事件。由于在一個終結點上很有可能對一個任務同時進行激活和設置事件的操作,如果先激活一個處于掛起態的任務,再對它設置事件,操作會成功執行,而如果順序相反則會導致操作失敗。因此,操作系統對終結點上操作的處理順序進行了嚴格的限制。
3.2. 調度表根據具體需求可配置為單次執行或重復執行
單次執行是調度表處理完最后一個終結點后進入停止狀態,不再繼續執行,主要用于對某個觸發進行響應:循環執行是調度表處理完最后一個終結點后再返回到第一個終結點,繼續執行,主要用于執行重復操作的特定應用。
重復執行,由于調度表的持續時間不一定等于驅動計數器的模數,因此不能保證同一個終結點在不同次執行時都在同一個絕對計數值上執行,而在某些情況下這是必需的,例如校正發動機的角旋轉度數,故需要同步機制來解決。
一個未使用同步策略的調度表在任意時刻總是處于下述三個狀態中的一個,詳細的狀態轉換模型如下圖所示。在任何時刻,都可以使用系統服務GetScheduleTableStatus0來獲取調度表的狀態。對于未使用同步策略的調度表來說,調度表的持續時間和驅動計數器的模數沒有潛在的關聯,但各終結點的偏移和延遲需要按照公式3-1、3-2、3-3設置。
3.3. 調度表有兩種類型的啟動方式
絕對啟動 StartScheduleTableAbs()和相對啟動StartScheduleTableRel0。調度表在被啟動后,將進入運行態。
絕對啟動是提供一個啟動值(Start),當驅動計數器的計數值與Start匹配時,操作系統將啟動調度表,該調度表的第一個終結點將在驅動計數器的計數值等于(Start+Initial Offset)時被處理。
相對啟動是提供一個偏移(Offset),當驅動計數器的計數值相對于現在(Now)增加了Offset個Tick后,操作系統將啟動調度表,該調度表上的第一個終結點將在驅動計數器的計數值與(Now +Offset+lnitial Offset)匹配時會被處理。
用戶能在任意時刻調用系統服務StopScheduleTable()立即終止一個正在處于運行態的調度表,被終止后,調度表將進入停止態。無論調度表被終止時處理到了哪個終結點,下次啟動時都將會從第一個終結點開始處理。此外,調度表在正常運行結束后,也會進入停止態。
當用戶調用NextScheduleTable0發出切換調度表的請求時,操作系統將繼續處理當前調度表,把被切換入的調度表的狀態修改為下一個,直至處理完當前調度表的最后一個終結點后,才會去啟動被切換入的調度表。
4. 調度表的同步
處理調度表上的初始終結點的絕對時間是用戶可控的。然后,如果調度表的運行模式是重復執行,將不能保證每次執行初始終結點的時間是一樣的。
該問題的產生,可能是由于調度表的持續時間不一定等于驅動計數器的模數導致的。
舉例:注:驅動計數器通常是用于驅動整個調度表的計數器。它的作用是根據預定的時間間隔來觸發調度表中各個任務的執行,從而實現任務的協調和調度。
假設調度表中有三個任務,任務A、任務B和任務C,它們的執行時間分別為2秒、3秒和4秒,也就是如果想要完整的執行三個任務需要9秒的時間。然而驅動計數器的模數為5秒,即當計數器達到5秒時會重新從0開始計數。也就是說任務C一直處于不執行的狀態。
5. AUTOSAR 操作系統規范提供了 2 種同步方式
隱式同步:
在隱式同步的情況下,調度表的更新和OS模塊的調度是隱式地同步的。即當調度表中的任務時間到達時,OS模塊不會立即調度該任務,而是等待下一個系統節拍時再調度該任務。因此,在隱式同步的情況下,任務的執行時間可能存在一定的誤差,并且無法保證任務的正確執行順序和時間間隔。
對于隱式同步而言,調度表的驅動計數器就是同步計數器,即調度表上的時間和驅動計數器上的時間保持一致。
隱式同步的調度表不需要操作系統的額外支持,但為了使調度表上的時間和驅動計數器的計數值一致,做了一些限制:調度表的持續時間必須等于驅動計數器的模數。如公式3-4所示:
也就是隱式同步的操作系統模塊的調度表(ScheduleTable)(每個調度表都有一個持續時間(Duration))應具有等于其關聯 OSEK OS 計數器的 OsCounterMaxAllowedValue + 1 的持續時間。
注意:驅動計數器的模數被定義為OsCounterMaxAllowedValue + 1。其中,OsCounterMaxAllowedValue是一個常數,表示驅動計數器的最大計數值。而+1是因為計數器從0開始計數,因此最大計數值需要加上1才能得到模數。
為了使調度表達到同步,操作系統需要在一個己知的計數值啟動調度表,這意味著調度表使用隱式同步策略時,只能使用絕對啟動,不能使用相對啟動。在調度表被絕對啟動后,若終結點的偏移與驅動計數器的計數值匹配時,該終結點將會被處理。為了保證調度表和驅動計數器同步,通常的做法是在驅動計數器的計數值為0時啟動調度表,即使用StartScheduleTableAbs(Tbl,0),如圖所示:StartScheduleTableAbs(Tbl,0)是一個API函數,用絕對啟動啟動一個調度表,并將其絕對時間點設置為0。它的作用是將調度表的執行時間點設置為系統啟動的時間點,從而讓調度表從頭開始執行。
其實說白了隱式同步就是在running和SYNC開始的節點,用絕對啟動StartScheduleTableAbs(Tbl,0)使調度表 OS Counter的計數周期應該等于任務調度表的持續時間。讓兩者運行一致。從而實現調度表的周期性執行。
顯示同步:
在顯示同步的情況下,調度表的更新和OS模塊的調度是顯式地同步的。即當調度表中的任務時間到達時,OS模塊會立即調度該任務,并執行該任務的任務函數。因此,在顯示同步的情況下,任務的執行時間是準確的,并且可以保證任務的正確執行順序和時間間隔。
顯式同步是指調度表的驅動計數器和同步計數器不是同一個計數器,但是這 2 個計數器 tick 的周期是一樣的。
顯式同步的調度表(ScheduleTable)需要操作系統模塊的額外支持。調度表(ScheduleTable)正常情況下,由操作系統模塊的計數器驅動,被稱為驅動計數器(drive Counter)。但處理過程需要與不屬于操作系統模塊的計數器對象的另一種計數器進行同步,此類進行同步的計數器被稱為同步計數器(synchronization Counter)。
在調度表(ScheduleTable)、操作系統模塊的計數器和同步計數器之間必須強制執行以下約束:
約束1:顯式同步的調度表(ScheduleTable)的持續時間不應大于驅動計數器(drive Counter)的模數。
約束2:顯式同步的調度表(ScheduleTable)的持續時間應等于同步計數器(synchronization Counter)的模數。
約束3:同步計數器(synchronization Counter)應與調度表(ScheduleTable)相關聯的驅動計數器drive Counter)具有相同的分辨率。這意味著調度表(ScheduleTable)上的滴答與同步計數器(synchronization Counter)上的滴答具有相同的持續時間。
如上圖所示:初始時調度表處于狀態 STOPPED,調用函數 StartScheduleTableSync()后,進入狀態 WAITING。WAITING 狀態一直持續到用戶調用 SyncScheduleTable(),
對每一個調度表初次調用 SyncScheduleTable()之后,調度表進入 RUNNING_AND_SYNCHRONOUS 狀態。如果用戶對一個周期調度表沒有再次調用 SyncScheduleTable(),那么調度表將一直處在 RUNNING_AND_SYNCHRONOUS 狀態,但是當用戶由于某種原因再次調用 SyncScheduleTable()后,系統會進行調度表與同步計數器之間的偏移值計算。如果計算出的偏移值大于調度表偏移的容忍度,那么調度表就會進入 RUNNING 狀態,并且系統會進行調度表同步,直到調度表的偏移值小于等于調度表的偏移容忍度之后停止同步,調度表再次進入 RUNNING_ AND_SYNCHRONOUS 狀態。
-
封裝
+關注
關注
126文章
7901瀏覽量
142966 -
計數器
+關注
關注
32文章
2256瀏覽量
94575 -
AUTOSAR
+關注
關注
10文章
362瀏覽量
21588 -
調度機制
+關注
關注
0文章
4瀏覽量
6786
原文標題:AUTOSAR-OS的調度機制-調度表
文章出處:【微信號:汽車電子嵌入式,微信公眾號:汽車電子嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論