前言
在軟件世界里面,超時(shí)是一個(gè)非常重要的概念。比如
● 當(dāng)前線程暫時(shí)休眠1秒鐘,休眠結(jié)束后繼續(xù)執(zhí)行
● 每5秒鐘采集一下CPU利用率
● 數(shù)據(jù)發(fā)送失敗,2秒鐘以后再試一試
● 等待某種數(shù)據(jù),但最多等待50毫秒
應(yīng)用
//將當(dāng)前任務(wù)休眠若干tick數(shù),tick為時(shí)間單位,常見值為10毫秒
LITE_OS_SEC_TEXT UINT32 LOS_TaskDelay(UINT32 tick)
//獲取信號量semHandle, 如果當(dāng)前信號量不可用且timeout不為0,則最多等待timeout所指定的時(shí)間,在這段時(shí)間內(nèi)如果信號量可用,則獲取成功,否則獲取失敗。
LITE_OS_SEC_TEXT UINT32 LOS_SemPend(UINT32 semHandle, UINT32 timeout)
//從空的消息隊(duì)列讀取消息,或者向滿的消息隊(duì)列寫消息時(shí),如果timeout不為0,則最多等待timeout指定的時(shí)間,在這段時(shí)間內(nèi)消息隊(duì)列可讀或可寫,則進(jìn)行對應(yīng)的讀寫并返回成功,否則返回失敗。
LITE_OS_SEC_TEXT UINT32 LOS_QueueRead(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeOut)
LITE_OS_SEC_TEXT UINT32 LOS_QueueWrite(UINT32 queueID, VOID *bufferAddr, UINT32 bufferSize, UINT32 timeOut)
//獲取互斥鎖,如果當(dāng)前互斥鎖被其它線程占用,則最多等待timeout指定的時(shí)間,此時(shí)間內(nèi)其它線程釋放了互斥鎖并被本線程搶到則返回成功,否則返回失敗。
LITE_OS_SEC_TEXT UINT32 LOS_MuxPend(UINT32 muxHandle, UINT32 timeout)
//等待其它線程向本線程發(fā)送事件,最多等待timout指定的時(shí)間
LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeOut)
上述這些函數(shù)都是超時(shí)概念在OpenHarmony中liteos_m內(nèi)核里的具體應(yīng)用。
具體而言,liteos_m內(nèi)核如何實(shí)現(xiàn)這個(gè)超時(shí)邏輯的呢,我們接著看下一個(gè)章節(jié)
原理
如上圖所示。在時(shí)間軸上,黃色圓點(diǎn)代表需要進(jìn)行某種操作的時(shí)間點(diǎn),而綠色圓點(diǎn)為檢查系統(tǒng)是否有超時(shí)事件需要處理的檢查時(shí)間點(diǎn)。系統(tǒng)周期性的進(jìn)行檢查(周期單位為tick)。在2個(gè)檢查點(diǎn)之間可能有超時(shí)事件,也可能無超時(shí)事件。
例如,根據(jù)上圖展示的情況。當(dāng)前在第一個(gè)檢查點(diǎn),發(fā)現(xiàn)了2個(gè)超時(shí)事件,那么這次處理這2個(gè)超時(shí)事件;隨著時(shí)間流逝,箭頭來到第2個(gè)檢查點(diǎn),又發(fā)現(xiàn)2個(gè)超時(shí)事件,繼續(xù)處理;在第3個(gè)檢查點(diǎn)時(shí),本段時(shí)間內(nèi)無超時(shí)事件,所以是空操作。后續(xù)的檢查以此類推。
代碼實(shí)現(xiàn)
為了準(zhǔn)確性以及時(shí)效性,本文選取了最新的版本的代碼來描述。上述檢查點(diǎn)和時(shí)間點(diǎn)由鏈表結(jié)構(gòu)進(jìn)行定義。具體在kernel/liteos_m/include/los_sortlink.h文件中。
由于原理圖中的超時(shí)事件發(fā)生是非均勻的,且存在有序依次發(fā)生的邏輯,所以,這些信息被維護(hù)在雙向鏈表中(對刪除操作更友好)。
SortLinkList代表了鏈表中的每一個(gè)需要處理事件的時(shí)間點(diǎn),responseTime代表具體的時(shí)間值(從啟機(jī)開始的cpu cycle數(shù)目)。SortLinkAttribute代表鏈表的頭部(啞頭)。從名稱也能看出,這個(gè)是一個(gè)排序的雙向鏈表,排序的依據(jù)即responseTime這個(gè)數(shù)值。
需要注意的一個(gè)細(xì)節(jié)是:系統(tǒng)支持2個(gè)鏈表,其中一個(gè)是TASK鏈表,另一個(gè)是SWTMR鏈表。這2個(gè)鏈表實(shí)現(xiàn)方式一致,主要區(qū)別是,SWTMR鏈表超時(shí)處理是喚醒swtmr線程來處理超時(shí)事件,而task鏈表喚醒的是每個(gè)具體的task(sleep,ipc超時(shí)等場景)。使用swtmr線程來處理若干超時(shí)的機(jī)制,可以有效減少系統(tǒng)需要的線程數(shù)目,從而節(jié)省系統(tǒng)資源的占用。
總結(jié)
審核編輯:湯梓紅
-
代碼
+關(guān)注
關(guān)注
30文章
4723瀏覽量
68236 -
超時(shí)
+關(guān)注
關(guān)注
0文章
2瀏覽量
6766 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3641瀏覽量
16064
原文標(biāo)題:對OpenHarmony中LiteOS的內(nèi)核分析——超時(shí)原理和應(yīng)用
文章出處:【微信號:gh_e4f28cfa3159,微信公眾號:OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論