精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

OpenHarmony-內核對象事件之源碼詳解

系統 OpenHarmony
OpenHarmony的事件提供一種任務間的同步機制,今天我就帶大伙深入到內核當中,扒一扒事件的源代碼。

??想了解更多內容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術社區??

??https://ost.51cto.com??

前言

OpenHarmony的事件提供一種任務間的同步機制,簡單來說就是一個或多個任務可以通過寫一個或多個不同的事件來觸發內核調度讓另一個等待讀取事件的任務進入運行狀態,從而實現任務間的同步。具體是怎么實現的呢?今天我就帶大伙深入到內核當中,扒一扒事件的源代碼。

關鍵數據結構

在解讀事件的源碼之前還是要先了解下事件的關鍵的數據結構PEVENT_CB_S,數據結構永遠是內核學習繞不開的坎:

typedef struct tagEvent {
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_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 相當于 EVENT_CB_S *, 因此eventCB是指針,是指針,是指針,重要的話說三遍哈。

側面也說明事件控制塊由任務自己創建,內核事件模塊只負責維護。到這里大伙就知道怎么創建事件控制塊了吧,任務定義自己的事件控制塊變量,然后通過LOS_EventInit來初始化,此時沒有事件發生,當然事件鏈表空空如也。

用圖來表達就是:

事件寫操作

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

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

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

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

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

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

寫事件實際操作如下圖:

事件讀操作

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

  • LOS_EventPoll():根據任務傳入的事件值、掩碼及校驗模式,返回滿足條件的事件,任務可以主動檢查事件是否發生而不必被掛起。
  • LOS_EventRead():讀取事件,可以理解為阻塞式讀,如果事件沒有發生,可以指定等待時間,掛起當前任務;

下面是LOS_EventPoll()的實現:

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

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

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

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

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

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

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

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

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

事件銷毀操作

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

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

小結

事件模塊本身并不復雜,相信看了上面的描述大伙對事件的運作機制已經有了更深刻的理解,下面我們來個總結:

  1. 事件控制塊由任務創建,事件模塊本身只維護事件控制塊的內容。
  2. 寫事件會觸發讀事件任務被喚醒,任務調度就這么發生了。
  3. 任務可以主動查詢事件,也可以被動等待事件發生時來喚醒自己。
  4. 事件結束后根據應用場景可以有選擇的清除事件ID或(和)事件鏈表。

??想了解更多內容,請訪問:??

??51CTO和華為官方合作共建的鴻蒙技術社區??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2022-03-03 19:31:31

隊列算法Harmony

2022-08-04 13:55:08

拼數字小游戲鴻蒙

2021-05-17 09:50:06

Kubebuilde源碼CURD

2023-02-01 16:28:30

Linux內核鴻蒙

2023-04-10 09:44:22

內核鼠標調試鴻蒙

2023-07-31 17:29:21

Docker鴻蒙

2016-09-22 15:50:38

JavascriptRedux源碼解析

2011-03-23 10:30:01

LAMPApache源碼

2011-06-23 13:10:39

Python 對象機制

2021-09-17 14:38:58

鴻蒙HarmonyOS應用

2022-04-13 11:02:12

鴻蒙事件模塊事件Event

2011-06-23 14:05:32

Qt 事件機制

2022-05-20 10:32:49

事件循環器事件隊列鴻蒙

2021-06-04 09:57:49

鴻蒙HarmonyOS應用

2022-03-28 15:40:34

harmony鴻蒙操作系統

2022-04-29 14:56:40

通話應用源碼剖析

2022-03-18 15:29:02

Harmony鴻蒙架構

2022-07-27 14:30:15

分布式數據鴻蒙

2009-12-07 09:35:33

linux內核linuxS3C2410

2021-08-17 13:41:11

AndroidView事件
點贊
收藏

51CTO技術棧公眾號

伦一区二区三区中文字幕v亚洲| ,亚洲人成毛片在线播放| 91九色鹿精品国产综合久久香蕉| 久久影院视频免费| 国产成人精彩在线视频九色| 手机av免费看| 欧美精品资源| 亚洲同性同志一二三专区| 91精品国产高清久久久久久91裸体| a一级免费视频| 亚洲91网站| 午夜精彩视频在线观看不卡| 欧美男人的天堂| 中文字幕在线日亚洲9| 亚洲国产精品久久久天堂| 精品乱人伦小说| 亚洲人成无码www久久久| 中文字幕在线视频区| 国产精一品亚洲二区在线视频| 欧美激情亚洲激情| 深爱五月激情网| 欧洲一级精品| 亚洲欧美日韩在线| 久久涩涩网站| 国产精品一级视频| 亚洲专区免费| www亚洲精品| 成年人的黄色片| 精品欧美日韩精品| 亚洲午夜羞羞片| 亚洲精品第一区二区三区| 国产高清视频免费观看| 午夜在线播放视频欧美| www.亚洲男人天堂| 日本japanese极品少妇| 四虎在线精品| 在线观看一区二区精品视频| 成年人黄色在线观看| 欧美一区二区免费在线观看| 手机在线观看av| 国产精品地址| 亚洲欧洲国产精品| 午夜精品中文字幕| 欧美大片免费| 一级女性全黄久久生活片免费| 蜜桃成人在线| 天天射天天色天天干| 激情五月婷婷综合| 国产99在线|中文| 国产无套粉嫩白浆内谢| 五月婷婷六月综合| 亚洲天堂日韩电影| 91视频啊啊啊| 91麻豆精品国产91久久久久推荐资源| 91福利国产精品| 精品少妇人欧美激情在线观看| 午夜激情视频在线观看| 国产色综合久久| 成人动漫在线视频| www香蕉视频| 久久综合九色综合欧美狠狠| 91高清免费视频| 超碰在线国产97| 亚洲色图欧美| www.久久撸.com| 亚洲熟妇一区二区三区| 日日天天久久| 在线播放91灌醉迷j高跟美女| 久久精品99国产| 欧美成人ⅴideosxxxxx| 疯狂做受xxxx欧美肥白少妇| 国产妇女馒头高清泬20p多| 图片区小说区亚洲| 国产一区二区久久| 国产剧情久久久久久| 国产免费一区二区三区四区五区| 中文亚洲字幕| 青草成人免费视频| 久久精品美女视频| 黑人一区二区| 97久久久免费福利网址| 99热在线观看免费精品| 亚洲综合三区| 国产精品av电影| 成人h动漫精品一区二区下载| 亚洲激情二区| 午夜精品久久17c| av图片在线观看| 99精品热视频只有精品10| 91精品国产99久久久久久| 日本熟妇毛茸茸丰满| 在线亚洲伦理| 国产成人在线亚洲欧美| 中文在线观看av| 韩国视频一区二区| 97欧洲一区二区精品免费| 色婷婷av一区二区三区之e本道| 99国产精品久久久久久久久久久| 欧美重口乱码一区二区| 888av在线| 国产欧美综合在线观看第十页| 神马影院午夜我不卡| 国产黄大片在线观看画质优化| 亚洲一线二线三线久久久| 自慰无码一区二区三区| 欧美aaa大片视频一二区| 欧美日韩视频在线观看一区二区三区| 五月花丁香婷婷| 国产一区在线电影| 亚洲网址你懂得| 天天天天天天天天操| 亚洲高清免费| 国产精品777| 亚洲国产精品国自产拍久久| 久久久一区二区三区捆绑**| 在线不卡视频一区二区| 国产亚av手机在线观看| 色噜噜狠狠成人中文综合| 伊人国产精品视频| 日韩福利视频一区| 精品人在线二区三区| x88av在线| 国产亚洲综合精品| 91沈先生播放一区二区| 免费大片黄在线观看视频网站| 精品毛片网大全| av在线天堂网| 天天色综合色| 国产精品日韩欧美综合| 你懂的视频在线| 无码av免费一区二区三区试看| 蜜桃福利午夜精品一区| 日韩大片在线播放| 日韩免费观看在线观看| 三级视频在线看| 亚洲一区在线观看视频| 在线一区二区不卡| 久久婷婷蜜乳一本欲蜜臀| 日本人成精品视频在线| 亚洲三区在线播放| 精品av在线播放| xxxwww国产| 亚洲人人精品| 国产亚洲精品自在久久| 日韩av高清在线看片| 中文字幕av影视| 久久久久久久国产精品影院| 5月婷婷6月丁香| 伦理一区二区三区| 97在线精品视频| 内射后入在线观看一区| 亚洲国产日产av| 亚洲欧洲日韩综合| 亚洲无吗在线| 精品免费一区二区三区蜜桃| yellow在线观看网址| 亚洲精品国产电影| 青青国产在线观看| 久久综合九色欧美综合狠狠| 国产aaa一级片| 国产一区二区观看| 国产精品成人v| 成人免费在线视频网| 欧美日韩在线免费视频| 91麻豆精品久久毛片一级| 久久国产精品99久久久久久老狼| 正在播放一区二区三区| 高清一区二区三区av| 欧美精品免费在线| 欧性猛交ⅹxxx乱大交| 欧美日韩免费区域视频在线观看| 麻豆tv在线观看| 免费日韩av片| 亚洲一卡二卡区| 538任你躁精品视频网免费| 久久理论片午夜琪琪电影网| 无码国精品一区二区免费蜜桃| 日韩欧美国产激情| 国产一区二区三区四区在线| 国产真实精品久久二三区| 日本男女交配视频| 色老板在线视频一区二区| 国产精品高清免费在线观看| 成人av免费| 亚洲精品国产综合久久| 成人黄色激情视频| 亚洲综合男人的天堂| 亚洲码无人客一区二区三区| 韩国成人福利片在线播放| 国产免费黄色一级片| 国产乱码精品一区二区三区四区| 91精品久久久久久久久久另类| 美女精品视频| 一区二区三区动漫| 精品人妻一区二区三区麻豆91 | 国产精品麻豆入口| 蜜臀av性久久久久蜜臀av麻豆| 亚洲中文字幕无码一区二区三区 | 亚洲精品91美女久久久久久久| 亚洲第一区av| 午夜影院在线观看欧美| 国产人与禽zoz0性伦| 成人高清免费观看| 天堂视频免费看| 国产精品久久久免费| 日本免费在线视频观看| 美女久久久久| aaa级精品久久久国产片| 电影一区二区| 97精品视频在线| 国产丝袜在线| 国产午夜精品视频免费不卡69堂| 国 产 黄 色 大 片| 欧美日韩国产经典色站一区二区三区| 黄色小视频在线免费看| 亚洲欧洲三级电影| 国产人妻大战黑人20p| 成人性视频免费网站| 在线免费观看av网| 日韩电影在线免费| 六月激情综合网| 影音先锋久久| 国产一二三四区在线观看| 日韩成人三级| 神马影院我不卡| 精品久久久久久久| 欧美国产综合视频| 国产精品乱战久久久| 91福利视频导航| 国产精品欧美一区二区三区不卡| 国产精品精品久久久| 在线成人av观看| 韩剧1988在线观看免费完整版| 色呦呦在线看| 欧美另类69精品久久久久9999| 国产免费a∨片在线观看不卡| 日韩大陆毛片av| 丰满少妇在线观看bd| 欧美一区二区三区免费在线看| 在线观看免费观看在线| 欧美色图天堂网| 成年人视频免费| 日本精品一区二区三区四区的功能| 国产无人区码熟妇毛片多| 亚洲成人av一区二区| 国产一级视频在线| 亚洲18女电影在线观看| 五月婷婷开心网| 精品久久久久久电影| 天天干在线播放| 色综合天天视频在线观看| 精品国产一区二区三区四| 欧美视频二区36p| www毛片com| 欧美午夜理伦三级在线观看| 国产亚洲久一区二区| 欧美日韩中文字幕一区二区| 中文字幕人成人乱码亚洲电影| 欧美午夜精品一区二区蜜桃| 一级特黄录像免费看| 91精品一区二区三区在线观看| 国产青青草视频| 日韩欧美国产1| 色婷婷激情五月| 亚洲午夜性刺激影院| 日本三级在线视频| 久久精品视频在线| 蜜臀av在线| 日韩av快播网址| 欧美美女被草| 91手机在线观看| 欧美午夜18电影| 日本一区二区三区视频在线播放 | 日本免费成人| 96久久精品| 奇米影视777在线欧美电影观看| 欧美成人综合一区| 91亚洲国产高清| 日本黄色片一级片| 美女久久网站| 老司机久久精品| 成人h版在线观看| 亚洲一级片在线播放| 一区二区三区.www| 在线观看免费av片| 制服丝袜在线91| 四虎在线免费观看| 欧美性xxxx在线播放| 一级特黄免费视频| 日韩一区二区在线看| 日本福利午夜视频在线| 久久久国产精品亚洲一区| av在线小说| 国产日韩欧美夫妻视频在线观看| 一本色道69色精品综合久久| 免费在线国产精品| 在线成人直播| 无码少妇一区二区三区芒果| 国产精品一色哟哟哟| 性猛交ⅹxxx富婆video| 一区二区三区日韩在线观看| 亚洲婷婷综合网| 日韩欧美一级二级三级| 黄色片在线播放| 欧美激情综合色| 中文字幕日韩亚洲| 欧美精品亚洲| 伊人成人在线| 中文国产在线观看| 国产欧美日韩精品一区| 国产午夜精品无码| 欧美一区二区网站| av午夜在线| 茄子视频成人在线| 国产日韩三级| 欧美美女黄色网| 久久www免费人成看片高清| 亚洲精品成人无码熟妇在线| 亚洲综合激情网| 国产精品九九九九| 亚洲一区www| 在线视频超级| 国产综合色一区二区三区| 永久91嫩草亚洲精品人人| 国产日韩欧美综合| 久久草在线视频| 日韩欧美一级在线| 久久精品国产免费| 精品无码在线观看| 黑人精品xxx一区| 天堂中文在线资源| 国模精品视频一区二区三区| 精品一区二区三区亚洲| 一区二区三区偷拍| 美女视频一区在线观看| 国产成人精品无码免费看夜聊软件| 性欧美大战久久久久久久久| 亚洲精品久久久久久无码色欲四季| 久久久av网站| av成人在线网站| 国产欧美综合一区| 国产一区欧美日韩| 91插插插插插插| 欧美一区二区三区精品| 国产成人午夜| 91久久精品一区二区别| 中文字幕日韩一区二区不卡| 三级黄色片免费看| 亚洲免费大片在线观看| 国产三级午夜理伦三级| 欧美精品免费在线| 国产成人在线中文字幕| 老太脱裤让老头玩ⅹxxxx| 不卡欧美aaaaa| 美日韩一二三区| 亚洲天堂男人天堂女人天堂| 福利一区二区三区视频在线观看| 日韩中文字幕一区二区| 久久精品国产一区二区三| 日韩激情小视频| 欧美成人一区二区三区片免费| 在线黄色网页| 国偷自产av一区二区三区小尤奈| 国产精品主播| 91麻豆精品国产91久久综合| 欧美片在线播放| 好吊日av在线| 久久国产手机看片| 日韩专区中文字幕一区二区| 成人信息集中地| 欧美成人女星排行榜| 自拍在线观看| 一本色道久久综合亚洲精品婷婷| 国产精品一区专区| 日产精品久久久| 色系列之999| 97青娱国产盛宴精品视频| 欧美日韩中文在线视频| 国产精品福利影院| 黑人精品一区二区三区| 日韩免费精品视频| 欧美 日韩 国产一区二区在线视频 | 亚洲va电影大全| 一本色道久久综合亚洲精品不卡| 欧美 日韩 成人| 日韩女同互慰一区二区| 亚洲深夜视频| 欧美精品一区二区性色a+v| 成人激情综合网站| 国产精品sm调教免费专区| 欧美另类精品xxxx孕妇| 欧美人与拘性视交免费看| 日本高清免费在线视频| 欧美日韩国产精品专区| 免费黄色网页在线观看| 欧美成人综合一区| 国产盗摄精品一区二区三区在线| 亚洲影院在线播放| 欧美国产日韩中文字幕在线| 久9久9色综合|