精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品天堂蜜av在线播放| 一级片一级片一级片| av网站在线免费| 国产一区二区三区在线看麻豆| www.99久久热国产日韩欧美.com| 欧美女同在线观看| 羞羞的视频在线看| 波多野结衣一区二区三区在线观看 | 国产高潮流白浆| 精品国产一区二区三区性色av| 综合婷婷亚洲小说| 欧美日本在线播放| 日韩国产欧美一区| 国产三级午夜理伦三级| 国精品一区二区三区| 亚洲激情中文字幕| 牛夜精品久久久久久久| 中文在线字幕免费观看| 91香蕉视频污在线| 国产在线精品自拍| 黄色小说在线观看视频| 精品一区电影| 色老头久久综合| 五月天综合婷婷| 五月婷婷在线播放| 九一久久久久久| 97在线精品国自产拍中文| 国产三级av在线播放| 黄色成人小视频| 五月天激情小说综合| 色噜噜狠狠色综合网| 亚洲精品无码久久久| 国产日韩欧美一区| 超碰91人人草人人干| 亚洲永久无码7777kkk| 国产精品**亚洲精品| 色综合久久天天综合网| 日本黄网站色大片免费观看| 久久久资源网| 成人免费福利片| 国产免费一区二区三区在线能观看 | 国产又黄又爽免费视频| 精品亚洲美女网站| 91精品亚洲| 日韩激情视频在线| 午夜激情视频网| 欧美成人精品三级网站| 亚洲一级电影视频| 一本—道久久a久久精品蜜桃| 可以在线观看的黄色| 日韩欧美在线观看一区二区| 一区二区高清| 亚洲一级片在线看| 小毛片在线观看| 国产精品20p| 成人综合网站| 精品久久久久久| 成人国产在线看| 黄页视频在线播放| 国产欧美一区二区精品仙草咪| 99视频在线| jizz中国少妇| 韩国一区二区三区| 欧美一级电影在线| 日韩女同强女同hd| 国产专区一区| 中文字幕久热精品在线视频| 欧美熟妇激情一区二区三区| 免费短视频成人日韩| 日韩美女视频在线| 韩国三级与黑人| 精品国产一级| 精品国产欧美一区二区| 91精品国产高清91久久久久久| 在线成人视屏| 欧美伊人久久大香线蕉综合69| 妞干网在线免费视频| 另类专区亚洲| 国产视频一视频二| 日本韩国在线观看| 国产v日产∨综合v精品视频| 91久久国产综合久久91精品网站 | 国产一区二区电影| 91精品免费久久久久久久久| 国产精品探花视频| 国产成人免费在线观看不卡| 国内精品二区| 岛国视频免费在线观看| 亚洲欧美自拍偷拍色图| 肉大捧一出免费观看网站在线播放| 91老司机福利在线| 在线精品观看国产| 香蕉网在线视频| 亚洲高清极品| www国产精品com| 激情综合网五月婷婷| 日韩电影网1区2区| 成人国产一区二区| 黄色片免费在线| 亚洲欧美偷拍另类a∨色屁股| 国自产拍偷拍精品啪啪一区二区| 日韩av官网| 欧美色视频在线| 乱码一区二区三区| 成人一区不卡| 91精品国产乱码久久久久久久久| 在线观看毛片网站| av成人老司机| 国风产精品一区二区| 成人影院入口| 欧美v亚洲v综合ⅴ国产v| 性猛交ⅹxxx富婆video| 99精品热6080yy久久| 国产日本欧美视频| 欧洲视频在线免费观看| 一区二区三区波多野结衣在线观看| 成人一区二区三| 精品久久97| 美女av一区二区三区| 日韩精品一区二区亚洲av观看| 国产99久久久国产精品免费看| 亚洲草草视频| 波多野结衣亚洲| 亚洲黄在线观看| 高h视频免费观看| 国产精品久久久免费视频| 亚洲免费观看| 亚洲xxxx做受欧美| h视频在线免费| 欧美性猛交丰臀xxxxx网站| 亚洲精品97久久| 天天综合网日韩| 免费观看不卡av| 777国产偷窥盗摄精品视频| 国产草草影院ccyycom| 国产精品青草久久| 无码少妇一区二区三区芒果| 欧美日韩麻豆| 韩剧1988免费观看全集| 亚洲女同志亚洲女同女播放| 亚洲人成网站精品片在线观看| 中文字幕第38页| av伊人久久| 国产精品r级在线| 日本人妖在线| 欧美小视频在线| 免费在线观看你懂的| 午夜一区不卡| 蜜桃精品久久久久久久免费影院| 第一福利在线视频| 亚洲国产成人精品久久| 国产黄色片视频| 国产a视频精品免费观看| 日本福利视频在线观看| 视频一区日韩精品| 久久久久国色av免费观看性色| 亚洲精品无amm毛片| 亚洲福利一区二区| 污污内射在线观看一区二区少妇| 亚洲精品欧洲| 久久精品欧美| 最新日韩一区| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 亚洲第一香蕉网| 日日欢夜夜爽一区| 亚洲欧美丝袜| 国产精品亚洲一区二区在线观看| 久久99精品视频一区97| 午夜影院免费视频| 色呦呦一区二区三区| 国产精品69久久久久孕妇欧美| 久久99蜜桃精品| 国产一区二区三区在线免费| 欧美成人专区| 国产精品日韩久久久久| 成码无人av片在线观看网站| 精品成人a区在线观看| 欧美性猛交bbbbb精品| 欧美国产一区视频在线观看| www.午夜av| 99在线精品视频在线观看| 日韩久久久久久久| 国产精品日本一区二区三区在线| 欧美劲爆第一页| 欧美孕妇性xxxⅹ精品hd| 在线国产亚洲欧美| 欧美做爰爽爽爽爽爽爽| 97se狠狠狠综合亚洲狠狠| 国产视频一区二区三区在线播放 | 久久久国产精品网站| 久久午夜a级毛片| 免费观看a视频| 欧洲av在线精品| 国产一级在线视频| 国产片一区二区三区| 91视频免费入口| 天堂资源在线中文精品| 久久国产精品免费观看| 精品中文字幕一区二区三区av| 91久久精品国产91性色| 亚洲风情在线资源| 久色乳综合思思在线视频| 亚洲色欧美另类| 欧美一级搡bbbb搡bbbb| 69亚洲精品久久久蜜桃小说| 亚洲人成精品久久久久久| 无套内谢大学处破女www小说| 国内久久婷婷综合| av动漫在线观看| 欧美午夜在线| 五月天色婷婷综合| 久久成人av| 国产精品日韩一区二区| **国产精品| 日韩av大片在线| 96av在线| 欧美激情视频网| 瑟瑟视频在线| 国产亚洲福利一区| 日韩有码第一页| 欧美一区二区性放荡片| 久久精品国产亚洲av麻豆蜜芽| 亚洲成av人片在线观看| 九九九久久久久| 亚洲欧洲精品一区二区精品久久久| 成人影视免费观看| 成人毛片视频在线观看| 绯色av蜜臀vs少妇| 国产一区美女在线| 无尽裸体动漫2d在线观看| 久久久久99| 国产成人精品视频免费看| 韩国一区二区三区在线观看| www.99riav| 一区二区三区网站| 免费成人进口网站| 91视频综合| 一区不卡字幕| 91欧美日韩| 国产熟女一区二区三区五月婷 | 色一情一区二区三区| 国产夫妻性生活视频| 午夜精品久久久久久久久久久| 尤物在线免费视频| 成人免费在线播放视频| 91麻豆制片厂| 中文一区二区在线观看| 国产精品美女高潮无套| 国产亚洲人成网站| 久久精品视频18| 国产亚洲1区2区3区| 91网站免费视频| 久久久久久免费毛片精品| 在线观看国产免费视频| 91在线国产福利| 草草影院第一页| 久久久久久久一区| 国产伦理片在线观看| 亚洲国产精品激情在线观看| 黄色av片三级三级三级免费看| 欧美激情一区二区在线| 精品熟妇无码av免费久久| 亚洲国产精品高清| 日本在线一级片| 一区二区三区在线观看欧美| 久久国产精品二区| 精品国产91久久久久久| 亚洲第一在线播放| 在线观看亚洲成人| 一级α片免费看刺激高潮视频| 欧美精品一二三四| a视频免费在线观看| 亚洲国产精品电影在线观看| 男同在线观看| 日韩中文娱乐网| 日韩精品亚洲人成在线观看| 欧美一级在线播放| 成人av色网站| 肥熟一91porny丨九色丨| 日本韩国欧美超级黄在线观看| 欧美亚洲精品日韩| 97精品视频| 婷婷无套内射影院| 天堂午夜影视日韩欧美一区二区| 污视频网址在线观看| 高清国产一区二区三区| 高潮毛片无遮挡| 亚洲伦在线观看| 国产91精品一区| 欧美日本视频在线| 好吊视频一区二区三区| 在线免费看av不卡| 亚洲第一图区| 国产精品嫩草视频| 超碰成人在线观看| 亚洲欧美99| 亚洲激情二区| 激情黄色小视频| 99久免费精品视频在线观看| 91禁男男在线观看| 欧美日韩国产激情| 国产口爆吞精一区二区| 亚洲免费人成在线视频观看| 91蜜桃在线视频| 国产精品91免费在线| 大桥未久女教师av一区二区| 亚洲国产婷婷香蕉久久久久久99| 伊人精品在线| 超碰超碰在线观看| 26uuu国产电影一区二区| 国产在线一卡二卡| 色88888久久久久久影院野外| 性欧美一区二区三区| 在线看福利67194| 韩国主播福利视频一区二区三区| 91视频免费在线观看| 日韩.com| 久章草在线视频| www.日韩在线| 国产一级黄色av| 制服丝袜国产精品| 性开放的欧美大片| 国产精品h在线观看| 日韩欧美在线精品| www.射射射| 国产精品影视网| 成人三级视频在线观看| 色菇凉天天综合网| 日韩三级电影网| 午夜欧美不卡精品aaaaa| 精品国产第一国产综合精品| 亚洲精品一区二区三| 美女精品一区| 亚洲第一页av| 欧美特黄级在线| 全色精品综合影院| 91国内在线视频| 久草精品视频| 日本中文字幕网址| 国产成人免费视| 欧美精品一区二区成人| 欧美一级欧美三级在线观看| 国内精品久久久久国产| 成人黄色片在线| 91亚洲国产| 尤物网站在线看| 亚洲欧美日韩国产综合| 99热在线只有精品| 九九精品在线播放| 51亚洲精品| 国产资源在线免费观看| 成人黄色一级视频| 日韩久久久久久久久| 亚洲激情电影中文字幕| 中文av在线全新| 日本不卡一区| 免费观看久久久4p| 午夜黄色福利视频| 欧美一区二区久久久| 金瓶狂野欧美性猛交xxxx| 国产精品9999久久久久仙踪林| 亚洲国产1区| 黄色性生活一级片| 欧美性猛交xxxx乱大交| yourporn在线观看视频| 国产欧美最新羞羞视频在线观看| 久久久久久久久久久妇女| 午夜av中文字幕| 亚洲一区在线观看免费| 亚洲色图欧美视频| 国产成人精品电影| 91久久久精品国产| 四虎精品一区二区| 一本大道久久a久久综合婷婷| 亚洲成人三级| 俄罗斯精品一区二区| 久色成人在线| а天堂中文在线资源| 精品人伦一区二区色婷婷| 亚洲最大网站| 国产精品12p| a美女胸又www黄视频久久| 无码人妻丰满熟妇精品| 久久av红桃一区二区小说| 久久电影在线| 污网站免费在线| 一区二区三区免费网站| 九九热视频在线观看| 91免费的视频在线播放| 在线综合欧美| 羞羞在线观看视频| 亚洲第一精品夜夜躁人人爽| av高清一区| 青青在线视频免费观看| 国产欧美精品在线观看| 亚洲精品国产av| 国产精品自拍偷拍视频| 999在线观看精品免费不卡网站| 免费看的黄色录像| 日韩av综合网|