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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

OpenHarmony內核任務間IPC原理

2KHh_gh_15d2f06 ? 來源:深開鴻 ? 作者:深開鴻 ? 2022-07-12 16:45 ? 次閱讀

近年來,國內開源實現跨越式發展,并成為企業提升創新能力、生產力、協作和透明度的關鍵。作為 OpenAtom OpenHarmony(以下簡稱“OpenHarmony”)開源項目共建單位之一,深開鴻以成為智能物聯網操作系統領軍者為戰略目標,基于 OpenHarmony 聚焦智能物聯網操作系統(KaihongOS)的技術研發與持續創新。

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

OpenHarmony LiteOS-M 內核是面向 IoT 領域構建的輕量級物聯網操作系統內核,具有小體積、低功耗、高性能的特點,其代碼結構簡單,實現了進程、線程、內存等管理機制,提供了常見任務間 IPC、軟定時器等公共模塊,大幅度降低了嵌入式設備開發的難度。目前 OpenHarmony 的事件提供一種任務間的 IPC,即一個或多個任務可以通過寫一個或多個不同的事件來觸發內核調度,讓另一個等待讀取事件的任務進入運行狀態,從而實現任務間的同步。

對于嵌入式開發工作人員和技術愛好者來說,深入了解常見任務間 IPC,有助于學習和研發內核。本文將從數據結構和算法解析 OpenHarmony 的事件機制,帶大家深入了解內核任務間 IPC 原理。

關鍵數據結構

在解讀事件的源碼之前,首先了解下事件的關鍵的數據結構 PEVENT_CB_S:

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

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

stEventList:即事件控制塊的雙向循環鏈表,理解這個字段是理解事件的關鍵。在雙向循環鏈表中唯一不變的節點就是頭節點,而這里的 stEventList 就是頭節點。當有任務等待事件但事件還沒發生時,任務會被掛載到等待鏈表中;當事件發生時,系統喚醒等待事件的任務,此時任務就會被剔出鏈表。

事件初始化

下面是事件初始化源碼:

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 相當于 EVENT_CB_S *, 因此 eventCB 是指針。

說明事件控制塊由任務自己創建,內核事件模塊只負責維護。任務定義自己的事件控制塊變量,通過 LOS_EventInit 初始化,此時沒有事件發生,事件鏈表為空。

用圖來表達就是:

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

事件寫操作

任務可以通過 LOS_EventWrite 來寫觸發一個或多個事件:

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處,保存事件使用的或運算操作,因此一個或多個任務可以寫一個或多個事件,寫一次或多次,而且每次為不同的事件,多次寫同一個事件相當于只寫了一次;

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

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

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

5處,一旦匹配到等待事件的任務,則執行任務調度,被喚醒的任務得到執行。

寫事件實際操作如下圖:

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

事件讀操作

LiteOS 為用戶提供了兩個事件的函數:

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

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

下面是 LOS_EventPoll() 的實現:

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,只要有一個事件發生則讀取成功,返回發生的那個事件;

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

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

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

下面是 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處,主動查詢想要的事件是否已經發生;

2處,如果事件沒有發生,就把當前任務掛起到等待事件鏈表中;

3處,如果事件沒有發生,當前讀事件的任務被掛起,讓出 CPU

4處,事件發生時等待事件的任務被調度再次獲得 CPU 恢復執行,讀取事件。

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

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

事件銷毀操作

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

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 中清空事件鏈表指針。

小結


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

OpenHarmony 生態建設離不開每位開發者的參與,希望有更多的開發者分享自己開源項目的經驗和成果,共同為 OpenHarmony 生態建設貢獻一份力量。

原文標題:OpenHarmony——內核對象事件之源碼詳解

文章出處:【微信公眾號:深開鴻】歡迎添加關注!文章轉載請注明出處。

審核編輯:彭靜

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10904

    瀏覽量

    213026
  • 操作系統
    +關注

    關注

    37

    文章

    6896

    瀏覽量

    123749
  • IPC
    IPC
    +關注

    關注

    3

    文章

    352

    瀏覽量

    52073
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40232
  • OpenHarmony
    +關注

    關注

    25

    文章

    3747

    瀏覽量

    16586

原文標題:OpenHarmony——內核對象事件之源碼詳解

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

收藏 人收藏

    評論

    相關推薦

    迅為RK3568開發板篇OpenHarmony實操HDF驅動控制LED-添加內核編譯

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

    ipc系統的網絡帶寬需求分析

    IPC(Internet Protocol Camera)系統的網絡帶寬需求分析涉及多個因素,包括IPC的碼流大小、網絡架構、監控需求等。以下是對IPC系統網絡帶寬需求的分析: 一、IPC
    的頭像 發表于 11-15 14:28 ?458次閱讀

    ipc協議在物聯網中的應用

    隨著物聯網(IoT)技術的快速發展,各種通信協議在其中扮演著至關重要的角色。IPC(進程通信)協議,雖然最初設計用于操作系統內部的進程通信,但在物聯網領域也展現出了其獨特的應用價值。 1. 物
    的頭像 發表于 11-15 14:19 ?487次閱讀

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

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

    基于ArkTS語言的OpenHarmony APP應用開發:HelloOpenharmony

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

    IPC工控機有哪些技術特點?

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

    安防攝像頭IPC芯片的應用

    安防攝像頭IPC芯片的應用
    的頭像 發表于 07-22 09:42 ?873次閱讀
    安防攝像頭<b class='flag-5'>IPC</b>芯片的應用

    ipc820工控機使用教程

    概述 IPC820工控機是一款高性能、多功能的工業計算機,適用于各種工業自動化和控制應用。它具有強大的處理能力、豐富的接口和靈活的擴展性,可以滿足不同用戶的需求。 硬件組成 IPC820工控機的硬件
    的頭像 發表于 07-01 10:47 ?1219次閱讀

    歡創播報 華為宣布鴻蒙內核已超越Linux內核

    1 華為宣布鴻蒙內核已超越Linux內核 ? 6月21日,在華為開發者大會上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨立于安卓和iOS的鴻蒙操作系統,正式登場。這是HarmonyOS
    的頭像 發表于 06-27 11:30 ?903次閱讀

    OpenHarmony語言基礎類庫【@ohos.taskpool(啟動任務池)】

    任務池(taskpool)作用是為應用程序提供一個多線程的運行環境,降低整體資源的消耗、提高系統的整體性能,且您無需關心線程實例的生命周期。您可以使用任務池API創建后臺任務(Task),并對所創
    的頭像 發表于 04-24 17:45 ?398次閱讀
    <b class='flag-5'>OpenHarmony</b>語言基礎類庫【@ohos.taskpool(啟動<b class='flag-5'>任務</b>池)】

    OpenHarmony南向能力征集令

    1、適配過程中缺少哪些接口能力或者南向能力,需要OpenHarmony去補齊的?例如內核、編譯、器件適配、單板適配等; 2、對標linux,需要OpenHarmony提供哪些能力?比如V4L2
    發表于 04-09 15:32

    OpenHarmony內核編程實戰

    編程入門[Hello,OpenHarmony]在正式開始之前,對于剛接觸OpenHarmony的伙伴們,面對大篇幅的源碼可能無從下手,不知道怎么去編碼寫程序,下面用一個簡單的例子帶伙伴們入門。▍任務
    的頭像 發表于 03-27 08:31 ?943次閱讀
    <b class='flag-5'>OpenHarmony</b><b class='flag-5'>內核</b>編程實戰

    鴻蒙OpenHarmony技術:【設備互信認證】

    OpenHarmony中,設備互信認證模塊作為安全子系統的子模塊,負責設備可信關系的建立、維護、使用、撤銷等全生命周期的管理,實現可信設備的互信認證和安全會話密鑰協商,是搭載OpenHa
    的頭像 發表于 03-25 17:04 ?843次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>技術:【設備互信認證】

    【鴻蒙】OpenHarmony運行docker詳細步驟

    1.環境和設備 系統版本: 3.2release(64 位) OpenHarmony 內核版本:5.10 標準系統設備: DAYU200 Docker:18.03.1 (64 位) sd 卡一張
    的頭像 發表于 03-02 15:10 ?2828次閱讀
    【鴻蒙】<b class='flag-5'>OpenHarmony</b>運行docker詳細步驟

    使用pSoC6247雙核MCU使用IPC方式M0和M4進行數據傳遞,ipc雙向數據死機的原因?怎么解決?

    有問題。 關于IPC部分的使用,有什么指導文檔和使用建議嗎?比如我想雙向傳輸,都很頻繁。 應該如何在程序中增加保護,比如忙保護? 比如我在M4內核要給M0通過IPC發送數據的時候,能否通過讀取某個標志位判斷此時是否M0在給M4
    發表于 02-21 07:27
    主站蜘蛛池模板: 77788色淫网站免费观看 | 成年片色大黄全免费 | 欧美猛性 | 男人和女人做爽爽视频在线观看 | 国产成人av在线 | 日本五十交尾在线观看 | 人人爱爱人人 | 激情五月激情综合 | 天天操天天干天天射 | 国产精品女仆装在线播放 | 精品视频在线视频 | 色婷婷综合激情 | 九月婷婷综合 | 亚欧有色亚欧乱色视频 | 亚洲午夜久久久久影院 | 黄视频在线播放 | 欧美啪啪精品 | 高清国产美女在线观看 | 久久综合亚洲 | 亚洲人成网站色在线观看 | 国产一区二区高清 | 色综合天天综合网国产成人网 | 无人区理论片手机看片 | 日本一区免费观看 | se视频在线观看 | 久久久久久夜精品精品免费啦 | 99热久久久久久久免费观看 | 米奇影院777 | 特级毛片免费视频 | 久久精品免费观看 | 一级特级毛片免费 | 天天做天天爱天天爽天天综合 | 亚洲无色| 哺乳期xxxx视频 | 51精品国产 | 91九色porny蝌蚪 | 夜夜网站 | 日本免费一区视频 | 中文字幕一二三四区2021 | 三级网站免费看 | 黄www片|