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)不再提示

鴻蒙內(nèi)核源碼分析多任務(wù)環(huán)境下的事件控制塊

鴻蒙系統(tǒng)HarmonyOS ? 來(lái)源:my.oschina ? 作者: 鴻蒙內(nèi)核源碼分析 ? 2021-04-26 14:29 ? 次閱讀

事件(Event)是一種任務(wù)間通信的機(jī)制,可用于任務(wù)間的同步。

多任務(wù)環(huán)境下,任務(wù)之間往往需要同步操作,一個(gè)等待即是一個(gè)同步。事件可以提供一對(duì)多、多對(duì)多的同步操作。

一對(duì)多同步模型:一個(gè)任務(wù)等待多個(gè)事件的觸發(fā)??梢允侨我庖粋€(gè)事件發(fā)生時(shí)喚醒任務(wù)處理事件,也可以是幾個(gè)事件都發(fā)生后才喚醒任務(wù)處理事件。

多對(duì)多同步模型:多個(gè)任務(wù)等待多個(gè)事件的觸發(fā)。

鴻蒙提供的事件具有如下特點(diǎn):

任務(wù)通過(guò)創(chuàng)建事件控制塊來(lái)觸發(fā)事件或等待事件。

事件間相互獨(dú)立,內(nèi)部實(shí)現(xiàn)為一個(gè)32位無(wú)符號(hào)整型,每一位標(biāo)識(shí)一種事件類(lèi)型。第25位不可用,因此最多可支持31種事件類(lèi)型。

事件僅用于任務(wù)間的同步,不提供數(shù)據(jù)傳輸功能。

多次向事件控制塊寫(xiě)入同一事件類(lèi)型,在被清零前等效于只寫(xiě)入一次。

多個(gè)任務(wù)可以對(duì)同一事件進(jìn)行讀寫(xiě)操作。

支持事件讀寫(xiě)超時(shí)機(jī)制。

再看事件圖

o4YBAGCGXN-ACrXZAADyjTTaYwI659.png

注意圖中提到了三個(gè)概念事件控制塊事件任務(wù)接下來(lái)結(jié)合代碼來(lái)理解事件模塊的實(shí)現(xiàn).

事件控制塊長(zhǎng)什么樣?

typedef struct tagEvent {
    UINT32 uwEventID;        /**< Event mask in the event control block,//標(biāo)識(shí)發(fā)生的事件類(lèi)型位,事件ID,每一位標(biāo)識(shí)一種事件類(lèi)型
                                  indicating the event that has been logically processed. */
    LOS_DL_LIST stEventList; /**< Event control block linked list *///讀取事件任務(wù)鏈表
} EVENT_CB_S, *PEVENT_CB_S;

簡(jiǎn)單是簡(jiǎn)單,就兩個(gè)變量,如下:uwEventID:用于標(biāo)識(shí)該任務(wù)發(fā)生的事件類(lèi)型,其中每一位表示一種事件類(lèi)型(0表示該事件類(lèi)型未發(fā)生、1表示該事件類(lèi)型已經(jīng)發(fā)生),一共31種事件類(lèi)型,第25位系統(tǒng)保留。

stEventList,這又是一個(gè)雙向鏈表, 雙向鏈表是內(nèi)核最重要的結(jié)構(gòu)體, 可前往鴻蒙內(nèi)核源碼分析 LOS_DL_LIST像狗皮膏藥一樣牢牢的寄生在宿主結(jié)構(gòu)體上stEventList上掛的是所有等待這個(gè)事件的任務(wù).

事件控制塊<>事件<>任務(wù) 三者關(guān)系

一定要搞明白這三者的關(guān)系,否則搞不懂事件模塊是如何運(yùn)作的.

任務(wù)是事件的生產(chǎn)者,通過(guò)LOS_EventWrite,向外部廣播發(fā)生了XX事件,并喚醒此前已在事件控制塊中登記過(guò)的要等待XX事件發(fā)生的XX任務(wù).

事件控制塊EVENT_CB_S是記錄者,只干兩件事件:

1.uwEventID按位記錄哪些事件發(fā)生了,它只是記錄,怎么消費(fèi)它不管的.

2.stEventList記錄哪些任務(wù)在等待事件,但任務(wù)究竟在等待哪些事件它也是不記錄的

任務(wù)也是消費(fèi)者,通過(guò)LOS_EventRead消費(fèi),只有任務(wù)自己清楚要以什么樣的方式,消費(fèi)什么樣的事件. 先回顧下任務(wù)結(jié)構(gòu)體LosTaskCB對(duì)事件部分的描述如下:

typedef struct {
    //...去掉不相關(guān)的部分
    VOID            *taskEvent;  //和任務(wù)發(fā)生關(guān)系的事件控制塊
    UINT32          eventMask;   //對(duì)哪些事件進(jìn)行屏蔽
    UINT32          eventMode;   //事件三種模式(LOS_WAITMODE_AND,LOS_WAITMODE_OR,LOS_WAITMODE_CLR)
} LosTaskCB;    

taskEvent指向的就是EVENT_CB_S

eventMask屏蔽掉 事件控制塊 中的哪些事件

eventMode已什么樣的方式去消費(fèi)事件,三種讀取模式

#define LOS_WAITMODE_AND                    4U 	
#define LOS_WAITMODE_OR                     2U 	
#define LOS_WAITMODE_CLR                    1U	

所有事件(LOS_WAITMODE_AND):邏輯與,基于接口傳入的事件類(lèi)型掩碼eventMask,只有這些事件都已經(jīng)發(fā)生才能讀取成功,否則該任務(wù)將阻塞等待或者返回錯(cuò)誤碼。

任一事件(LOS_WAITMODE_OR):邏輯或,基于接口傳入的事件類(lèi)型掩碼eventMask,只要這些事件中有任一種事件發(fā)生就可以讀取成功,否則該任務(wù)將阻塞等待或者返回錯(cuò)誤碼。

清除事件(LOS_WAITMODE_CLR):這是一種附加讀取模式,需要與所有事件模式或任一事件模式結(jié)合使用(LOS_WAITMODE_AND | LOS_WAITMODE_CLR或LOS_WAITMODE_OR | LOS_WAITMODE_CLR)。在這種模式下,當(dāng)設(shè)置的所有事件模式或任一事件模式讀取成功后,會(huì)自動(dòng)清除事件控制塊中對(duì)應(yīng)的事件類(lèi)型位。

一個(gè)事件控制塊EVENT_CB_S中的事件可以來(lái)自多個(gè)任務(wù),多個(gè)任務(wù)也可以同時(shí)消費(fèi)事件控制塊中的事件,并且這些任務(wù)之間可以沒(méi)有任何關(guān)系!

函數(shù)列表

事件可應(yīng)用于多種任務(wù)同步場(chǎng)景,在某些同步場(chǎng)景下可替代信號(hào)量。

pIYBAGCGXPyAad9qAABkhDgadFw029.png

其中讀懂OsEventWrite和OsEventRead就明白了事件模塊.

事件初始化 -> LOS_EventInit

//初始化一個(gè)事件控制塊
LITE_OS_SEC_TEXT_INIT UINT32 LOS_EventInit(PEVENT_CB_S eventCB)
{
    UINT32 intSave;
    intSave = LOS_IntLock();//鎖中斷
    eventCB->uwEventID = 0; //其中每一位表示一種事件類(lèi)型(0表示該事件類(lèi)型未發(fā)生、1表示該事件類(lèi)型已經(jīng)發(fā)生)
    LOS_ListInit(&eventCB->stEventList);//事件鏈表初始化
    LOS_IntRestore(intSave);//恢復(fù)中斷
    return LOS_OK;
}

代碼解讀:

事件是共享資源,所以操作期間不能產(chǎn)生中斷.

初始化兩個(gè)記錄者uwEventIDstEventList

事件生產(chǎn)過(guò)程 -> OsEventWrite

pIYBAGCGXRiAAFVDAACoKF6qBw0266.png

LITE_OS_SEC_TEXT VOID OsEventWriteUnsafe(PEVENT_CB_S eventCB, UINT32 events, BOOL once, UINT8 *exitFlag)
{
    LosTaskCB *resumedTask = NULL;
    LosTaskCB *nextTask = NULL;
    BOOL schedFlag = FALSE;

    eventCB->uwEventID |= events;//對(duì)應(yīng)位貼上標(biāo)簽
    if (!LOS_ListEmpty(&eventCB->stEventList)) {//等待事件鏈表判斷,處理等待事件的任務(wù)
        for (resumedTask = LOS_DL_LIST_ENTRY((&eventCB->stEventList)->pstNext, LosTaskCB, pendList);
             &resumedTask->pendList != &eventCB->stEventList;) {//循環(huán)獲取任務(wù)鏈表
            nextTask = LOS_DL_LIST_ENTRY(resumedTask->pendList.pstNext, LosTaskCB, pendList);//獲取任務(wù)實(shí)體
            if (OsEventResume(resumedTask, eventCB, events)) {//是否恢復(fù)任務(wù)
                schedFlag = TRUE;//任務(wù)已加至就緒隊(duì)列,申請(qǐng)發(fā)生一次調(diào)度
            }
            if (once == TRUE) {//是否只處理一次任務(wù)
                break;//退出循環(huán)
            }
            resumedTask = nextTask;//檢查鏈表中下一個(gè)任務(wù)
        }
    }

    if ((exitFlag != NULL) && (schedFlag == TRUE)) {//是否讓外面調(diào)度
        *exitFlag = 1;
    }
}
//寫(xiě)入事件
LITE_OS_SEC_TEXT STATIC UINT32 OsEventWrite(PEVENT_CB_S eventCB, UINT32 events, BOOL once)
{
    UINT32 intSave;
    UINT8 exitFlag = 0;

    SCHEDULER_LOCK(intSave);	//禁止調(diào)度
    OsEventWriteUnsafe(eventCB, events, once, &exitFlag);//寫(xiě)入事件
    SCHEDULER_UNLOCK(intSave);	//允許調(diào)度

    if (exitFlag == 1) { //需要發(fā)生調(diào)度
        LOS_MpSchedule(OS_MP_CPU_ALL);//通知所有CPU調(diào)度
        LOS_Schedule();//執(zhí)行調(diào)度
    }
    return LOS_OK;
}

代碼解讀:

給對(duì)應(yīng)位貼上事件標(biāo)簽,eventCB->uwEventID |= events;注意uwEventID是按位管理的.每個(gè)位代表一個(gè)事件是否寫(xiě)入,例如uwEventID = 00010010代表產(chǎn)生了 1,4 事件

循環(huán)從stEventList鏈表中取出等待這個(gè)事件的任務(wù)判斷是否喚醒任務(wù).OsEventResume

//事件恢復(fù),判斷是否喚醒任務(wù)
LITE_OS_SEC_TEXT STATIC UINT8 OsEventResume(LosTaskCB *resumedTask, const PEVENT_CB_S eventCB, UINT32 events)
{
    UINT8 exitFlag = 0;//是否喚醒

    if (((resumedTask->eventMode & LOS_WAITMODE_OR) && ((resumedTask->eventMask & events) != 0)) ||
        ((resumedTask->eventMode & LOS_WAITMODE_AND) &&
        ((resumedTask->eventMask & eventCB->uwEventID) == resumedTask->eventMask))) {//邏輯與 和 邏輯或 的處理
        exitFlag = 1; 

        resumedTask->taskEvent = NULL;
        OsTaskWake(resumedTask);//喚醒任務(wù),加入就緒隊(duì)列
    }

    return exitFlag;
}

3.喚醒任務(wù)OsTaskWake只是將任務(wù)重新加入就緒隊(duì)列,需要立即申請(qǐng)一次調(diào)度LOS_Schedule.

事件消費(fèi)過(guò)程 -> OsEventRead

pIYBAGCGXS6ABykIAAB0t76c4h0647.png

LITE_OS_SEC_TEXT STATIC UINT32 OsEventRead(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode, UINT32 timeout,
                                           BOOL once)
{
    UINT32 ret;
    UINT32 intSave;
    SCHEDULER_LOCK(intSave);
    ret = OsEventReadImp(eventCB, eventMask, mode, timeout, once);//讀事件實(shí)現(xiàn)函數(shù)
    SCHEDULER_UNLOCK(intSave);
    return ret;
}

//讀取指定事件類(lèi)型的實(shí)現(xiàn)函數(shù),超時(shí)時(shí)間為相對(duì)時(shí)間:?jiǎn)挝粸門(mén)ick
LITE_OS_SEC_TEXT STATIC UINT32 OsEventReadImp(PEVENT_CB_S eventCB, UINT32 eventMask, UINT32 mode,
                                              UINT32 timeout, BOOL once)
{
    UINT32 ret = 0;
    LosTaskCB *runTask = OsCurrTaskGet();
    runTask->eventMask = eventMask;
    runTask->eventMode = mode;
    runTask->taskEvent = eventCB;//事件控制塊
    ret = OsTaskWait(&eventCB->stEventList, timeout, TRUE);//任務(wù)進(jìn)入等待狀態(tài),掛入阻塞鏈表
    if (ret == LOS_ERRNO_TSK_TIMEOUT) {//如果返回超時(shí)
        runTask->taskEvent = NULL;
        return LOS_ERRNO_EVENT_READ_TIMEOUT;
    }
    ret = OsEventPoll(&eventCB->uwEventID, eventMask, mode);//檢測(cè)事件是否符合預(yù)期
    return ret;
}

代碼解讀:

事件控制塊是給任務(wù)使用的, 任務(wù)給出讀取一個(gè)事件的條件

eventMask告訴系統(tǒng)屏蔽掉這些事件,對(duì)屏蔽的事件不感冒.

eventMode已什么樣的方式去消費(fèi)事件,是必須都滿(mǎn)足給的條件,還是只滿(mǎn)足一個(gè)就響應(yīng).

條件給完后,自己進(jìn)入等待狀態(tài)OsTaskWait,等待多久timeout決定,任務(wù)自己說(shuō)了算.

OsEventPoll檢測(cè)事件是否符合預(yù)期,啥意思?看下它的代碼就知道了

//根據(jù)用戶(hù)傳入的事件值、事件掩碼及校驗(yàn)?zāi)J剑祷赜脩?hù)傳入的事件是否符合預(yù)期
LITE_OS_SEC_TEXT UINT32 OsEventPoll(UINT32 *eventID, UINT32 eventMask, UINT32 mode)
{
    UINT32 ret = 0;//事件是否發(fā)生了

    LOS_ASSERT(OsIntLocked());//斷言不允許中斷了
    LOS_ASSERT(LOS_SpinHeld(&g_taskSpin));//任務(wù)自旋鎖

    if (mode & LOS_WAITMODE_OR) {//如果模式是讀取掩碼中任意事件
        if ((*eventID & eventMask) != 0) {
            ret = *eventID & eventMask; //發(fā)生了
        }
    } else {//等待全部事件發(fā)生
        if ((eventMask != 0) && (eventMask == (*eventID & eventMask))) {//必須滿(mǎn)足全部事件發(fā)生
            ret = *eventID & eventMask; //發(fā)生了
        }
    }

    if (ret && (mode & LOS_WAITMODE_CLR)) {//是否清除事件
        *eventID = *eventID & ~ret; 
    }

    return ret; 
}

編程實(shí)例

本實(shí)例實(shí)現(xiàn)如下流程。

示例中,任務(wù)Example_TaskEntry創(chuàng)建一個(gè)任務(wù)Example_Event,Example_Event讀事件阻塞,Example_TaskEntry向該任務(wù)寫(xiě)事件??梢酝ㄟ^(guò)示例日志中打印的先后順序理解事件操作時(shí)伴隨的任務(wù)切換。

在任務(wù)Example_TaskEntry創(chuàng)建任務(wù)Example_Event,其中任務(wù)Example_Event優(yōu)先級(jí)高于Example_TaskEntry。

在任務(wù)Example_Event中讀事件0x00000001,阻塞,發(fā)生任務(wù)切換,執(zhí)行任務(wù)Example_TaskEntry。

在任務(wù)Example_TaskEntry向任務(wù)Example_Event寫(xiě)事件0x00000001,發(fā)生任務(wù)切換,執(zhí)行任務(wù)Example_Event。

Example_Event得以執(zhí)行,直到任務(wù)結(jié)束。

Example_TaskEntry得以執(zhí)行,直到任務(wù)結(jié)束。

#include "los_event.h"
#include "los_task.h"
#include "securec.h"

/* 任務(wù)ID */
UINT32 g_testTaskId;

/* 事件控制結(jié)構(gòu)體 */
EVENT_CB_S g_exampleEvent;

/* 等待的事件類(lèi)型 */
#define EVENT_WAIT 0x00000001

/* 用例任務(wù)入口函數(shù) */
VOID Example_Event(VOID)
{
    UINT32 ret;
    UINT32 event;

    /* 超時(shí)等待方式讀事件,超時(shí)時(shí)間為100 ticks, 若100 ticks后未讀取到指定事件,讀事件超時(shí),任務(wù)直接喚醒 */
    printf("Example_Event wait event 0x%x \n", EVENT_WAIT);

    event = LOS_EventRead(&g_exampleEvent, EVENT_WAIT, LOS_WAITMODE_AND, 100);
    if (event == EVENT_WAIT) {
        printf("Example_Event,read event :0x%x\n", event);
    } else {
        printf("Example_Event,read event timeout\n");
    }
}

UINT32 Example_TaskEntry(VOID)
{
    UINT32 ret;
    TSK_INIT_PARAM_S task1;

    /* 事件初始化 */
    ret = LOS_EventInit(&g_exampleEvent);
    if (ret != LOS_OK) {
        printf("init event failed .\n");
        return -1;
    }

    /* 創(chuàng)建任務(wù) */
    (VOID)memset_s(&task1, sizeof(TSK_INIT_PARAM_S), 0, sizeof(TSK_INIT_PARAM_S));
    task1.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Event;
    task1.pcName       = "EventTsk1";
    task1.uwStackSize  = OS_TSK_DEFAULT_STACK_SIZE;
    task1.usTaskPrio   = 5;
    ret = LOS_TaskCreate(&g_testTaskId, &task1);
    if (ret != LOS_OK) {
        printf("task create failed .\n");
        return LOS_NOK;
    }

    /* 寫(xiě)g_testTaskId 等待事件 */
    printf("Example_TaskEntry write event .\n");

    ret = LOS_EventWrite(&g_exampleEvent, EVENT_WAIT);
    if (ret != LOS_OK) {
        printf("event write failed .\n");
        return LOS_NOK;
    }

    /* 清標(biāo)志位 */
    printf("EventMask:%d\n", g_exampleEvent.uwEventID);
    LOS_EventClear(&g_exampleEvent, ~g_exampleEvent.uwEventID);
    printf("EventMask:%d\n", g_exampleEvent.uwEventID);

    /* 刪除任務(wù) */
    ret = LOS_TaskDelete(g_testTaskId);
    if (ret != LOS_OK) {
        printf("task delete failed .\n");
        return LOS_NOK;
    }

    return LOS_OK;
}

運(yùn)行結(jié)果

Example_Event wait event 0x1 
Example_TaskEntry write event .
Example_Event,read event :0x1
EventMask:1
EventMask:0
編輯:hfy

聲明:本文內(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)投訴
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2630

    瀏覽量

    66043
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    鴻蒙內(nèi)核源碼的中斷環(huán)境任務(wù)切換

    中斷環(huán)境任務(wù)切換 在鴻蒙內(nèi)核線(xiàn)程就是任務(wù),系列篇中說(shuō)的
    的頭像 發(fā)表于 04-30 16:41 ?2236次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b>的中斷<b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b>的<b class='flag-5'>任務(wù)</b>切換

    【HarmonyOS】鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇)

    CPU的層面,它只認(rèn)任務(wù)上下文!這里看不到任何代碼了,因?yàn)檫@是跟CPU相關(guān)的,不同的CPU需要去適配不同的匯編代碼,所以這些匯編代碼不會(huì)出現(xiàn)在一個(gè)通用工程中。請(qǐng)留意后續(xù) 鴻蒙內(nèi)核源碼
    發(fā)表于 10-14 14:00

    鴻蒙內(nèi)核源碼分析:用通俗易懂的語(yǔ)言告訴你鴻蒙內(nèi)核發(fā)生了什么?

    查看。內(nèi)存在內(nèi)核的比重極大內(nèi)存模塊占了鴻蒙內(nèi)核約15%代碼量, 近50個(gè)文件,非常復(fù)雜。鴻蒙源碼分析
    發(fā)表于 11-19 10:14

    鴻蒙內(nèi)核源碼分析源碼注釋篇):給HarmonyOS源碼逐行加上中文注釋

    都懂的概念去詮釋或者映射一個(gè)他們從沒(méi)聽(tīng)過(guò)的概念.說(shuō)別人能聽(tīng)得懂的話(huà)這很重要!!! 一個(gè)沒(méi)學(xué)過(guò)計(jì)算機(jī)知識(shí)的賣(mài)菜大媽就不可能知道內(nèi)核的基本運(yùn)作了嗎? NO!,筆者在系列篇中試圖用 鴻蒙源碼分析
    發(fā)表于 11-19 10:32

    鴻蒙源碼分析系列(總目錄) | 給HarmonyOS源碼逐行加上中文注釋

    |-鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇) | 任務(wù)是如何被調(diào)度執(zhí)行的|-鴻蒙
    發(fā)表于 11-20 11:24

    鴻蒙內(nèi)核源碼分析(必讀篇):用故事說(shuō)內(nèi)核

    本文基于開(kāi)源鴻蒙內(nèi)核分析,官方源碼【kernel_liteos_a】官方文檔【docs】參考文檔【Huawei LiteOS】本文作者:鴻蒙
    發(fā)表于 11-23 10:15

    鴻蒙內(nèi)核源碼分析(調(diào)度機(jī)制篇):Task是如何被調(diào)度執(zhí)行的

    本文分析任務(wù)調(diào)度機(jī)制源碼 詳見(jiàn):代碼庫(kù)建議先閱讀閱讀之前建議先讀本系列其他文章,進(jìn)入鴻蒙系統(tǒng)源碼分析
    發(fā)表于 11-23 10:53

    鴻蒙內(nèi)核源碼分析(Task管理篇):task是內(nèi)核調(diào)度的單元

    遷移示意圖注意官方文檔說(shuō)的是線(xiàn)程,沒(méi)有提到task(任務(wù)),但內(nèi)核源碼中卻有大量 task代碼,很少有線(xiàn)程(thread)代碼 ,這是怎么回事?其實(shí)在鴻蒙
    發(fā)表于 11-23 14:01

    基于DSP的實(shí)時(shí)多任務(wù)調(diào)度內(nèi)核設(shè)計(jì)

    基于DSP的實(shí)時(shí)多任務(wù)調(diào)度內(nèi)核設(shè)計(jì)
    發(fā)表于 10-19 15:30 ?7次下載
    基于DSP的實(shí)時(shí)<b class='flag-5'>多任務(wù)</b>調(diào)度<b class='flag-5'>內(nèi)核</b>設(shè)計(jì)

    鴻蒙內(nèi)核源碼之線(xiàn)程環(huán)境任務(wù)切換

    在中斷環(huán)境,從當(dāng)前線(xiàn)程切換到目標(biāo)線(xiàn)程,這種方式也稱(chēng)為硬切換.不由軟件控制的被動(dòng)式切換.哪些情況會(huì)出現(xiàn)硬切換呢?
    的頭像 發(fā)表于 04-25 16:48 ?1399次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b>之線(xiàn)程<b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b>的<b class='flag-5'>任務(wù)</b>切換

    鴻蒙內(nèi)核分析:線(xiàn)程中斷環(huán)境任務(wù)切換

    ?OsSaveSignalContextIrqC函數(shù)為止. 中斷環(huán)境任務(wù)切換 在鴻蒙內(nèi)核線(xiàn)程就是
    的頭像 發(fā)表于 03-19 14:34 ?2541次閱讀
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>分析</b>:線(xiàn)程中斷<b class='flag-5'>環(huán)境</b><b class='flag-5'>下</b>的<b class='flag-5'>任務(wù)</b>切換

    鴻蒙內(nèi)核源碼分析內(nèi)核最重要結(jié)構(gòu)體

    為何鴻蒙內(nèi)核源碼分析系列開(kāi)篇就說(shuō) LOS_DL_LIST ? 因?yàn)樗?b class='flag-5'>鴻蒙 LOS 內(nèi)核中無(wú)處
    發(fā)表于 11-24 17:54 ?35次下載
    <b class='flag-5'>鴻蒙</b><b class='flag-5'>內(nèi)核</b><b class='flag-5'>源碼</b><b class='flag-5'>分析</b> :<b class='flag-5'>內(nèi)核</b>最重要結(jié)構(gòu)體

    華為鴻蒙系統(tǒng)內(nèi)核源碼分析上冊(cè)

    鴻蒙內(nèi)核源碼注釋中文版【 Gitee倉(cāng)】給 Harmoηy○S源碼逐行加上中文注解,詳細(xì)闡述設(shè)計(jì)細(xì)節(jié),助你快速精讀 Harmonyos內(nèi)核源碼
    發(fā)表于 04-09 14:40 ?17次下載

    一種實(shí)時(shí)嵌入式多任務(wù)內(nèi)核分析與改進(jìn)

    一種實(shí)時(shí)嵌入式多任務(wù)內(nèi)核分析與改進(jìn)(嵌入式開(kāi)發(fā)系統(tǒng))-一種實(shí)時(shí)嵌入式多任務(wù)內(nèi)核分析與改進(jìn)
    發(fā)表于 07-30 13:49 ?11次下載
    一種實(shí)時(shí)嵌入式<b class='flag-5'>多任務(wù)</b>微<b class='flag-5'>內(nèi)核</b>的<b class='flag-5'>分析</b>與改進(jìn)

    單片機(jī)多任務(wù)事件驅(qū)動(dòng)C源碼

    單片機(jī)多任務(wù)事件驅(qū)動(dòng)C源碼
    發(fā)表于 11-29 10:06 ?26次下載
    單片機(jī)<b class='flag-5'>多任務(wù)</b>事件驅(qū)動(dòng)C<b class='flag-5'>源碼</b>