一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

OpenHarmony內(nèi)核任務(wù)間IPC原理

2KHh_gh_15d2f06 ? 來源:深開鴻 ? 作者:深開鴻 ? 2022-07-12 16:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

近年來,國內(nèi)開源實現(xiàn)跨越式發(fā)展,并成為企業(yè)提升創(chuàng)新能力、生產(chǎn)力、協(xié)作和透明度的關(guān)鍵。作為 OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)開源項目共建單位之一,深開鴻以成為智能物聯(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)新。

身為深開鴻 OS 內(nèi)核開發(fā)師,我們常年深耕于 OpenHarmony 的內(nèi)核開發(fā),希望通過分享一些工作上的經(jīng)驗,幫助大家掌握開源知識。

OpenHarmony LiteOS-M 內(nèi)核是面向 IoT 領(lǐng)域構(gòu)建的輕量級物聯(lián)網(wǎng)操作系統(tǒng)內(nèi)核,具有小體積、低功耗、高性能的特點,其代碼結(jié)構(gòu)簡單,實現(xiàn)了進(jìn)程、線程、內(nèi)存等管理機(jī)制,提供了常見任務(wù)間 IPC、軟定時器等公共模塊,大幅度降低了嵌入式設(shè)備開發(fā)的難度。目前 OpenHarmony 的事件提供一種任務(wù)間的 IPC,即一個或多個任務(wù)可以通過寫一個或多個不同的事件來觸發(fā)內(nèi)核調(diào)度,讓另一個等待讀取事件的任務(wù)進(jìn)入運行狀態(tài),從而實現(xiàn)任務(wù)間的同步。

對于嵌入式開發(fā)工作人員和技術(shù)愛好者來說,深入了解常見任務(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:

typedefstructtagEvent{    UINT32 uwEventID;           LOS_DL_LIST stEventList; /**< Event control block linked list */  } EVENT_CB_S, *PEVENT_CB_S;

uwEventID:即標(biāo)記任務(wù)的事件類型,每個bit可以標(biāo)識一個事件,最多支持 31 個事件(第 25bit 保留)。

stEventList:即事件控制塊的雙向循環(huán)鏈表,理解這個字段是理解事件的關(guān)鍵。在雙向循環(huán)鏈表中唯一不變的節(jié)點就是頭節(jié)點,而這里的 stEventList 就是頭節(jié)點。當(dāng)有任務(wù)等待事件但事件還沒發(fā)生時,任務(wù)會被掛載到等待鏈表中;當(dāng)事件發(fā)生時,系統(tǒng)喚醒等待事件的任務(wù),此時任務(wù)就會被剔出鏈表。

事件初始化

下面是事件初始化源碼:

LITE_OS_SEC_TEXT_INITUINT32LOS_EventInit(PEVENT_CB_SeventCB){    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 是指針。

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

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

fde8ee4c-ed2a-11ec-ba43-dac502259ad0.png

事件寫操作

任務(wù)可以通過 LOS_EventWrite 來寫觸發(fā)一個或多個事件:

LITE_OS_SEC_TEXTUINT32LOS_EventWrite(PEVENT_CB_SeventCB,UINT32events){    ...    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處,保存事件使用的或運算操作,因此一個或多個任務(wù)可以寫一個或多個事件,寫一次或多次,而且每次為不同的事件,多次寫同一個事件相當(dāng)于只寫了一次;

2處,有事件發(fā)生了就該檢查是否有任務(wù)在等待事件,事件鏈表不為空說明有任務(wù)在等待事件;

3處,遍歷事件鏈表,喚醒符合條件的任務(wù)。LOS_DL_LIST_ENTRY((&eventCB->stEventList)->pstNext,LosTaskCB,pendList) 前面提到,頭節(jié)點是空節(jié)點,第一次遍歷從頭節(jié)點的下一個節(jié)點開始,后續(xù)再依次找出 nextTask,直到回到頭節(jié)點;

4處,針對事件讀取模式,找到滿足條件的任務(wù)并喚醒該任務(wù);

5處,一旦匹配到等待事件的任務(wù),則執(zhí)行任務(wù)調(diào)度,被喚醒的任務(wù)得到執(zhí)行。

寫事件實際操作如下圖:

fe029ed2-ed2a-11ec-ba43-dac502259ad0.png

事件讀操作

LiteOS 為用戶提供了兩個事件的函數(shù):

● LOS_EventPoll():根據(jù)任務(wù)傳入的事件值、掩碼及校驗?zāi)J?,返回滿足條件的事件,任務(wù)可以主動檢查事件是否發(fā)生而不必被掛起;

● LOS_EventRead():讀取事件,可以理解為阻塞式讀,如果事件沒有發(fā)生,可以指定等待時間,掛起當(dāng)前任務(wù)。

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

LITE_OS_SEC_TEXTUINT32LOS_EventPoll(UINT32*eventID,UINT32eventMask,UINT32mode){    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,只要有一個事件發(fā)生則讀取成功,返回發(fā)生的那個事件;

2處,如果讀取模式LOS_WAITMODE_AND,全部檢查事件發(fā)生才算讀取成功,并返回全部發(fā)生事件;

3處,事件讀取成功后事件控制塊中的事件標(biāo)記怎么處理?這里通過LOS_WAITMODE_CLR來決定是否清除事件標(biāo)記。

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

下面是 LOS_EventRead():

LITE_OS_SEC_TEXTUINT32LOS_EventRead(PEVENT_CB_SeventCB,UINT32eventMask,UINT32mode,UINT32timeOut){    ...    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處,主動查詢想要的事件是否已經(jīng)發(fā)生;

2處,如果事件沒有發(fā)生,就把當(dāng)前任務(wù)掛起到等待事件鏈表中;

3處,如果事件沒有發(fā)生,當(dāng)前讀事件的任務(wù)被掛起,讓出 CPU;

4處,事件發(fā)生時等待事件的任務(wù)被調(diào)度再次獲得 CPU 恢復(fù)執(zhí)行,讀取事件。

事件讀寫整個過程串起來如下圖所示:

fe0b2066-ed2a-11ec-ba43-dac502259ad0.png

事件銷毀操作

做事有始有終,事件消費完成剩下的事情是清除事件和等待事件的任務(wù)鏈表。

LITE_OS_SEC_TEXT_MINORUINT32LOS_EventClear(PEVENT_CB_SeventCB,UINT32eventMask){    ...    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 中通過使 eventMask=0 來清空事件,在 LOS_EventDestroy 中清空事件鏈表指針。

小結(jié)


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

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

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

文章出處:【微信公眾號:深開鴻】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

審核編輯:彭靜

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

    關(guān)注

    68

    文章

    11080

    瀏覽量

    217055
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    7151

    瀏覽量

    125577
  • IPC
    IPC
    +關(guān)注

    關(guān)注

    3

    文章

    366

    瀏覽量

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

    關(guān)注

    3

    文章

    573

    瀏覽量

    40748
  • OpenHarmony
    +關(guān)注

    關(guān)注

    29

    文章

    3854

    瀏覽量

    18605

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

文章出處:【微信號:gh_15d2f062a168,微信公眾號:深開鴻】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

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

    第三屆大會回顧第5期 | OpenHarmony內(nèi)核實時性探索

    實時性是操作系統(tǒng)內(nèi)核在特定應(yīng)用場景中不可或缺的特性,它通過多種技術(shù)手段確保系統(tǒng)在規(guī)定時間內(nèi)完成任務(wù),從而滿足高可靠性、高響應(yīng)速度的需求。
    的頭像 發(fā)表于 06-25 18:02 ?249次閱讀
    第三屆大會回顧第5期 | <b class='flag-5'>OpenHarmony</b><b class='flag-5'>內(nèi)核</b>實時性探索

    2024年OpenHarmony社區(qū)年度激勵公示

    交通大學(xué) 古金宇 OpenHarmony TEE操作系統(tǒng)內(nèi)核 叁萬元 領(lǐng)航課題 北京航空航天大學(xué) 黎立 針對Open
    的頭像 發(fā)表于 04-21 18:17 ?397次閱讀

    IPC2221簡略學(xué)習(xí)筆記

    關(guān)于IPC2221的學(xué)習(xí)筆記。
    發(fā)表于 03-14 18:07 ?5次下載

    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動開發(fā)內(nèi)核HDF驅(qū)動框架架構(gòu)

    北京迅為RK3568開發(fā)板OpenHarmony系統(tǒng)南向驅(qū)動開發(fā)內(nèi)核HDF驅(qū)動框架架構(gòu)
    的頭像 發(fā)表于 03-11 14:13 ?1119次閱讀
    北京迅為RK3568開發(fā)板<b class='flag-5'>OpenHarmony</b>系統(tǒng)南向驅(qū)動開發(fā)<b class='flag-5'>內(nèi)核</b>HDF驅(qū)動框架架構(gòu)

    迅為RK3568開發(fā)板篇OpenHarmony實操HDF驅(qū)動控制LED-添加內(nèi)核編譯

    編譯內(nèi)核時將該 HDF 驅(qū)動編譯到鏡像中,接下來編寫驅(qū)動編譯腳本 Makefile,代碼如下所示: 加入編譯體系,填加模塊目錄到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多內(nèi)容可以關(guān)注:迅為RK3568開發(fā)板篇OpenHa
    發(fā)表于 01-22 10:35

    迅為RK3568開發(fā)板篇OpenHarmony配置HDF驅(qū)動控制LED-新增 topeet子系統(tǒng)

    目錄 ├── led_driver.c:內(nèi)核 LED HDF 驅(qū)動程序 └── Makefile:內(nèi)核 LED HDF 驅(qū)動編譯腳本 更多內(nèi)容可以關(guān)注:迅為RK3568開發(fā)板篇OpenHarmony
    發(fā)表于 01-13 15:59

    博泰車聯(lián)網(wǎng)廈門制造基地順利通過IPC QML審核

    近日,博泰車聯(lián)網(wǎng)廈門制造基地經(jīng)過IPC嚴(yán)格的審核,生產(chǎn)工藝與產(chǎn)品質(zhì)量符合電子行業(yè)國際標(biāo)準(zhǔn)IPC-A-610《電子組件的可接受性》三級產(chǎn)品要求與IPC J-STD-001《焊接的電氣與電子組件要求》,順利通過
    的頭像 發(fā)表于 01-02 14:20 ?649次閱讀

    ipc系統(tǒng)的網(wǎng)絡(luò)帶寬需求分析

    IPC(Internet Protocol Camera)系統(tǒng)的網(wǎng)絡(luò)帶寬需求分析涉及多個因素,包括IPC的碼流大小、網(wǎng)絡(luò)架構(gòu)、監(jiān)控需求等。以下是對IPC系統(tǒng)網(wǎng)絡(luò)帶寬需求的分析: 一、IPC
    的頭像 發(fā)表于 11-15 14:28 ?1132次閱讀

    ipc技術(shù)在智能家居中的發(fā)展

    隨著科技的不斷進(jìn)步,智能家居逐漸成為現(xiàn)代生活的一部分。IPC技術(shù),即網(wǎng)絡(luò)攝像機(jī)技術(shù),作為智能家居系統(tǒng)中的重要組成部分,其發(fā)展對智能家居行業(yè)產(chǎn)生了深遠(yuǎn)的影響。 1. IPC技術(shù)概述 IPC技術(shù),即網(wǎng)絡(luò)
    的頭像 發(fā)表于 11-15 14:21 ?962次閱讀

    ipc協(xié)議在物聯(lián)網(wǎng)中的應(yīng)用

    隨著物聯(lián)網(wǎng)(IoT)技術(shù)的快速發(fā)展,各種通信協(xié)議在其中扮演著至關(guān)重要的角色。IPC(進(jìn)程通信)協(xié)議,雖然最初設(shè)計用于操作系統(tǒng)內(nèi)部的進(jìn)程通信,但在物聯(lián)網(wǎng)領(lǐng)域也展現(xiàn)出了其獨特的應(yīng)用價值。 1. 物
    的頭像 發(fā)表于 11-15 14:19 ?1268次閱讀

    【龍芯2K0300蜂鳥板試用】OpenHarmony代碼

    收到龍芯2K0300蜂鳥開發(fā)板后,對開發(fā)板做了一些了解和研究,現(xiàn)將OpenHarmony代碼提供給大家測試,也希望大家能更多的認(rèn)識龍芯2K0300蜂鳥開發(fā)板,下面先簡單介紹一下這塊開發(fā)板。 廣東
    發(fā)表于 09-18 11:42

    基于ArkTS語言的OpenHarmony APP應(yīng)用開發(fā):HelloOpenharmony

    1、程序簡介該程序是基于OpenHarmony標(biāo)準(zhǔn)系統(tǒng)編寫的UI應(yīng)用類:HelloOpenHarmony。本案例是基于API9接口開發(fā)。本案例已在OpenHarmony凌蒙派-RK3568開發(fā)
    的頭像 發(fā)表于 09-15 08:09 ?871次閱讀
    基于ArkTS語言的<b class='flag-5'>OpenHarmony</b> APP應(yīng)用開發(fā):Hello<b class='flag-5'>Openharmony</b>

    IPC工控機(jī)有哪些技術(shù)特點?

    ? ? ? IPC工控機(jī)是一種加固增強(qiáng)型的個人計算機(jī),由于IPC工控機(jī)的性能穩(wěn)定,軟件豐富,價格比較低,在工控機(jī)行業(yè)中脫穎而出,應(yīng)用日漸廣泛,目前IPC工控機(jī)已經(jīng)被運用到通訊、工業(yè)控制現(xiàn)場、路橋收費
    的頭像 發(fā)表于 07-30 09:59 ?855次閱讀

    鴻蒙OpenHarmony南向/北向快速開發(fā)教程-迅為RK3568開發(fā)板

    4.1學(xué)習(xí)之旅了嗎?快來加入我們,一起探索鴻蒙4.1系統(tǒng)的無限魅力吧! 【北京迅為】OpenHarmony學(xué)習(xí)開發(fā)系列教程(第1期 北向基礎(chǔ)篇一) P0_先導(dǎo)課 P1_OpenHarmony系統(tǒng)概述
    發(fā)表于 07-23 10:44

    安防攝像頭IPC芯片的應(yīng)用

    安防攝像頭IPC芯片的應(yīng)用
    的頭像 發(fā)表于 07-22 09:42 ?1502次閱讀
    安防攝像頭<b class='flag-5'>IPC</b>芯片的應(yīng)用