在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

從數(shù)據(jù)結(jié)構(gòu)和算法解析OpenHarmony的事件機(jī)制

OpenAtom OpenHarmony ? 來(lái)源:OpenAtom OpenHarmony ? 作者:蔣衛(wèi)峰、陳利明 ? 2022-06-16 09:46 ? 次閱讀

近年來(lái),國(guó)內(nèi)開(kāi)源實(shí)現(xiàn)跨越式發(fā)展,并成為企業(yè)提升創(chuàng)新能力、生產(chǎn)力、協(xié)作和透明度的關(guān)鍵。作為 OpenAtom OpenHarmony(以下簡(jiǎn)稱(chēng)“OpenHarmony”)開(kāi)源項(xiàng)目共建單位之一,深開(kāi)鴻以成為智能物聯(lián)網(wǎng)操作系統(tǒng)領(lǐng)軍者為戰(zhàn)略目標(biāo),基于 OpenHarmony 聚焦智能物聯(lián)網(wǎng)操作系統(tǒng)(KaihongOS)的技術(shù)研發(fā)與持續(xù)創(chuàng)新。身為深開(kāi)鴻 OS 內(nèi)核開(kāi)發(fā)師,我們常年深耕于 OpenHarmony 的內(nèi)核開(kāi)發(fā),希望通過(guò)分享一些工作上的經(jīng)驗(yàn),幫助大家掌握開(kāi)源知識(shí)。OpenHarmony LiteOS-M 內(nèi)核是面向 IoT 領(lǐng)域構(gòu)建的輕量級(jí)物聯(lián)網(wǎng)操作系統(tǒng)內(nèi)核,具有小體積、低功耗、高性能的特點(diǎn),其代碼結(jié)構(gòu)簡(jiǎn)單,實(shí)現(xiàn)了進(jìn)程、線(xiàn)程、內(nèi)存等管理機(jī)制,提供了常見(jiàn)任務(wù)間 IPC、軟定時(shí)器等公共模塊,大幅度降低了嵌入式設(shè)備開(kāi)發(fā)的難度。目前 OpenHarmony 的事件提供一種任務(wù)間的 IPC,即一個(gè)或多個(gè)任務(wù)可以通過(guò)寫(xiě)一個(gè)或多個(gè)不同的事件來(lái)觸發(fā)內(nèi)核調(diào)度,讓另一個(gè)等待讀取事件的任務(wù)進(jìn)入運(yùn)行狀態(tài),從而實(shí)現(xiàn)任務(wù)間的同步。對(duì)于嵌入式開(kāi)發(fā)工作人員和技術(shù)愛(ài)好者來(lái)說(shuō),深入了解常見(jiàn)任務(wù)間 IPC,有助于學(xué)習(xí)和研發(fā)內(nèi)核。本文將從數(shù)據(jù)結(jié)構(gòu)和算法解析 OpenHarmony 的事件機(jī)制,帶大家深入了解內(nèi)核任務(wù)間 IPC 原理。

關(guān)鍵數(shù)據(jù)結(jié)構(gòu)

在解讀事件的源碼之前,首先了解下事件的關(guān)鍵的數(shù)據(jù)結(jié)構(gòu) PEVENT_CB_S:
typedef struct tagEvent {    UINT32 uwEventID;           LOS_DL_LIST stEventList; /**< Event control block linked list */  }EVENT_CB_S,*PEVENT_CB_S;
uwEventID:即標(biāo)記任務(wù)的事件類(lèi)型,每個(gè)bit可以標(biāo)識(shí)一個(gè)事件,最多支持 31 個(gè)事件(第 25bit 保留)。stEventList:即事件控制塊的雙向循環(huán)鏈表,理解這個(gè)字段是理解事件的關(guān)鍵。在雙向循環(huán)鏈表中唯一不變的節(jié)點(diǎn)就是頭節(jié)點(diǎn),而這里的 stEventList 就是頭節(jié)點(diǎn)。當(dāng)有任務(wù)等待事件但事件還沒(méi)發(fā)生時(shí),任務(wù)會(huì)被掛載到等待鏈表中;當(dāng)事件發(fā)生時(shí),系統(tǒng)喚醒等待事件的任務(wù),此時(shí)任務(wù)就會(huì)被剔出鏈表。

事件初始化

下面是事件初始化源碼:
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB){    if (eventCB == NULL) {        return LOS_ERRNO_EVENT_PTR_NULL;    }    eventCB->uwEventID = 0;    LOS_ListInit(&eventCB->stEventList);    OsHookCall(LOS_HOOK_TYPE_EVENT_INIT, eventCB);    return LOS_OK;}

PEVENT_CB_S 相當(dāng)于 EVENT_CB_S *, 因此 eventCB 是指針。

說(shuō)明事件控制塊由任務(wù)自己創(chuàng)建,內(nèi)核事件模塊只負(fù)責(zé)維護(hù)。任務(wù)定義自己的事件控制塊變量,通過(guò) LOS_EventInit 初始化,此時(shí)沒(méi)有事件發(fā)生,事件鏈表為空。

用圖來(lái)表達(dá)就是:

d55e716e-ecac-11ec-ba43-dac502259ad0.png

事件寫(xiě)操作

任務(wù)可以通過(guò) LOS_EventWrite 來(lái)寫(xiě)觸發(fā)一個(gè)或多個(gè)事件:
LITE_OS_SEC_TEXT UINT32 LOS_EventWrite(PEVENT_CB_S eventCB, UINT32 events){    ...    eventCB->uwEventID |= events;                    ---1    if (!LOS_ListEmpty(&eventCB->stEventList)) {     ---2        for (resumedTask = LOS_DL_LIST_ENTRY((&eventCB->stEventList)->pstNext, LosTaskCB, pendList);             &resumedTask->pendList != (&eventCB->stEventList);) { -------3            nextTask = LOS_DL_LIST_ENTRY(resumedTask->pendList.pstNext, LosTaskCB, pendList);
            if (((resumedTask->eventMode & LOS_WAITMODE_OR) && (resumedTask->eventMask & events) != 0) ||                ((resumedTask->eventMode & LOS_WAITMODE_AND) &&                 ((resumedTask->eventMask & eventCB->uwEventID) == resumedTask->eventMask))) {                exitFlag = 1;
                OsSchedTaskWake(resumedTask);       ---4            }            resumedTask = nextTask;        }
        if (exitFlag == 1) {            LOS_IntRestore(intSave);            LOS_Schedule();                        ---5            return LOS_OK;        }    }    ...}
1處,保存事件使用的或運(yùn)算操作,因此一個(gè)或多個(gè)任務(wù)可以寫(xiě)一個(gè)或多個(gè)事件,寫(xiě)一次或多次,而且每次為不同的事件,多次寫(xiě)同一個(gè)事件相當(dāng)于只寫(xiě)了一次;2處,有事件發(fā)生了就該檢查是否有任務(wù)在等待事件,事件鏈表不為空說(shuō)明有任務(wù)在等待事件;3處,遍歷事件鏈表,喚醒符合條件的任務(wù)。LOS_DL_LIST_ENTRY((&eventCB->stEventList)->pstNext,LosTaskCB,pendList) 前面提到,頭節(jié)點(diǎn)是空節(jié)點(diǎn),第一次遍歷從頭節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)開(kāi)始,后續(xù)再依次找出 nextTask,直到回到頭節(jié)點(diǎn);4處,針對(duì)事件讀取模式,找到滿(mǎn)足條件的任務(wù)并喚醒該任務(wù);5處,一旦匹配到等待事件的任務(wù),則執(zhí)行任務(wù)調(diào)度,被喚醒的任務(wù)得到執(zhí)行。

寫(xiě)事件實(shí)際操作如下圖:

d56d742a-ecac-11ec-ba43-dac502259ad0.png

事件讀操作

LiteOS 為用戶(hù)提供了兩個(gè)事件的函數(shù):● LOS_EventPoll():根據(jù)任務(wù)傳入的事件值、掩碼及校驗(yàn)?zāi)J剑祷貪M(mǎn)足條件的事件,任務(wù)可以主動(dòng)檢查事件是否發(fā)生而不必被掛起;● LOS_EventRead():讀取事件,可以理解為阻塞式讀,如果事件沒(méi)有發(fā)生,可以指定等待時(shí)間,掛起當(dāng)前任務(wù)。

下面是 LOS_EventPoll() 的實(shí)現(xiàn):

LITE_OS_SEC_TEXT UINT32 LOS_EventPoll(UINT32 *eventID, UINT32 eventMask, UINT32 mode){    UINT32 ret = 0;    UINT32 intSave;
    if (eventID == NULL) {        return LOS_ERRNO_EVENT_PTR_NULL;    }    intSave = LOS_IntLock();    if (mode & LOS_WAITMODE_OR) {        if ((*eventID & eventMask) != 0) {      ---1            ret = *eventID & eventMask;        }    } else {        if ((eventMask != 0) && (eventMask == (*eventID & eventMask))) {   ---2            ret = *eventID & eventMask;        }    }    if (ret && (mode & LOS_WAITMODE_CLR)) {   ---3        *eventID = *eventID & ~(ret);    }    LOS_IntRestore(intSave);    return ret;}
1處,如果讀取模式是LOS_WAITMODE_OR,只要有一個(gè)事件發(fā)生則讀取成功,返回發(fā)生的那個(gè)事件;2處,如果讀取模式LOS_WAITMODE_AND,全部檢查事件發(fā)生才算讀取成功,并返回全部發(fā)生事件;3處,事件讀取成功后事件控制塊中的事件標(biāo)記怎么處理?這里通過(guò)LOS_WAITMODE_CLR來(lái)決定是否清除事件標(biāo)記。

可以看出以上實(shí)現(xiàn)了兩種事件的讀取方式:一種是多個(gè)事件只要一個(gè)發(fā)生就算發(fā)生,另一種是全部事件發(fā)生才算發(fā)生。

下面是 LOS_EventRead():

LITE_OS_SEC_TEXT UINT32 LOS_EventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeOut){    ...    ret = LOS_EventPoll(&(eventCB->uwEventID), eventMask, mode);           ---1    OsHookCall(LOS_HOOK_TYPE_EVENT_READ, eventCB, eventMask, mode, timeOut);    if (ret == 0) {        if (timeOut == 0) {            LOS_IntRestore(intSave);            return ret;        }
        if (g_losTaskLock) {            LOS_IntRestore(intSave);            return LOS_ERRNO_EVENT_READ_IN_LOCK;        }        runTsk = g_losTask.runTask;        runTsk->eventMask = eventMask;        runTsk->eventMode = mode;        OsSchedTaskWait(&eventCB->stEventList, timeOut);                  ---2        LOS_IntRestore(intSave);        LOS_Schedule();                                                   ---3
        intSave = LOS_IntLock();        if (runTsk->taskStatus & OS_TASK_STATUS_TIMEOUT) {            runTsk->taskStatus &= ~OS_TASK_STATUS_TIMEOUT;            LOS_IntRestore(intSave);            return LOS_ERRNO_EVENT_READ_TIMEOUT;        }
        ret = LOS_EventPoll(&eventCB->uwEventID, eventMask, mode);       ---4    }     ...}
1處,主動(dòng)查詢(xún)想要的事件是否已經(jīng)發(fā)生;2處,如果事件沒(méi)有發(fā)生,就把當(dāng)前任務(wù)掛起到等待事件鏈表中;3處,如果事件沒(méi)有發(fā)生,當(dāng)前讀事件的任務(wù)被掛起,讓出 CPU4處,事件發(fā)生時(shí)等待事件的任務(wù)被調(diào)度再次獲得 CPU 恢復(fù)執(zhí)行,讀取事件。

事件讀寫(xiě)整個(gè)過(guò)程串起來(lái)如下圖所示:

d5865e54-ecac-11ec-ba43-dac502259ad0.png

事件銷(xiāo)毀操作

做事有始有終,事件消費(fèi)完成剩下的事情是清除事件和等待事件的任務(wù)鏈表。
LITE_OS_SEC_TEXT_MINOR UINT32 LOS_EventClear(PEVENT_CB_S eventCB, UINT32 eventMask){    ...    eventCB->uwEventID &= eventMask;    ...}

LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventDestroy(PEVENT_CB_S eventCB){    ...    eventCB->stEventList.pstNext = (LOS_DL_LIST *)NULL;    eventCB->stEventList.pstPrev = (LOS_DL_LIST *)NULL;    ...}
在 LOS_EventClear 中通過(guò)使 eventMask=0 來(lái)清空事件,在 LOS_EventDestroy 中清空事件鏈表指針。

小結(jié)

看了上面的描述,相信大家對(duì) OpenHarmony LiteOS-M 內(nèi)核事件的運(yùn)作機(jī)制有了更加深刻的理解,開(kāi)發(fā)者可以更好地使用事件的 API 來(lái)進(jìn)行任務(wù)間的同步操作,也可以進(jìn)一步嘗試修改內(nèi)核事件通知機(jī)制,做出一個(gè)更適合自己任務(wù)的IPC機(jī)制。

OpenHarmony 生態(tài)建設(shè)離不開(kāi)每位開(kāi)發(fā)者的參與,希望有更多的開(kāi)發(fā)者分享自己開(kāi)源項(xiàng)目的經(jīng)驗(yàn)和成果,共同為 OpenHarmony 生態(tài)建設(shè)貢獻(xiàn)一份力量。

原文標(biāo)題:OpenHarmony——內(nèi)核對(duì)象事件之源碼詳解

文章出處:【微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

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

    關(guān)注

    3

    文章

    1410

    瀏覽量

    41117
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40606
  • 事件機(jī)制
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    6283
  • OpenHarmony
    +關(guān)注

    關(guān)注

    27

    文章

    3835

    瀏覽量

    18171

原文標(biāo)題:OpenHarmony——內(nèi)核對(duì)象事件之源碼詳解

文章出處:【微信號(hào):gh_e4f28cfa3159,微信公眾號(hào):OpenAtom OpenHarmony】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數(shù)據(jù)結(jié)構(gòu)算法中文第
    發(fā)表于 12-20 21:22

    數(shù)據(jù)結(jié)構(gòu)算法分析

    數(shù)據(jù)結(jié)構(gòu)算法分析
    發(fā)表于 06-05 10:46

    OpenHarmony——內(nèi)核IPC機(jī)制數(shù)據(jù)結(jié)構(gòu)解析

    的頭部。六、總結(jié)本篇文章通過(guò)數(shù)據(jù)結(jié)構(gòu)的隊(duì)列、事件、互斥鎖、信號(hào)量四大方面對(duì)內(nèi)核IPC機(jī)制數(shù)據(jù)結(jié)構(gòu)進(jìn)行解析,希望以上的講解能給大家建立一個(gè)IPC機(jī)制
    發(fā)表于 09-05 11:02

    OpenHarmony——內(nèi)核IPC機(jī)制數(shù)據(jù)結(jié)構(gòu)解析

    涉及到哪些關(guān)鍵數(shù)據(jù)結(jié)構(gòu)?這些數(shù)據(jù)結(jié)構(gòu)又是如何工作的?接下來(lái)我將從隊(duì)列、事件、互斥鎖、信號(hào)量幾個(gè)內(nèi)核對(duì)象出發(fā),為大家講解內(nèi)核IPC機(jī)制數(shù)據(jù)結(jié)構(gòu)。二、
    發(fā)表于 09-08 11:44

    數(shù)據(jù)結(jié)構(gòu)教程,下載

    1. 數(shù)據(jù)結(jié)構(gòu)的基本概念 2. 算法數(shù)據(jù)結(jié)構(gòu)3. C語(yǔ)言的數(shù)據(jù)類(lèi)型及其算法描述要點(diǎn)4. 學(xué)習(xí)算法
    發(fā)表于 05-14 17:22 ?0次下載
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>教程,下載

    數(shù)據(jù)結(jié)構(gòu)算法習(xí)題

    數(shù)據(jù)結(jié)構(gòu)算法習(xí)題,ACM專(zhuān)用,刷題初期按照這個(gè)地方刷很好
    發(fā)表于 03-03 18:25 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)算法

    全國(guó)C語(yǔ)言考試公共基礎(chǔ)知識(shí)點(diǎn)——數(shù)據(jù)結(jié)構(gòu)算法,該資料包含了有關(guān)數(shù)據(jù)結(jié)構(gòu)算法的全部知識(shí)點(diǎn)。
    發(fā)表于 03-30 14:27 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)算法分析

    一部淺顯易懂的介紹數(shù)據(jù)結(jié)構(gòu)算法的書(shū)籍。
    發(fā)表于 07-14 17:12 ?0次下載

    引入深度遍歷機(jī)制的分布式數(shù)據(jù)結(jié)構(gòu)插值算法

    引入深度遍歷機(jī)制的分布式數(shù)據(jù)結(jié)構(gòu)插值算法_龔健虎
    發(fā)表于 01-08 14:55 ?0次下載

    算法數(shù)據(jù)結(jié)構(gòu)——接口

    第三章為算法數(shù)據(jù)結(jié)構(gòu),本文為3.2.3 接口。
    的頭像 發(fā)表于 09-19 17:41 ?8849次閱讀
    <b class='flag-5'>算法</b>與<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>——接口

    大牛分享平時(shí)如何學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法

    數(shù)據(jù)結(jié)構(gòu)算法的地位對(duì)于一個(gè)程序員來(lái)說(shuō)不言而喻。今天這篇文章不是來(lái)勸你們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法的,也不是來(lái)和你們說(shuō)數(shù)據(jù)結(jié)構(gòu)
    的頭像 發(fā)表于 11-02 11:25 ?3176次閱讀

    JavaScrit數(shù)據(jù)結(jié)構(gòu)算法(第2版)

    JavaScrit數(shù)據(jù)結(jié)構(gòu)算法(第2版)教材下載。
    發(fā)表于 06-01 15:35 ?0次下載

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(上)

    有哪些常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)以及排序算法
    的頭像 發(fā)表于 04-06 16:48 ?980次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(上)

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(中)

    有哪些常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)以及排序算法
    的頭像 發(fā)表于 04-06 16:48 ?773次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(中)

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(下)

    有哪些常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)以及排序算法
    的頭像 發(fā)表于 04-06 16:48 ?918次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(下)
    主站蜘蛛池模板: 精品玖玖 | 能在线观看的一区二区三区 | 四虎精品影院永久在线播放 | 久久99精品久久久久久秒播 | 五月天亚洲 | 综合五月天婷婷丁香 | 国模私拍福利一区二区 | 国产在线播放一区 | 四虎影视在线影院4hu | 午夜美女久久久久爽久久 | 97影院理论在线观看 | sihu免费观看在线高清 | 成 人网站免费 | 午夜不卡影院 | 伊人丁香婷婷综合一区二区 | 午夜激情婷婷 | www.狠狠干| 国产三级网 | 最近高清免费观看视频大全 | 欧美性hd| 欧洲无线区一二区 | 亚洲国产系列 | 你懂的网站在线播放 | 欧美激情伊人 | 又粗又硬又猛又黄的免费视频黑人 | 美女扒尿口给男人桶到爽 | 午夜影院免费在线观看 | 天天干天天舔天天射 | 亚洲资源在线视频 | 天天干在线免费视频 | 日本边添边爱边摸边做边爱 | 国产永久视频夜色资源网 | 国模小丫大尺度啪啪人体 | 五月婷婷婷婷婷 | 噜噜噜噜噜久久久久久91 | 亚洲免费色视频 | 一级一级18女人毛片 | 天堂网视频在线 | 久久久夜夜夜 | 六九视频在线观看 | 午夜性刺激免费视频观看不卡专区 |