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

NB―IoT物理控制信道NB―PDCCH及資源調(diào)度機制

AUTOSAR調(diào)度表可調(diào)度性的形式化分析

評論