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

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

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

3天內不再提示

LiteOS-M內核隊列的關鍵數據結構及關鍵算法

2KHh_gh_15d2f06 ? 來源:深開鴻 ? 作者:蔣衛峰 ? 2022-06-14 11:01 ? 次閱讀

一、前言

隨著數字經濟的發展,作為數字基礎設施根技術的操作系統成為數字變革的關鍵力量,OpenAtom OpenHarmony(以下簡稱“OpenHarmony”) 以泛智能終端數字為底座支撐著千行百業的產業生態。

構建開源生態,需要讓開發者先用起來,本文希望通過分享 OpenHarmony 的 LiteOS-M 內核對象隊列的算法詳解,讓大家對這一算法有更加清晰的認識。 OpenHarmony 當前分為以下幾種系統類型:輕量系統 、小型系統、標準系統。針對不同量級的系統,分別使用了不同形態的內核。在輕量系統上,可以選擇 LiteOS-M;在小型系統和標準系統上,可以選用 LiteOS-A;在標準系統上,可以選用 Linux。 在輕小型系統中,OpenHarmony 所使用的內核為 LiteOS,在標準系統中使用 Linux。LiteOS-M 在面向 loT 領域構建了一款輕量級物聯網操作系統內核,嵌入式從業者如果能更好地掌握內核相關的知識,就能在未來做研發或者定制產品的時候獨當一面。

二、關鍵數據結構

首先關注隊列的關鍵數據結構 LosQueueCB,有了這個數據,才能理解隊列是如何工作的:
typedefstruct{    UINT8 *queue;      /**< Pointer to a queue handle */    UINT16 queueState; /**< Queue state */    UINT16 queueLen;   /**< Queue length */    UINT16 queueSize;  /**< Node size */    UINT16 queueID;    /**< queueID */    UINT16 queueHead;  /**< Node head */    UINT16 queueTail;  /**< Node tail */    UINT16 readWriteableCnt[OS_READWRITE_LEN]; /**< Count of readable or writable resources, 0:readable, 1:writable */    LOS_DL_LIST readWriteList[OS_READWRITE_LEN]; /**< Pointer to the linked list to be read or written,                                                      0:readlist, 1:writelist */    LOS_DL_LIST memList; /**< Pointer to the memory linked list */}LosQueueCB;

*queue:指向消息節點內存區域,創建隊列時按照消息節點個數乘每個節點大小從動態內存池中申請一片空間。

queueState:隊列狀態,表明隊列控制塊是否被使用,有 OS_QUEUE_INUSED和OS_QUEUE_UNUSED 兩種狀態。

queueLen:消息節點個數,表示該消息隊列最大可存儲多少個消息。

queueSize:每個消息節點大小,表示隊列每個消息可存儲信息的大小。

queueID:消息 ID,通過它來操作隊列。

消息節點按照循環隊列的方式訪問,隊列中的每個節點以數組下標表示,下面的成員與消息節點循環隊列有關:

queueHead:循環隊列的頭部。

queueTail:循環隊列的尾部。

readWriteableCnt[OS_QUEUE_WRITE]:消息節點循環隊列中可寫的消息個數,為 0 表示循環隊列為滿,等于 queueLen 表示循環隊列為空。

readWriteableCnt[OS_QUEUE_READ]:消息節點循環隊列中可讀的消息個數,為 0 表示循環隊列為空,等于 queueLen 表示消息隊列為滿。

readWriteList[OS_QUEUE_WRITE]:寫消息阻塞鏈表,鏈接因消息隊列滿而無法寫入時需要掛起的 TASK。

readWriteList[OS_QUEUE_READ]:讀消息阻塞鏈表,鏈接因消息隊列空而無法讀取時需要掛起的 TASK。

memList:申請內存塊阻塞鏈表,鏈接因申請某一靜態內存池中的內存塊失敗而需要掛起的 TASK。

注意:在老的版本中,readWriteableCnt 和 readWriteList 拆分為 4 個變量,新版本用宏定義合并,OS_QUEUE_READ 標識是讀操作,OS_QUEUE_WRITE 標識為寫操作。從中可看到代碼的微妙之處,0 的含義和 queueLen 對于讀寫是統一的,內核開發者不斷使用抽象手段來優化內核。

三、關鍵算法

隊列的算法和 FIFO、FILO 有關,今天先給大家介紹 FIFO 算法。

百度定義:FIFO(First Input First Output),即先進先出隊列。例如,在超市購物之后我們會到收銀臺排隊結賬,看著前面的客戶一個個離開,這就是一種先進先出機制,先排隊的客戶先行結賬離開。

那么 OpenHarmony 的隊列如何實現這個算法?

3.1 FIFO算法之入隊列

第一步:隊列初始化

由于 LOS_QueueCreate 函數太長,便只截取關鍵函數 LOS_QueueCreate。

LITE_OS_SEC_TEXT_INITUINT32LOS_QueueCreate(CHAR*queueName,                                         UINT16 len,                                         UINT32 *queueID,                                         UINT32 flags,                                         UINT16 maxMsgSize){    LosQueueCB *queueCB = NULL;    UINT32 intSave;    LOS_DL_LIST *unusedQueue = NULL;    UINT8 *queue = NULL;    UINT16 msgSize;    ...    queue = (UINT8 *)LOS_MemAlloc(m_aucSysMem0, len * msgSize);    ...    queueCB->queueLen = len;    queueCB->queueSize = msgSize;    queueCB->queue = queue;    queueCB->queueState = OS_QUEUE_INUSED;    queueCB->readWriteableCnt[OS_QUEUE_READ] = 0;    queueCB->readWriteableCnt[OS_QUEUE_WRITE] = len;    queueCB->queueHead = 0;    queueCB->queueTail = 0;    LOS_ListInit(&queueCB->readWriteList[OS_QUEUE_READ]);    LOS_ListInit(&queueCB->readWriteList[OS_QUEUE_WRITE]);    LOS_ListInit(&queueCB->memList);    LOS_IntRestore(intSave);
    *queueID = queueCB->queueID;    OsHookCall(LOS_HOOK_TYPE_QUEUE_CREATE, queueCB);
    return LOS_OK;}

數據結構是支撐算法的靈魂,內核對象的隊列控制結構 LosQueueCB 通過 queue 指針來指向具體隊列的內容,隊列分配了 queueLen 個消息,每個消息的大小為 queueSize,與此同時頭指針和尾指針不約而同初始化為 0。

第二步:第一個消息入隊列

生產者通過隊列來傳遞信息,這個生產者可以是形形色色的各個任務,產生一個隊列后,任務就迫不及待的需要放置消息,選擇 FIFO 還是 FILO?這一次我們選擇了 FIFO。

下圖是 FIFO 插入第一個數據后的內存形態。

d441fbba-e72b-11ec-ba43-dac502259ad0.png

OpenHarmony 作為一個開源系統,在下面的代碼中很好地體現了這個操作:

staticINLINEVOIDOsQueueBufferOperate(LosQueueCB*queueCB,UINT32operateType,                                                            VOID *bufferAddr, UINT32 *bufferSize){    UINT8 *queueNode = NULL;    UINT32 msgDataSize;    UINT16 queuePosition;    errno_t rc;
    /* get the queue position */    switch (OS_QUEUE_OPERATE_GET(operateType)) {        case OS_QUEUE_READ_HEAD:            queuePosition = queueCB->queueHead;            ((queueCB->queueHead + 1) == queueCB->queueLen) ? (queueCB->queueHead = 0) : (queueCB->queueHead++);            break;
        case OS_QUEUE_WRITE_HEAD:            (queueCB->queueHead == 0) ? (queueCB->queueHead = (queueCB->queueLen - 1)) : (--queueCB->queueHead);            queuePosition = queueCB->queueHead;            break;
        case OS_QUEUE_WRITE_TAIL:            queuePosition = queueCB->queueTail;            ((queueCB->queueTail + 1) == queueCB->queueLen) ? (queueCB->queueTail = 0) : (queueCB->queueTail++);            break;    ...}

OsQueueBufferOperate 是隊列內存的核心操作函數,FIFO 算法本質是往隊列的尾處添加數據,代碼抽象為 OS_QUEUE_WRITE_TAIL 操作,請注意隊列是個循環隊列,插入數據后移動 tail 這個“尾巴”指針要尤為小心,在最后一個物理空間用完成后需要移到隊列頭部,這就是環形隊列的“循環大法”。

如何判斷最后一個物理空間已經用完?(queueCB->queueTail + 1) == queueCB->queueLen)C 語言語句很好地解釋了這個疑問。queueLen 是隊列物理空間的邊界值,如果下一個消息已經指到這個邊界值,那么內核必須讓它回到原位,即 queueCB->queueTail = 0,不然可能會出現“內存越界”的問題,可能會造成機毀物亡。因為 OpenHarmony 應用在各個領域,如果是自動化駕駛領域那么造成的后果非常嚴重。

第三步:繼續生產數據

接下來,再來一些圖片示例:

d46978b6-e72b-11ec-ba43-dac502259ad0.png

第四步:生產數據結束

生產者生產了四個消息后就結束了。

d4bca324-e72b-11ec-ba43-dac502259ad0.png

3.2 FIFO算法之出隊列

步:隊列第一個消息

d4e48736-e72b-11ec-ba43-dac502259ad0.png

如上圖所示我們回顧下入隊列的步驟,知道了每個消息的入隊順序,于是第一個消息被消費后:

d50fafa6-e72b-11ec-ba43-dac502259ad0.png

在生產消息過程中我們已經提到 OsQueueBufferOperate 這個函數,我們回顧關鍵代碼:

/*getthequeueposition*/switch (OS_QUEUE_OPERATE_GET(operateType)) {    case OS_QUEUE_READ_HEAD:        queuePosition = queueCB->queueHead;        ((queueCB->queueHead + 1) == queueCB->queueLen) ? (queueCB->queueHead = 0) : (queueCB->queueHead++);        break;

queueHead 就是我們的頭指針,它的移動也面臨著生產過程相同的問題,在最后一個物理空間用完成后需要移到隊列的頭部。OS_QUEUE_READ_HEAD 是出隊列的關鍵處理,解決了 queueHead 頭指針如何移動的問題。

第二步:繼續消費

d571ad32-e72b-11ec-ba43-dac502259ad0.png

第三步:消費完畢

最后一個消息也消失了,head指針和tail指針均移動到下圖的位置,此時隊列為空。

d5a737b8-e72b-11ec-ba43-dac502259ad0.png

四、總結

本文主要介紹了 OpenHarmony 內核對象隊列的算法之 FIFO,在后續的篇章中將給大家介紹內核對象隊列另外一種算法——FILO。希望通過這篇文章,可以讓開發者們對于目前 OpenHarmony LiteOS-M 內核隊列算法有了更全面的概念。

當然隊列算法也不遠遠如此,linux 標準內核有加權隊列等更復雜的算法。但是“他山之石,可以攻玉”,技術萬變不離其宗,掌握了 FIFO 的細節有助于工程師設計其它隊列算法,也能夠把更多更新的技術帶入到 OpenHarmony 社區,繁榮開源生態。

原文標題:OpenHarmony——內核對象隊列之算法詳解(上)

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

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

    關注

    3

    文章

    1410

    瀏覽量

    41143
  • 算法
    +關注

    關注

    23

    文章

    4701

    瀏覽量

    94843
  • Linux
    +關注

    關注

    87

    文章

    11469

    瀏覽量

    212895
  • OpenHarmony
    +關注

    關注

    28

    文章

    3836

    瀏覽量

    18209

原文標題:OpenHarmony——內核對象隊列之算法詳解(上)

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

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    鴻蒙是一套龐大的體系,底層支持很多內核吧?liteos-m, liteos-a,linux 都支持?

    大家都知道鴻蒙是一套龐大的體系,那么底層應該支持很多內核吧?liteos-m, liteos-a,linux 都支持嗎?
    發表于 10-10 10:08

    芯來科技RISC-V處理器支持鴻蒙LiteOS-M內核

    使用芯來LiteOS-M內核倉庫鏈接如下:https://gitee.com/riscv-mcu/kernel_liteos_m/tree/dev_nuclei/倉庫內整體文件結構直觀
    發表于 04-08 13:59

    OpenHarmony LiteOS-M內核概述

    內核概述內核簡介OpenHarmony LiteOS-M內核是面向IoT領域構建的輕量級物聯網操作系統內核,具有小體積、低功耗、高性能的特點
    發表于 05-11 19:10

    如何在RK2206開發板上使用鴻蒙LiteOS-M內核接口進行隊列編程開發

    實驗內容本例程演示如何在小凌派-RK2206開發板上使用鴻蒙LiteOS-M內核接口,進行隊列編程開發。例程創建一個隊列,兩個任務;任務1調用寫隊列
    發表于 08-08 15:17

    OpenHarmony:內核對象隊列算法詳解(下)

    嵌入式領域的開發工作中,無論是自研還是移植系統,均繞不開內核,開發者只有掌握內核的相關知識,才能更好地深耕物聯網產品領域。OpenHarmony LiteOS-M內核對象
    發表于 08-09 10:25

    OpenHarmony:內核對象隊列算法詳解(上)

    百業的產業生態。構建開源生態,需要讓開發者先用起來,本文希望通過分享 OpenHarmony 的 LiteOS-M 內核對象隊列算法詳解,讓大家對這一
    發表于 08-09 10:29

    OpenHarmony——內核對象隊列算法詳解(下)

    OpenHarmony——內核對象隊列算法詳解(下)前言OpenAtom OpenHarmony(以下簡稱“OpenHarmony”) LiteOS-M
    發表于 08-09 16:16

    每日推薦 | 鴻蒙IPC開發板免費試用,OpenHarmony內核對象隊列算法詳解

    貼評論區進行申請就能獲得試用機會,大家沖鴨~3、OpenHarmony:內核對象隊列算法詳解(上)推薦理由:本文希望通過分享 OpenHarmony 的 LiteOS-M
    發表于 08-10 10:26

    OpenHarmony——內核IPC機制數據結構解析

    制涉及到哪些關鍵數據結構?這些數據結構又是如何工作的?接下來我將從隊列、事件、互斥鎖、信號量幾個內核對象出發,為大家講解
    發表于 09-05 11:02

    OpenHarmony——內核IPC機制數據結構解析

    制涉及到哪些關鍵數據結構?這些數據結構又是如何工作的?接下來我將從隊列、事件、互斥鎖、信號量幾個內核對象出發,為大家講解
    發表于 09-08 11:44

    鴻蒙liteos-m移植

    最近在研究鴻蒙liteos-m的移植,打算弄一塊板移植一下,這款正適合,512k flash,128k ram.100m時鐘,還有各種豐富的外設資源。
    發表于 10-27 21:17

    芯來科技RISC-V處理器將支持鴻蒙LiteOS-M內核

    芯來科技為方便客戶進行基于鴻蒙生態的RISC-V軟件開發,在Nuclei RISC-V 32位處理器上移植并適配了鴻蒙LiteOS-M內核。 目前該內核已可支持Nuclei Demo SoC
    的頭像 發表于 04-09 15:20 ?5091次閱讀
    芯來科技RISC-V處理器將支持鴻蒙<b class='flag-5'>LiteOS-M</b><b class='flag-5'>內核</b>

    Hi3861芯片開發板LiteOS-M的啟動流程

    OpenHarmony作為一款萬物互聯的操作系統,覆蓋了從嵌入式實時物聯網操作系統到移動操作系統的全覆蓋,其中內核包括LiteOS-MLiteOS-A和Linux。LiteOS-M
    的頭像 發表于 08-12 11:45 ?3142次閱讀

    Liteos-a內核工作隊列的實現原理分析及經驗總結——芯海科技PPG芯片CS1262接入OpenHarmony實戰

    摘要OpenHarmony系統中使用了liteos-mliteos-a、linux三種內核,工作隊列是linux內核引入的一種異步處理機制
    的頭像 發表于 04-26 09:26 ?2906次閱讀
    <b class='flag-5'>Liteos</b>-a<b class='flag-5'>內核</b>工作<b class='flag-5'>隊列</b>的實現原理分析及經驗總結——芯海科技PPG芯片CS1262接入OpenHarmony實戰

    全國首個!深開鴻LiteOS-M操作系統內核榮獲EAL5+安全認證!

    近日,深開鴻在信息安全領域實現重大突破!深開鴻攜手北京中關村實驗室,通過對開源社區版LiteOS-M內核進行代碼級安全加固,成功研發自主可控的增強型LiteOS-M安全內核,率先獲得中
    的頭像 發表于 02-24 19:26 ?455次閱讀
    全國首個!深開鴻<b class='flag-5'>LiteOS-M</b>操作系統<b class='flag-5'>內核</b>榮獲EAL5+安全認證!
    主站蜘蛛池模板: 色之综综 | 日韩欧美在线第一页 | 天天操天天谢 | 老师您的兔子好软水好多动漫视频 | 天天做人人爱夜夜爽2020毛片 | 久久黄视频 | 日韩性插| 日本黄色生活片 | www.91插插插| 黄色午夜 | 午夜片网站 | 你懂的福利 | 午夜tv影院| 国产精品久久久久久久成人午夜 | 美女扒开尿口给男人爽的视频 | 伊人91在线| 狂捣猛撞侍卫攻双性王爷受 | 欧美黄一片 | 丁香六月婷婷在线 | 黄免费视频| 久久夜色精品国产噜噜小说 | 国产成人mv在线观看入口视频 | 欧美一级在线观看视频 | 天天看天天做 | 看全色黄大色大片免费 | 男人操女人视频在线观看 | 亚洲成a人片在线观看尤物 亚洲成a人片在线观看中 | 亚洲 欧美 视频 | 欧美人与动性视频在线观 | 特级一级毛片免费看 | 天天插夜夜爽 | 天天射夜夜操 | 久久女同| 四虎在线最新地址4hu | 亚洲国产视频网 | 亚洲精品卡1卡二卡3卡四卡 | 小毛片在线观看 | 色综久久 | 亚洲五月综合网色九月色 | 欧美激情综合亚洲五月蜜桃 | 色宅男午夜电影在线观看 |