![同步互斥與 通信.ppt_第1頁](http://file1.renrendoc.com/fileroot2/2020-1/18/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f06/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f061.gif)
![同步互斥與 通信.ppt_第2頁](http://file1.renrendoc.com/fileroot2/2020-1/18/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f06/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f062.gif)
![同步互斥與 通信.ppt_第3頁](http://file1.renrendoc.com/fileroot2/2020-1/18/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f06/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f063.gif)
![同步互斥與 通信.ppt_第4頁](http://file1.renrendoc.com/fileroot2/2020-1/18/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f06/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f064.gif)
![同步互斥與 通信.ppt_第5頁](http://file1.renrendoc.com/fileroot2/2020-1/18/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f06/7f9eb713-3e84-4444-b3fc-2c4f7d8c8f065.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、第10講 同步互斥與通信,授課教師: 電郵地址:,2020/7/30,2,主要內(nèi)容,信號量 郵箱和消息隊列 事件 異步信號*,2020/7/30,3,概述,多任務系統(tǒng)中任務之間的關系 相互獨立 僅競爭CPU資源 競爭除CPU外的其他資源(互斥) 同步 協(xié)調(diào)彼此運行的步調(diào) 通信 彼此間傳遞數(shù)據(jù)或信息,以協(xié)同完成某項工作,2020/7/30,4,任務能以以下方式與中斷處理程序或其他任務進行同步或通信: 單向同步或通信:一個任務與另一個任務或一個ISR同步或通信。 雙向同步或通信:兩個任務相互同步或通信。雙向同步不能在任務與ISR之間進行,因為ISR不能等待。,概述,2020/7/30,5,任務與任
2、務之間的同步(單向),任務與ISR之間的同步(單向),任務與任務之間的同步(雙向),2020/7/30,6,在嵌入式多任務系統(tǒng)中,任務間的耦合程度是不一樣的: 耦合程度較高:任務之間需要進行大量的通信,相應的系統(tǒng)開銷較大; 耦合程度較低:任務之間不存在通信需求,其間的同步關系很弱甚至不需要同步或互斥,系統(tǒng)開銷較小。 研究任務間耦合程度的高低對于合理地設計應用系統(tǒng)、劃分任務有很重要的作用。,概述,2020/7/30,7,在單處理器平臺上,嵌入式操作系統(tǒng)內(nèi)核提供的同步、互斥與通信機制主要包括: 信號量(semaphore),用于互斥與同步 事件(組)(event group),用于同步 異步信號(
3、asynchronous signal),用于同步 郵箱(mailbox)、消息隊列(message queue)或管道(pipe),用于消息通信,概述,2020/7/30,8,以下一些機制也可用于同步與通信(在單處理器或多處理器系統(tǒng)中): 全局變量 共享內(nèi)存 Sockets 遠程過程調(diào)用(Remote Procedure Call),概述,2020/7/30,9,1.信號量,信號量的種類及用途 互斥信號量 二值信號量 計數(shù)信號量 信號量機制的主要數(shù)據(jù)結構 信號量的主要功能,2020/7/30,10,信號量用于實現(xiàn)任務與任務之間、任務與中斷處理程序之間的同步與互斥。 信號量一般分為三種: 用于
4、解決互斥問題的互斥信號量。它比較特殊,可能會引起優(yōu)先級反轉問題。 用于解決同步問題的二值信號量。 用于解決資源計數(shù)問題的計數(shù)信號量。 將信號量進行種類細分,可以根據(jù)其用途,在具體實現(xiàn)時做專門處理,提高執(zhí)行效率和可靠性。,信號量的種類及用途,2020/7/30,11,用互斥信號量保護的代碼區(qū)稱作“臨界區(qū)”,臨界區(qū)代碼通常用于對共享資源的訪問。 互斥信號量的值被初始化成1,表明目前沒有任務進入“臨界區(qū)”,但最多只有一個任務可以進入“臨界區(qū)”。 第一個試圖進入“臨界區(qū)”的任務將成功獲得互斥信號量,而隨后試圖進入用同一信號量保護的臨界區(qū)的所有其他任務就必須等待。 當任務離開“臨界區(qū)”時,它將釋放信號量
5、并允許正在等待該信號量的任務進入“臨界區(qū)”。,互斥信號量,2020/7/30,12,各種互斥機制比較,2020/7/30,13,二值信號量,二值信號量主要用于任務與任務之間、任務與中斷服務程序之間的同步 用于同步的二值信號量初始值為0,表示同步事件尚未產(chǎn)生; 任務申請信號量以等待該同步事件的發(fā)生; 另一個任務或ISR到達同步點時,釋放信號量(將其值設置為1)表示同步事件已發(fā)生,以喚醒等待的任務。,2020/7/30,14,二值信號量,available,unavailable,acquire (value=0),release (value=1),Initial value=0,二值信號量狀態(tài)
6、圖,2020/7/30,15,Task1() 執(zhí)行一些操作; 將信號量sem1置1; 申請信號量sem2; ,Task2() 申請信號量sem1; 執(zhí)行一些操作; 將信號量sem2置1; ,Task2申請信號量sem1失敗,系統(tǒng)切換到Task1,sem1被置1后,Task2得到sem1并搶占Task1,Task2運行到某處時因某種原因被阻塞,系統(tǒng)切換到Task1,用二值信號量實現(xiàn)兩個任務之間的雙向同步 Task2優(yōu)先級高于Task1 sem1和sem2的初始值均為0,2020/7/30,16,計數(shù)信號量,計數(shù)信號量用于控制系統(tǒng)中共享資源的多個實例的使用,允許多個任務同時訪問同一種資源的多個實例
7、 計數(shù)信號量被初始化為n(非負整數(shù)),n為該種共享資源的數(shù)目。,2020/7/30,17,計數(shù)信號量,2020/7/30,18,計數(shù)信號量,計數(shù)信號量使用實例:有界緩沖問題,2020/7/30,19,生產(chǎn)者任務 do 產(chǎn)生一個數(shù)據(jù)項 申請empty 申請mutex 將新生成的數(shù)據(jù)項添加到緩沖中 釋放mutex 釋放full while (1);,消費者任務 do 申請full 申請mutex 從緩沖中移出一個數(shù)據(jù)項的內(nèi)容 釋放mutex 釋放empty 消費新獲得的數(shù)據(jù)項內(nèi)容 while (1);,計數(shù)信號量full:已被填充的數(shù)據(jù)項數(shù)目,取值范圍0n,初始值為0 計數(shù)信號量empty:空閑數(shù)
8、據(jù)項數(shù)目,取值范圍為0n,初始值為n; 互斥信號量mutex:控制生產(chǎn)者任務和消費者任務對有界緩沖的訪問,初始值為1。,2020/7/30,20,信號量機制的主要數(shù)據(jù)結構,信號量控制塊:管理所有創(chuàng)建的信號量,內(nèi)核在系統(tǒng)運行時動態(tài)分配和回收信號量控制塊 互斥和二值信號量控制塊結構:Binary_Semaphore_Control_Block,wait_queue任務等待隊列 attributes信號量屬性 wait_discipline任務等待信號量的方式 priority_ceiling優(yōu)先級天花板值 lock是否被占有 holder擁有者 count當前計數(shù)值,2020/7/30,21,信號
9、量內(nèi)部實現(xiàn)機制實例說明C/OS-II,事件控制塊ECB同步與通信機制的基本數(shù)據(jù)結構 typedef struct INT8UOSEventType;/事件類型 INT8UOSEventGrp;/等待任務所在的組 INT16UOSEventCnt;/計數(shù)器(信號量) void*OSEventPtr;/指向消息或消息隊列的指針 INT8UOSEventTblOS_EVENT_TBL_SIZE;/等待任務列表 OS_EVENT;,2020/7/30,22,信號量內(nèi)部實現(xiàn)機制實例說明C/OS-II,當一個事件發(fā)生后,等待事件列表中優(yōu)先級最高的任務(即在.OSEventTbl pevent-OSEven
10、tTblprio 3 |= OSMapTblprio 與將一個任務插入到就緒列表中的操作類似!,Index Bit mask (Binary) 0 00000001 1 00000010 2 00000100 3 00001000 4 00010000 5 00100000 6 01000000 7 10000000,2020/7/30,25,信號量內(nèi)部實現(xiàn)機制實例說明C/OS-II,從等待事件的任務列表中使任務脫離等待狀態(tài) if (pevent-OSEventTblprio 3 與將任務從就緒列表中清除的操作類似!,2020/7/30,26,信號量內(nèi)部實現(xiàn)機制實例說明C/OS-II,在等待事
11、件的任務列表中查找優(yōu)先級最高的任務 y = OSUnMapTblpevent-OSEventGrp; x = OSUnMapTblpevent-OSEventTbly; prio = (y 3) + x; 與查找優(yōu)先級最高的就緒任務的操作類似!,2020/7/30,27,信號量內(nèi)部實現(xiàn)機制實例說明C/OS-II,空閑事件控制塊鏈表,2020/7/30,28,信號量的主要功能,創(chuàng)建信號量 獲?。ㄉ暾垼┬盘柫?釋放信號量 刪除信號量 獲取有關信號量的各種信息,2020/7/30,29,創(chuàng)建信號量,功能:根據(jù)應用傳遞的參數(shù)創(chuàng)建一個信號量 參數(shù):信號量的名字、屬性和初始值等。 內(nèi)核動作: 從空閑信號量
12、控制塊鏈中分配一個信號量控制塊,并初始化信號量屬性。 創(chuàng)建成功時,為其分配唯一的ID號返回給應用。 如果已創(chuàng)建信號量數(shù)量已達到用戶配置的最大數(shù)量,就返回錯誤。,2020/7/30,30,創(chuàng)建信號量,信號量的屬性包括其類型、任務等待信號量的方式(即排列的順序)、解決優(yōu)先級反轉的策略。 信號量的類型 互斥信號量(MUTEX_SEMAPHORE) 計數(shù)信號量(COUNTING_SEMAPHORE) 二值信號量(BINARY_SEMAPHORE),2020/7/30,31,創(chuàng)建信號量,任務等待信號量的方式 先進先出(FIFO)順序 優(yōu)先級(PRIORITY)順序 優(yōu)先級反轉問題的解決方法(只適用于互斥
13、信號量) 優(yōu)先級繼承算法(INHERIT_PRIORITY) 優(yōu)先級天花板算法(PRIORITY_CEILING) ,需給出所有可能獲得此信號量的任務中優(yōu)先級最高的任務的優(yōu)先級。,2020/7/30,32,創(chuàng)建一個信號量OSSemCreate(),OS_EVENT *OSSemCreate (INT16U cnt) OS_EVENT *pevent; pevent = OSEventFreeList;/從空閑事件控制塊鏈中取得一個ECB if (OSEventFreeList != (OS_EVENT *)0) OSEventFreeList = (OS_EVENT *)OSEventFree
14、List-OSEventPtr; if (pevent != (OS_EVENT *)0) /初始化ECB的各個域 pevent-OSEventType = OS_EVENT_TYPE_SEM; /事件類型為信號量 pevent-OSEventCnt = cnt; /信號量的初始計數(shù)值 pevent-OSEventPtr = (void *)0; OS_EventWaitListInit(pevent); /初始化等待任務列表 return (pevent); /調(diào)用者需檢查返回值,如果為NULL則表示建立失敗 ,2020/7/30,33,獲?。ㄉ暾垼┬盘柫?功能:試圖獲得應用指定的信號量。
15、if 信號量的值大于0 then 將信號量的值減1 else 根據(jù)接收信號量的選項,將任務放到等待隊列中,或是直接返回,2020/7/30,34,獲?。ㄉ暾垼┬盘柫?當所申請的信號量不能被立即獲得時,可以有以下幾種選擇: 永遠等待 不等待,立即返回,并返回一個錯誤狀態(tài)碼 指定等待時限(可有效避免死鎖) 注意: 不允許在ISR中選擇等待 當任務選擇等待時,將被按FIFO或優(yōu)先級順序放置在等待隊列中,2020/7/30,35,獲?。ㄉ暾垼┬盘柫?如果任務等待一個使用優(yōu)先級繼承算法的互斥信號量,且它的優(yōu)先級高于當前正占有此信號量的任務的優(yōu)先級,那么占有信號量的任務將繼承這個被阻塞的任務的優(yōu)先級。 如
16、果任務成功地獲得一個采用優(yōu)先級天花板算法的互斥信號量,它的優(yōu)先級又低于優(yōu)先級天花板,那么它的優(yōu)先級將被抬升至天花板。,2020/7/30,36,獲?。ǖ却┮粋€信號量OSSemPend(),void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err) if (pevent-OSEventCnt 0) /信號量值大于0,成功獲得信號量并返回 pevent-OSEventCnt-; *err = OS_NO_ERR; return; OSTCBCur-OSTCBStat |= OS_STAT_SEM; /設置任務狀態(tài)為等待信號量 OST
17、CBCur-OSTCBDly = timeout; /設置等待時限 OS_EventTaskWait(pevent);/將任務放置到信號量的等待列表中 OS_Sched(); /內(nèi)核實施任務調(diào)度,系統(tǒng)切換到另一就緒任務執(zhí)行 if (OSTCBCur-OSTCBStat /任務由于獲得信號量而恢復執(zhí)行,本調(diào)用成功返回 ,2020/7/30,37,獲?。o等待地請求)一個信號量OSSemAccept(),INT16U OSSemAccept (OS_EVENT *pevent) INT16U cnt; cnt = pevent-OSEventCnt; if (cnt 0) pevent-OSEve
18、ntCnt-; return (cnt); ,注意:即使不能成功獲得信號量(返回值為0),調(diào)用者也不會被阻塞。此函數(shù)可以在中斷處理程序中使用。,2020/7/30,38,釋放信號量,功能:釋放一個應用指定的信號量。 if 沒有任務等待這個信號量 then 信號量的值加1 else 將信號量分配給一個等待任務(將相應的任務移出等待隊列,使其就緒) 如果使用了優(yōu)先級繼承或優(yōu)先級天花板算法,那么執(zhí)行該功能(系統(tǒng)調(diào)用)的任務的優(yōu)先級將恢復到原來的高度。,2020/7/30,39,釋放一個信號量OSSemPost(),INT8U OSSemPost (OS_EVENT *pevent) if (peve
19、nt-OSEventGrp!=0 x00) /如果有任務在等待該信號量 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /使等待任務列表中優(yōu)先級最高的任務就緒 OS_Sched(); /內(nèi)核實施任務調(diào)度 return (OS_NO_ERR);/成功返回 if (pevent-OSEventCnt OSEventCnt+; /信號量的值加1 return (OS_NO_ERR);/成功返回 return (OS_SEM_OVF);/信號量溢出 ,2020/7/30,40,刪除信號量,功能:從系統(tǒng)中刪除應用指定的一個信號量 內(nèi)核動作:將信號量控制塊
20、返還給系統(tǒng) 刪除信號量的不一定是創(chuàng)建信號量的任務 如果有任務正在等待獲得該信號量,執(zhí)行此功能將使所有等待這個信號量的任務回到就緒隊列中,且返回一個狀態(tài)碼指示該信號量已被刪除,2020/7/30,41,刪除一個信號量OSSemDel(),OS_EVENT *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err) BOOLEAN tasks_waiting; if(pevent-OSEventGrp!=0 x00/根據(jù)是否有任務在等待信號量設置等待標志 tasks_waiting=TRUE; else tasks_waiting=FALSE; switc
21、h(opt) case OS_DEL_NO_PEND:/如果有任務等待信號量則不刪除信號量 if(task_waiting=FALSE/沒有任務等待,釋放ECB回空閑鏈 pevent-OSEventType=OS_EVENT_TYPE_UNUSED; pevent-OSEventPtr=OSEventFreeList; OSEventFreeList=pevent;/調(diào)整空閑ECB鏈頭指針 *err=OS_NO_ERR; return(OS_EVENT)0); else*err=OS_ERR_TASK_WAITING;/有任務等待,刪除信號量失敗 return(pevent); ,2020/7
22、/30,42,刪除一個信號量OSSemDel(),case OS_DEL_ALWAYS:/無論有無任務等待都刪除信號量 /將等待列表中的每個任務都設置成就緒 while(pevent-OSEventGrp!=0 x00) OS_EventTaskRdy(pevent,(void *)0, OS_STAT_SEM); /釋放該信號量的ECB回空閑控制塊鏈 pevent-OSEventType=OS_EVENT_TYPE_UNUSED; pevent-OSEventFreeList; OSEventFreeList=pevent; /如果之前有任務等待信號量,內(nèi)核實施任務調(diào)度 if(tasks_w
23、aiting=TRUE)OS_Sched(); *err=OS_NO_ERR; return(OS_EVENT *)0); default: *err=OS_ERR_INVALID_OPT; return(pevent); ,2020/7/30,43,2.郵箱和消息隊列,概述 消息隊列機制的主要數(shù)據(jù)結構 消息隊列的主要功能,2020/7/30,44,任務間的通信方式 直接通信。在通信過程中雙方必須明確地知道(命名)彼此: Send (P,message) 發(fā)送一個消息到任務P Receive(Q,message) 從任務Q接收一個消息 間接通信。通信雙方不需要指出消息的來源或去向,而通過中間機
24、制來通信。如: send(A,message) 發(fā)送一個消息給郵箱A receive(A,message) 從郵箱A接收一個消息,概述,2020/7/30,45,消息隊列:屬于間接通信方式 消息:內(nèi)存空間中一段長度可變的緩沖區(qū),其長度和內(nèi)容均可以由用戶定義,其內(nèi)容可以是實際的數(shù)據(jù)、數(shù)據(jù)塊的指針或空。 對消息內(nèi)容的解釋由應用完成。 從操作系統(tǒng)觀點看,消息沒有定義的格式,所有的消息都是字節(jié)流,沒有特定的含義。 從應用觀點看,根據(jù)應用定義的消息格式,消息被解釋成特定的含義。 應用可以只把消息當成一個標志,這時消息機制用于實現(xiàn)同步,概述,2020/7/30,46,一些操作系統(tǒng)內(nèi)核把消息進一步分為:郵箱
25、和消息隊列 郵箱僅能存放單條消息,它提供了一種低開銷的機制來傳送信息。每個郵箱可以保存一條大小為若干個字節(jié)的消息。 消息隊列可存放若干消息,提供了一種任務間緩沖通信的方法。 消息機制可支持定長與可變長度兩種模式的消息,可變長度的消息隊列需要對隊列中的每一條消息增加額外的存儲開銷。,概述,2020/7/30,47,消息隊列機制的主要數(shù)據(jù)結構,消息隊列控制塊 管理所有創(chuàng)建的消息隊列,系統(tǒng)運行時動態(tài)分配和回收消息隊列控制塊 消息隊列緩沖區(qū) 存放發(fā)送到該隊列的消息,接收者從緩沖區(qū)中取出消息。 消息的發(fā)送或接收有兩種方法(影響消息緩沖區(qū)結構): 將數(shù)據(jù)從發(fā)送任務的空間完全拷貝到接收任務的空間中(效率較低
26、,執(zhí)行時間與消息大小有關) 只傳遞指向數(shù)據(jù)存儲空間的指針(提高系統(tǒng)性能),2020/7/30,48,發(fā)送和接收消息的消息拷貝和內(nèi)存使用 這種消息傳遞方法效率低、占用空間大 一種效率更高的方式是傳遞消息指針,2020/7/30,49,number_of_message,max_message_count,消息隊列控制塊,消息隊列緩沖區(qū),消息隊列機制的主要數(shù)據(jù)結構,2020/7/30,50,消息隊列的環(huán)形緩沖,消息隊列機制的主要數(shù)據(jù)結構,2020/7/30,51,消息隊列的主要功能,創(chuàng)建消息隊列 發(fā)送普通消息 發(fā)送緊急消息 發(fā)送廣播消息 接收消息 刪除消息隊列 獲取有關消息隊列的各種信息,2020
27、/7/30,52,消息隊列的主要功能,隨著任務(或ISR)不斷地向(從)消息隊列發(fā)送(接收)消息,消息隊列的狀態(tài)不斷轉換,可以有如下幾種狀態(tài): 消息隊列為空 消息隊列為空且有任務等待接收消息 消息隊列中有消息,但未滿 消息隊列滿 消息隊列滿,且有任務等待向它發(fā)送消息,2020/7/30,53,創(chuàng)建消息隊列,創(chuàng)建消息隊列時,調(diào)用者可以指定如下參數(shù): 消息的最大長度 每個消息隊列中最多的消息數(shù) 消息隊列的屬性 任務等待消息時的排隊方式:FIFO或PRIORITY 系統(tǒng)為新創(chuàng)建的消息隊列分配唯一的ID,2020/7/30,54,發(fā)送消息,根據(jù)緊急程度的不同,消息通??煞譃槠胀ㄏ⑴c緊急消息。 如果有
28、任務正在等待消息(即消息隊列為空),則普通消息發(fā)送和緊急消息發(fā)送的執(zhí)行效果是一樣的。任務從等待隊列移到就緒隊列中,消息被拷貝到任務提供的緩沖區(qū)中(或者由接收任務得到指向消息的指針)。 如果沒有任務等待,發(fā)送普通消息將消息放在隊列尾,而發(fā)送緊急消息將消息放在隊列頭。,2020/7/30,55,發(fā)送消息,2020/7/30,56,發(fā)送消息,如果發(fā)送消息時隊列已被填滿,則不同的操作系統(tǒng)可能采取不同的處理辦法: 掛起試圖向已滿的消息隊列中發(fā)送消息的任務(不適用于中斷服務程序) 簡單地丟棄該條消息并向調(diào)用者返回錯誤信息 廣播消息。在此之前所有試圖從隊列中接收消息的任務此時都將獲得相同的消息。該功能拷貝消
29、息到各任務的消息緩沖中(或者讓所有的等待任務得到指向消息的指針),并喚醒所有的等待任務。,2020/7/30,57,接收消息,如果指定的消息隊列中有消息,則將其中的第一條消息拷貝到調(diào)用者的緩沖區(qū)(或者將第一條消息指針傳遞給調(diào)用者),并從消息隊列中刪除它。 如果此時消息隊列中沒有消息,則可能出現(xiàn)以下幾種情況: 永遠等待消息的到達:等待消息的任務按FIFO或優(yōu)先級高低順序排列在等待隊列中 等待消息且指定等待時限:等待消息的任務按FIFO或優(yōu)先級高低順序排列在等待隊列中 不等待,強制立即返回,2020/7/30,58,接收消息,限時等待可有效預防死鎖 中斷服務程序接收消息時必須選擇不等待,因為中斷服
30、務程序是不能被阻塞的。 如果消息隊列被應用刪除,則所有等待該消息隊列的任務都被返回一個錯誤信息,并回復到就緒狀態(tài)。,2020/7/30,59,接收消息,2020/7/30,60,刪除消息隊列,從系統(tǒng)中刪除指定的消息隊列,釋放消息隊列控制塊及消息隊列緩沖區(qū)。 任何知道此消息隊列ID號的代碼都可以刪除它。 消息隊列被刪除后,所有等待從這個消息隊列接收消息的任務都回到就緒態(tài),并得到一個錯誤信息表明消息隊列已被刪除。,2020/7/30,61,3.事 件,概述 事件機制的主要數(shù)據(jù)結構 事件的主要功能,2020/7/30,62,在嵌入式實時內(nèi)核中,事件是指一種表明預先定義的系統(tǒng)事件已經(jīng)發(fā)生的機制。 事件
31、機制用于任務與任務之間、任務與ISR之間的同步。其主要的特點是可實現(xiàn)一對多的同步。 一個事件就是一個標志,不具備其它信息。 一個或多個事件構成一個事件集。事件集可以用一個指定長度的變量(比如一個32位的無符號整型變量,不同的操作系統(tǒng)其具體實現(xiàn)不一樣)來表示,而每個事件由在事件集變量中的某一位來代表。,概述,2020/7/30,63,事件及事件集有以下特點: 事件間相互獨立 事件僅用于同步,不提供數(shù)據(jù)傳輸功能 事件無隊列,即多次發(fā)送同一事件,在未經(jīng)過任何處理的情況下,其效果等同于只發(fā)送一次。 提供事件機制的意義在于: 當某任務要與多個任務或中斷服務同步時,就需要使用事件機制。 若任務需要與一組事
32、件中的任意一個發(fā)生同步,可稱為獨立型同步(邏輯“或”關系)。 任務也可以等待若干事件都發(fā)生時才同步,稱為關聯(lián)型同步(邏輯“與”關系)。,概述,2020/7/30,64,“或”同步和“與”同步,概述,2020/7/30,65,用多個事件的組合發(fā)信號給多個任務,概述,2020/7/30,66,術語: 發(fā)送事件集 。指在一次發(fā)送過程中發(fā)往接收者(比如任務)的一個或多個事件的組合。 待處理事件集。指已被發(fā)送到一個接收者但還沒有被接收(即正在等待處理)的所有事件的集合。 事件條件。指事件接收者在一次接收過程中期待接收的一個或多個事件的集合。 “或”同步:待處理事件集只要包括事件條件中的任一事件即可滿足要
33、求; “與”同步:其二是待處理事件集必須包括事件條件中的全部事件方可滿足要求。,概述,2020/7/30,67,事件機制的主要數(shù)據(jù)結構,事件集控制塊:管理所有創(chuàng)建的事件集 或者 事件集附屬于任務,不需創(chuàng)建,其相關參數(shù)成為任務控制塊的一部分,2020/7/30,68,事件的內(nèi)部實現(xiàn)機制實例說明C/OS-II,事件標志組數(shù)據(jù)結構 typedef struct INT8UOSFlagType;/指示本數(shù)據(jù)結構的類型 void*OSFlagWaitList;/等待事件標志的任務鏈表 OS_FLAGSOSFlagFlags;/各事件標志的當前狀態(tài) OS_FLAG_GRP; 事件標志節(jié)點數(shù)據(jù)結構 type
34、def struct void*OSFlagNodeNext;/后驅指針 void*OSFlagNodePrev;/前驅指針 void*OSFlagNodeTCB;/任務控制塊指針 void*OSFlagNodeFlagGrp;/指回OS_FLAG_GRP結構 OS_FLAGSOSFlagNodeFlags;/所等待的事件標志組合 INT8UOSFlagNodeWaitType;/等待類型(與、或) OS_FLAG_NODE;,2020/7/30,69,事件標志組、事件標志節(jié)點及任務控制塊之間的關系,2020/7/30,70,事件的主要功能,創(chuàng)建事件集 刪除事件集 發(fā)送事件(集) 接收事件(集
35、) 獲取有關事件集的各種信息,2020/7/30,71,創(chuàng)建事件集,申請空閑事件集控制塊,設置事件集屬性,初始化控制塊中的域,分配ID號,2020/7/30,72,創(chuàng)建一個事件標志組OSFlagCreate(),OS_FLAG_GRP *OSFlagCreate(OS_FLAGS flags, INT8U *err) OS_FLAG_GRP *pgrp; pgrp=OSFlagFreeList;/獲取一個空閑事件標志組結構 if(pgrp!=(OS_FLAG_GRP *)0)/獲取成功,初始化該結構中的域 OSFlagFreeList=(OS_FLAG_GRP *)OSFlagFreeList
36、-OSFlagWaitList;/調(diào)整空閑結構鏈頭指針 pgrp-OSFlagType=OS_EVENT_TYPE_FLAG; pgrp-OSFlagFlags=flags;/初始化當前各事件標志的狀態(tài) pgrp-OSFlagWaitList=(void *)0;/尚無任務等待事件標志 *err=OS_NO_ERR; else*err=OS_FLAG_GRP_DEPLETED; return(pgrp); ,2020/7/30,73,接收事件(集),在接收事件(集)時可以有如下選項,每一類只能選擇其一: 接收事件(集)時可等待(WAIT) 接收者永遠等待,直到事件條件被滿足后成功返回; 接收者
37、根據(jù)指定的時限等待。 接收事件(集)時不等待(NO_WAIT) 待處理事件集必須包含事件條件中的全部事件方可滿足要求(EVENT_ALL),即按照“與”條件接收事件 待處理事件集只要包含事件條件中的任一事件即可滿足要求(EVENT_ANY),即按照“或”條件接收事件,2020/7/30,74,接收(等待)事件標志組的事件標志位OSFlagPend(),OS_FLAGS OSFlagPend(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err) OS_FLAG_NODE node;/ OS_
38、FLAG_NODE作為局部變量存在于調(diào)用該函數(shù)的任務堆棧中 OS_FLAGS flags_cur; OS_FLAGS flags_rdy; switch(wait_type) case OS_FLAG_WAIT_SET_ALL:/任務以“與”方式等待事件標志 flags_rdy=pgrp-OSFlagFlags,2020/7/30,75,接收(等待)事件標志組的事件標志位OSFlagPend(),case OS_FLAG_WAIT_SET_ANY: /任務以“或”方式等待事件標志 flags_rdy=pgrp-OSFlagFlags ,2020/7/30,76,OS_Sched();/當前任務
39、被放到事件標志等待鏈后,內(nèi)核實施任務調(diào)度 if(OSTCBCur-OSTCBStat ,接收(等待)事件標志組的事件標志位OSFlagPend(),2020/7/30,77,添加一個任務到事件標志組等待任務鏈表中OS_FlagBlock(),2020/7/30,78,接收(無等待地獲取)事件標志OSFlagAccept(),OS_FLAGS OSFlagAccept (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT8U *err) OS_FLAGS flags_cur, flags_rdy; *err = OS_NO_ERR; s
40、witch (wait_type) /判斷等待事件標志的方式 case OS_FLAG_WAIT_SET_ALL:/”與”方式等待 flags_rdy = pgrp-OSFlagFlags ,2020/7/30,79,接收(無等待地獲?。┦录酥綩SFlagAccept(),case OS_FLAG_WAIT_SET_ANY:/”或”方式等待 flags_rdy = pgrp-OSFlagFlags ,2020/7/30,80,發(fā)送事件(集),調(diào)用者(任務或中斷)構造一個事件(集),將其發(fā)往接收者(比如目標任務)??赡軙霈F(xiàn)以下幾種情況之一: 目標任務正在等待的事件條件得到滿足,任務就緒; 目
41、標任務正在等待的事件條件沒有得到滿足,該事件(集)被按“或”操作,保存到目標任務的待處理事件集中,目標任務繼續(xù)等待; 目標任務未等待事件(集),該事件(集)被按“或”操作,保存到目標任務的待處理事件集中。,2020/7/30,81,發(fā)送(置位)事件標志組中的事件標志OSFlagPost(),OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U *err) OS_FLAG_NODE *pnode; BOOLEAN sched= FALSE;/初始化調(diào)度標志 OS_FLAGS flags_cur, flags_rdy; pgrp
42、-OSFlagFlags |= flags;/置位事件標志 pnode = (OS_FLAG_NODE *)pgrp-OSFlagWaitList;/獲取任務等待鏈頭節(jié)點 while (pnode != (OS_FLAG_NODE *)0) /如果有任務等待,遍歷等待鏈 switch (pnode-OSFlagNodeWaitType) case OS_FLAG_WAIT_SET_ALL:/”與”方式等待 flags_rdy = pgrp-OSFlagFlags ,2020/7/30,82,case OS_FLAG_WAIT_SET_ANY:/”或”方式等待 flags_rdy = pgrp-
43、OSFlagFlags ,發(fā)送(置位)事件標志組中的事件標志OSFlagPost(),2020/7/30,83,刪除事件集,回收事件集控制塊到空閑鏈中,等待接收該事件集的任務被恢復就緒,2020/7/30,84,刪除事件標志組OSFlagDel(),OS_FLAG_GRP *OSFlagDel (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err) BOOLEAN tasks_waiting; OS_FLAG_NODE *pnode; if (pgrp-OSFlagWaitList != (void *)0) tasks_waiting = TRUE;/有任務等待
44、 else tasks_waiting = FALSE;/無任務等待 switch (opt) case OS_DEL_NO_PEND:/在無任務等待時才刪除事件標志組 if (tasks_waiting = FALSE) /無任務等待,釋放控制塊到空閑鏈中 pgrp-OSFlagType = OS_EVENT_TYPE_UNUSED; pgrp-OSFlagWaitList = (void *)OSFlagFreeList; OSFlagFreeList = pgrp; *err = OS_NO_ERR; return (OS_FLAG_GRP *)0); else /有任務等待,刪除失敗
45、*err = OS_ERR_TASK_WAITING; return (pgrp); ,2020/7/30,85,刪除事件標志組OSFlagDel(),case OS_DEL_ALWAYS:/無論是否有任務等待,都刪除事件標志組 pnode = (OS_FLAG_NODE *)pgrp-OSFlagWaitList;/獲取等待頭節(jié)點 while (pnode != (OS_FLAG_NODE *)0) /遍歷整個等待任務鏈,使每個等待任務就緒 OS_FlagTaskRdy(pnode, (OS_FLAGS)0); pnode = (OS_FLAG_NODE *)pnode-OSFlagNode
46、Next; pgrp-OSFlagType = OS_EVENT_TYPE_UNUSED; pgrp-OSFlagWaitList = (void *)OSFlagFreeList; OSFlagFreeList = pgrp;/釋放控制塊回空閑鏈 if (tasks_waiting = TRUE) OS_Sched();/如果之前有任務等待, *err = OS_NO_ERR;內(nèi)核實施調(diào)度 return (OS_FLAG_GRP *)0); default: *err = OS_ERR_INVALID_OPT; return (pgrp); ,2020/7/30,86,事件與其它同步通信機制
47、的綜合應用,解決復雜的應用設計問題,發(fā)送方通過適當?shù)臋C制向接收方發(fā)送信息 發(fā)送方設置相應的事件標志 接收方收到事件標志 接收方根據(jù)事件標志的指示定向接收信息,達到和不同發(fā)送方同步或通信的目的,2020/7/30,87,4.異步信號,概述 異步信號機制與中斷機制的比較 異步信號機制與事件機制的比較 異步信號機制的主要數(shù)據(jù)結構 異步信號的主要功能,2020/7/30,88,異步信號機制用于任務與任務之間、任務與ISR之間的異步操作,它被任務(或ISR)用來通知其它任務某個事件的出現(xiàn)。 異步信號標志可以依附于任務。需要處理異步信號的任務由兩部分組成,一個是與異步信號無關的任務主體,另一個是ASR(異步信號服務例程)。 一個ASR對應于一個任務。當向任務發(fā)送一個異步信號,如果該任務正在運行則中止其自身代碼的運行,轉而運行與該異步信號相關的服務例程;或者當該任務被激活時,在投入運行前執(zhí)行ASR。 異步信號機制也可以稱作軟中斷機制,異步信號又被稱為軟中斷信號。,概述,2020/7/30,89,異步信號機制與中斷機制的比較,相同點 具有中斷性。對中斷的處理和對異步信號的處理都要先暫時地中斷當前任務的運行。 有相應的服務程序 根據(jù)中斷向量,有一段與中斷信號對應的服務程序,稱為ISR(Interrupt Service Routine) 根據(jù)異步
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025石方爆破專業(yè)施工合同
- 2025餐館合作經(jīng)營合同
- 特殊人群的出行安全保障措施研究
- 網(wǎng)絡安全產(chǎn)品銷售中的技術合同法律解析
- 課題申報參考:康區(qū)佛苯藝術中的儒家人物形象演變與漢藏文化交融研究
- 環(huán)保理念下的小型機械設備創(chuàng)新設計實踐探討
- 2024年高等教育服務項目資金籌措計劃書
- 跨學科學習模式下的學生個性化發(fā)展
- 2025年人教版PEP七年級物理上冊階段測試試卷含答案
- 2025年蘇科新版必修1地理上冊階段測試試卷含答案
- 2025貴州貴陽市屬事業(yè)單位招聘筆試和高頻重點提升(共500題)附帶答案詳解
- 2024年住院醫(yī)師規(guī)范化培訓師資培訓理論考試試題
- 期末綜合測試卷(試題)-2024-2025學年五年級上冊數(shù)學人教版
- 2024年廣東省公務員錄用考試《行測》試題及答案解析
- 結構力學本構模型:斷裂力學模型:斷裂力學實驗技術教程
- 2024年貴州省中考理科綜合試卷(含答案)
- 無人機技術與遙感
- PDCA提高臥床患者踝泵運動的執(zhí)行率
- 新東方四級詞匯-正序版
- 借名購車位協(xié)議書借名購車位協(xié)議書模板(五篇)
- 同步輪尺寸參數(shù)表詳表參考范本
評論
0/150
提交評論