0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

超時(shí)邏輯在OpenHarmony中的實(shí)現(xiàn)

OpenAtom OpenHarmony ? 來源:OpenAtom OpenHarmony ? 作者:冷欽街 ? 2022-07-06 09:52 ? 次閱讀

前言

在軟件世界里面,超時(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í)概念在OpenHarmonyliteos_m內(nèi)核里的具體應(yīng)用。

具體而言,liteos_m內(nèi)核如何實(shí)現(xiàn)這個(gè)超時(shí)邏輯的呢,我們接著看下一個(gè)章節(jié)

原理

e249022e-fc63-11ec-ba43-dac502259ad0.png

如上圖所示。在時(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文件中。

e25d21be-fc63-11ec-ba43-dac502259ad0.png

由于原理圖中的超時(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é)

本文描述了超時(shí)邏輯在OpenHarmony中的實(shí)現(xiàn),從原理,使用以及具體實(shí)現(xiàn)細(xì)節(jié)上進(jìn)行了詳盡討論,并歸納整理了當(dāng)前這種實(shí)現(xiàn)方式所帶來的益處。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何利用OpenHarmony實(shí)現(xiàn)智能控設(shè)備面板的設(shè)計(jì)

    。如何實(shí)現(xiàn)多種家庭設(shè)備的集中管理和遠(yuǎn)程控制,是智能家居功能的體現(xiàn)?;谝陨媳尘埃疚奶岢隽艘环N基于OpenHarmony設(shè)計(jì)實(shí)現(xiàn)智能控設(shè)備,目的是使開發(fā)者了解集成設(shè)備進(jìn)行統(tǒng)一管理控制
    發(fā)表于 03-21 09:20

    深度剖析OpenHarmony應(yīng)用/服務(wù)的邏輯結(jié)構(gòu)

    OpenHarmony APP工程結(jié)構(gòu)進(jìn)行OpenHarmony應(yīng)用/服務(wù)開發(fā)前,應(yīng)該掌握OpenHarmony應(yīng)用/服務(wù)的邏輯結(jié)構(gòu)。
    發(fā)表于 04-12 11:11

    app圖標(biāo)動(dòng)效openharmony的源碼上哪里實(shí)現(xiàn)的?

    openharmony點(diǎn)擊一個(gè)app圖標(biāo)的之后,應(yīng)用會(huì)從左上角一點(diǎn)點(diǎn)放大直至鋪滿屏幕;我想問一下這個(gè)動(dòng)效是openharmony的源碼上的哪里實(shí)現(xiàn)的?
    發(fā)表于 06-10 11:01

    三步就能在OpenHarmony實(shí)現(xiàn)車牌識(shí)別

    識(shí)別結(jié)果如下所示:開發(fā)流程本車牌識(shí)別項(xiàng)目使用 OpenHarmony 的媒體子系統(tǒng)實(shí)現(xiàn)。代碼基于停車場景下的本地車牌識(shí)別。進(jìn)行講解,其代碼結(jié)構(gòu)如下:三方庫移植EasyPR 實(shí)現(xiàn)是基于
    發(fā)表于 07-06 11:20

    OpenHarmonyLiteOS的內(nèi)核分析——超時(shí)原理和應(yīng)用

    )。使用swtmr線程來處理若干超時(shí)的機(jī)制,可以有效減少系統(tǒng)需要的線程數(shù)目,從而節(jié)省系統(tǒng)資源的占用??偨Y(jié)本文描述了超時(shí)邏輯OpenHarmony
    發(fā)表于 07-11 17:47

    每日推薦 | 單片機(jī)畢業(yè)設(shè)計(jì)實(shí)例匯總,OpenHarmony 智能家居項(xiàng)目分享

    :本文描述了超時(shí)邏輯OpenHarmony實(shí)現(xiàn),從原理,使用以及具體
    發(fā)表于 07-12 10:26

    Android實(shí)現(xiàn)屏幕關(guān)閉超時(shí)的正確方法是什么?

    CUSTOM IMX8MPlus 板上使用 Android 11.2.6。我想在 10 秒后實(shí)現(xiàn)屏幕超時(shí),然后雙擊再次打開屏幕。 如果我 Settings.System
    發(fā)表于 04-14 07:15

    Qt For OpenHarmony

    ;OpenHarmony本身觸屏的輸入、鼠標(biāo)/鍵盤的輸入怎么能夠把它映射到Qt本身的應(yīng)用程序框架里去。需要了解Qt的QPA實(shí)現(xiàn)及系統(tǒng)接口調(diào)用的相關(guān)邏輯,就能實(shí)現(xiàn)Qt應(yīng)用程序
    發(fā)表于 09-15 15:39

    基于公平心跳超時(shí)容錯(cuò)機(jī)制

    故障誤判損失模型,提出公平誤判損失(FMJL)算法,使其同時(shí)滿足長作業(yè)和短作業(yè)要求;接著,設(shè)計(jì)并實(shí)現(xiàn)了基于FMJL算法的公平超時(shí)機(jī)制。實(shí)現(xiàn)了公平
    發(fā)表于 01-02 10:43 ?0次下載

    如何實(shí)現(xiàn)事件結(jié)構(gòu)存在多個(gè)超時(shí)的功能

    實(shí)現(xiàn)事件結(jié)構(gòu)存在多個(gè)超時(shí)的功能
    發(fā)表于 04-03 14:57 ?2次下載

    基于OpenCV開源庫開發(fā)的OpenHarmony實(shí)現(xiàn)車牌識(shí)別

    ? 張榮 OpenHarmony 知識(shí)體系工作組 介紹 本車牌識(shí)別項(xiàng)目是基于開源項(xiàng)目 EasyPR(Easy to do Plate Recognition)實(shí)現(xiàn)。EasyPR 是一個(gè)開源的中文車牌
    的頭像 發(fā)表于 06-30 11:16 ?5288次閱讀

    STM32程序超時(shí)設(shè)計(jì)

    軟件超時(shí)機(jī)制 1、背景 嵌入式軟件程序設(shè)計(jì)過程,經(jīng)常會(huì)遇到超時(shí)(或定時(shí))的處理情況,基本處理思想是
    的頭像 發(fā)表于 06-22 10:52 ?1108次閱讀
    STM32程序<b class='flag-5'>超時(shí)</b>設(shè)計(jì)

    寫芯片超時(shí)該如何解決???

    寫芯片超時(shí)該如何解決??? 芯片在現(xiàn)代電子設(shè)備扮演著至關(guān)重要的角色。它們是設(shè)備內(nèi)部運(yùn)行的核心,控制著所有的操作。然而,由于各種原因,芯片可能會(huì)發(fā)生超時(shí)問題。超時(shí)問題一旦發(fā)生,可能會(huì)導(dǎo)致
    的頭像 發(fā)表于 09-13 10:43 ?3328次閱讀

    Java CompletableFuture 異步超時(shí)實(shí)現(xiàn)探索

    簡介 JDK 8 CompletableFuture 沒有超時(shí)中斷任務(wù)的能力?,F(xiàn)有做法強(qiáng)依賴任務(wù)自身的超時(shí)實(shí)現(xiàn)。本文提出一種異步超時(shí)
    的頭像 發(fā)表于 07-25 14:06 ?287次閱讀

    socket連接超時(shí)如何處理

    實(shí)現(xiàn)以及網(wǎng)絡(luò)環(huán)境。 1. 理解Socket連接超時(shí) TCP/IP協(xié)議,socket連接超時(shí)通常指的是在建立連接、發(fā)送數(shù)據(jù)或接收數(shù)據(jù)的過程
    的頭像 發(fā)表于 11-01 16:48 ?257次閱讀