12 同步、互斥 與通信.ppt_第1頁
12 同步、互斥 與通信.ppt_第2頁
12 同步、互斥 與通信.ppt_第3頁
12 同步、互斥 與通信.ppt_第4頁
12 同步、互斥 與通信.ppt_第5頁
已閱讀5頁,還剩123頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、嵌入式系統(tǒng)及應用,第六章同步、互斥與通信,主要內容,概述 信號量 郵箱和消息隊列 事件 異步信號* 管道*,概述,多任務系統(tǒng)中任務之間的關系 相互獨立 僅競爭CPU資源 競爭除CPU外的其他資源(互斥) 同步 協(xié)調彼此運行的步調,保證協(xié)同運行的各個任務具有正確的執(zhí)行次序 通信 彼此間傳遞數據或信息,以協(xié)同完成某項工作,任務能以以下方式與中斷處理程序或其他任務進行同步或通信: 單向同步或通信:一個任務與另一個任務或一個ISR同步或通信。 雙向同步或通信:兩個任務相互同步或通信。雙向同步不能在任務與ISR之間進行,因為ISR不能等待。,概述,ISR x,Task y,POST,PEND,任務與IS

2、R之間的同步(單向),Task x,Task y,POST,PEND,POST,PEND,任務與任務之間的同步(雙向),任務與任務之間的同步(單向),Task x,Task y,POST,PEND,在嵌入式多任務系統(tǒng)中,任務間的耦合程度是不一樣的: 耦合程度較高:任務之間需要進行大量的通信,相應的系統(tǒng)開銷較大; 耦合程度較低:任務之間不存在通信需求,其間的同步關系很弱甚至不需要同步或互斥,系統(tǒng)開銷較小。 研究任務間耦合程度的高低對于合理地設計應用系統(tǒng)、劃分任務有很重要的作用。,概述,在單處理器平臺上,嵌入式操作系統(tǒng)內核提供的同步、互斥與通信機制主要包括: 信號量(semaphore),用于互斥

3、與同步 事件(組)(event group),用于同步 異步信號(asynchronous signal),用于同步 郵箱(mailbox)、消息隊列(message queue),用于消息通信 管道(pipe),提供非結構化數據交換和實現(xiàn)同步,概述,以下一些機制也可用于同步與通信(在單處理器或多處理器系統(tǒng)中): 全局變量 共享內存 Sockets 遠程過程調用(Remote Procedure Call),概述,第一節(jié)信號量,信號量的種類及用途 互斥信號量 二值信號量 計數信號量 信號量機制的主要數據結構 典型的信號量操作,信號量用于實現(xiàn)任務與任務之間、任務與中斷處理程序之間的同步與互斥。

4、信號量一般分為三種:,信號量的種類及用途,用于解決互斥問題。它比較特殊,可能會引起優(yōu)先級反轉問題。,用于解決同步問題,用于解決資源計數問題,將信號量進行種類細分,可以根據其用途,在具體 實現(xiàn)時做專門處理,提高執(zhí)行效率和可靠性。,互斥信號量,計數信號量,二值信號量,用互斥信號量保護的代碼區(qū)稱作“臨界區(qū)”,臨界區(qū)代碼通常用于對共享資源的訪問。 互斥信號量的值被初始化成1,表明目前沒有任務進入“臨界區(qū)”,但最多只有一個任務可以進入“臨界區(qū)”。 第一個試圖進入“臨界區(qū)”的任務將成功獲得互斥信號量,而隨后試圖進入用同一信號量保護的臨界區(qū)的所有其他任務就必須等待。 當任務離開“臨界區(qū)”時,它將釋放信號量并

5、允許正在等待該信號量的任務進入“臨界區(qū)”。,互斥信號量,互斥信號量,共享資源可能是一段存儲器空間、一個數據結構或I/O設備,也可能是被兩個或多個并發(fā)任務共享的任何內容。 使用互斥信號量可以實現(xiàn)對共享資源的串行訪問,保證只有成功地獲取互斥信號量的任務才能夠釋放它。 互斥信號量是一種特殊的二值信號量,一般它支持所有權、遞歸訪問、任務刪除安全和一些避免優(yōu)先級反轉、饑餓、死鎖等互斥所固有問題的協(xié)議。,互斥信號量狀態(tài)圖,互斥信號量狀態(tài)圖,開啟,鎖定,初始化 值為1,申請并獲得 值為0,釋放 值為1,申請(遞歸)并獲得 鎖定數加1,釋放(遞歸) 鎖定數減1,互斥信號量,所有權:當一個任務通過獲取互斥信號量

6、而將其鎖定時,得到該互斥信號量的所有權。相反,當一個任務釋放信號量時,失去對其的所有權。 當一個任務擁有互斥信號量時,其他的任務不能再鎖定或釋放它,即任務要釋放互斥信號量,必須事前先獲取該信號量。,Task1,RoutineA,RoutineB,互斥信號量,嵌套(遞歸)資源訪問 如果Task1調用RoutineA,而RoutineA又調用RoutineB,并且三者訪問相同的共享資源,就發(fā)生了遞歸共享資源的訪問同步問題。,一個遞歸的互斥信號量允許嵌套鎖定互斥信號量,而不引起死鎖。,互斥信號量,嵌套(遞歸)資源訪問 每個獲取信號量的調用必須與釋放信號量的調用相匹配。當最外層的獲取信號量的調用與釋放

7、信號量的調用匹配時,該信號量才允許被其它任務訪問。 用于同步的信號量不支持嵌套訪問,任務如果對同步信號量使用上述操作是錯誤的,任務會被永久阻塞,并且阻塞條件永遠不會解除。,互斥信號量,刪除安全: 在一個受信號量保護的臨界區(qū),經常需要保護在臨界區(qū)執(zhí)行的任務不會被意外地刪除。 刪除一個在臨界區(qū)執(zhí)行的任務可能引起意想不到的后果,造成保護資源的信號量不可用,可能導致資源處于破壞狀態(tài),也就導致了其它所有要訪問該資源的任務無法得到滿足。,互斥信號量,刪除安全: 為避免任務在臨界區(qū)執(zhí)行時不被意外刪除: 提供“任務保護”和“解除任務保護”原語對 同時,為互斥信號量提供“刪除安全”選項。在創(chuàng)建信號量的時候使用這

8、個選項,當應用每次獲取信號量時隱含地使能“任務保護”功能,當每次釋放信號量時隱含地使用“解除任務保護”功能。,各種互斥機制比較,二值信號量,二值信號量主要用于任務與任務之間、任務與中斷服務程序之間的同步 用于同步的二值信號量初始值為0,表示同步事件尚未產生; 任務申請信號量以等待該同步事件的發(fā)生; 另一個任務或ISR到達同步點時,釋放信號量(將其值設置為1)表示同步事件已發(fā)生,以喚醒等待的任務。,二值信號量,二值信號量狀態(tài)圖,可獲得,不可獲得,申請并獲得 (值為0),釋放 (值為1),初始化 值為0,Task1() 執(zhí)行一些操作; 將信號量sem1置1; 申請信號量sem2; ,Task2()

9、 申請信號量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,計數信號量,計數信號量用于控制系統(tǒng)中共享資源的多個實例的使用,允許多個任務同時訪問同一種資源的多個實例 計數信號量被初始化為n(非負整數),n為該種共享資源的數目。,計數信號量,計數信號量狀態(tài)圖,可獲得,不可獲得,初始化 值大于0,申請并獲得 值為0,

10、釋放 值為1,申請并獲得 值減1,釋放 值加1,計數信號量,計數信號量使用實例:有界緩沖問題,生產者任務 do 產生一個數據項 申請empty 申請mutex 將新生成的數據項添加到緩沖中 釋放mutex 釋放full while (1);,消費者任務 do 申請full 申請mutex 從緩沖中移出一個數據項的內容 釋放mutex 釋放empty 消費新獲得的數據項內容 while (1);,計數信號量full:已被填充的數據項數目,取值范圍0n,初始值為0 計數信號量empty:空閑數據項數目,取值范圍為0n,初始值為n; 互斥信號量mutex:控制生產者任務和消費者任務對有界緩沖的訪問,

11、初始值為1。,信號量機制的主要數據結構,信號量機制的主要數據結構,信號量控制塊:管理所有創(chuàng)建的信號量,內核在系統(tǒng)運行時動態(tài)分配和回收信號量控制塊 互斥和二值信號量控制塊結構: Binary_Semaphore_Control_Block,wait_queue任務等待隊列 attributes信號量屬性 lock_nesting_behavior試圖嵌套獲得時的規(guī)則 wait_discipline任務等待信號量的方式 priority_ceiling優(yōu)先級天花板值 lock是否被占有 holder擁有者 nest_count嵌套層數,計數信號量控制結構Counting_Semaphore_Con

12、trol_Block wait_queue任務等待隊列 attributes計數信號量屬性 maximum_count 最大計數值 wait_discipline任務等待信號量的方式 count當前計數值,信號量機制的主要數據結構,信號量內部實現(xiàn)機制實例說明C/OS-II,事件控制塊ECB同步與通信機制的基本數據結構 typedef struct INT8UOSEventType;/事件類型 INT8UOSEventGrp;/等待任務所在的組 INT16UOSEventCnt;/計數器(信號量) void*OSEventPtr;/指向消息或消息隊列的指針 INT8UOSEventTblOS_E

13、VENT_TBL_SIZE;/等待任務列表 OS_EVENT;,信號量內部實現(xiàn)機制實例說明C/OS-II,當一個事件發(fā)生后,等待事件列表中優(yōu)先級最高的任務(即在.OSEventTbl pevent-OSEventTblprio 3 |= OSMapTblprio 與將一個任務插入到就緒列表中的操作類似!,Index Bit mask (Binary) 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 2 0 0 0 0 0 1 0 0 3 0 0 0 0 1 0 0 0 4 0 0 0 1 0 0 0 0 5 0 0 1 0 0 0 0 0 6 0 1 0 0 0 0 0

14、 0 7 1 0 0 0 0 0 0 0,信號量內部實現(xiàn)機制實例說明C/OS-II,從等待事件的任務列表中使任務脫離等待狀態(tài) if (pevent-OSEventTblprio 3 與將任務從就緒列表中清除的操作類似!,信號量內部實現(xiàn)機制實例說明C/OS-II,在等待事件的任務列表中查找優(yōu)先級最高的任務 y = OSUnMapTblpevent-OSEventGrp; x = OSUnMapTblpevent-OSEventTbly; prio = (y 3) + x; 與查找優(yōu)先級最高的就緒任務的操作類似!,信號量內部實現(xiàn)機制實例說明C/OS-II,空閑事件控制塊鏈表,典型的信號量操作,創(chuàng)建

15、信號量 獲取(申請)信號量 釋放信號量 刪除信號量 清除信號量的任務等待列表 獲取有關信號量的各種信息,創(chuàng)建信號量,功能:根據應用傳遞的參數創(chuàng)建一個信號量 參數:信號量的名字、屬性和初始值等。 內核動作: 從空閑信號量控制塊鏈中分配一個信號量控制塊,并初始化信號量屬性。 創(chuàng)建成功時,為其分配唯一的ID號返回給應用。 如果已創(chuàng)建信號量數量已達到用戶配置的最大數量,就返回錯誤。,創(chuàng)建信號量,信號量的屬性包括: 類型 任務等待信號量的方式(即排列的順序) 與任務刪除安全、遞歸訪問以及解決優(yōu)先級反轉的策略相關的參數(只針對互斥信號量)。,創(chuàng)建信號量,信號量的屬性,信號量的類型,互斥信號量(MUTEX_

16、SEMAPHORE),計數信號量(COUNTING_SEMAPHORE),二值信號量(BINARY_SEMAPHORE),任務等待信號量的方式,先進先出(FIFO)順序,優(yōu)先級(PRIORITY)順序,優(yōu)先級反轉問題的解決方法(只適用于互斥信號量),優(yōu)先級繼承算法(INHERIT_PRIORITY),優(yōu)先級天花板算法(PRIORITY_CEILING) ,需給出所有可能獲得此信號量的任務中優(yōu)先級最高的任務的優(yōu)先級。,創(chuàng)建一個信號量OSSemCreate(),OS_EVENT *OSSemCreate (INT16U cnt) OS_EVENT *pevent; pevent = OSEvent

17、FreeList;/從空閑事件控制塊鏈中取得一個ECB if (OSEventFreeList != (OS_EVENT *)0) OSEventFreeList = (OS_EVENT *)OSEventFreeList-OSEventPtr; if (pevent != (OS_EVENT *)0) /初始化ECB的各個域 pevent-OSEventType = OS_EVENT_TYPE_SEM; /事件類型為信號量 pevent-OSEventCnt = cnt; /信號量的初始計數值 pevent-OSEventPtr = (void *)0; OS_EventWaitListIn

18、it(pevent); /初始化等待任務列表 return (pevent); /調用者需檢查返回值,如果為NULL則表示建立失敗 ,獲?。ㄉ暾垼┬盘柫?功能:試圖獲得應用指定的信號量。 if 信號量的值大于0 then 將信號量的值減1 else 根據接收信號量的選項,將任務放到等待隊列中,或是直接返回,獲?。ㄉ暾垼┬盘柫?當所申請的信號量不能被立即獲得時,可以有以下幾種選擇: 永遠等待 不等待,立即返回,并返回一個錯誤狀態(tài)碼 指定等待時限(可有效避免死鎖) 注意: 不允許在ISR中選擇等待 當任務選擇等待時,將被按FIFO或優(yōu)先級順序放置在等待隊列中,獲?。ㄉ暾垼┬盘柫?如果任務等待一個使

19、用優(yōu)先級繼承算法的互斥信號量,且它的優(yōu)先級高于當前正占有此信號量的任務的優(yōu)先級,那么占有信號量的任務將繼承這個被阻塞的任務的優(yōu)先級。 如果任務成功地獲得一個采用優(yōu)先級天花板算法的互斥信號量,它的優(yōu)先級又低于優(yōu)先級天花板,那么它的優(yōu)先級將被抬升至天花板。,獲?。ǖ却┮粋€信號量OSSemPend(),void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err) if (pevent-OSEventCnt 0) /信號量值大于0,成功獲得信號量并返回 pevent-OSEventCnt-; *err = OS_NO_ERR; retur

20、n; OSTCBCur-OSTCBStat |= OS_STAT_SEM; /設置任務狀態(tài)為等待信號量 OSTCBCur-OSTCBDly = timeout; /設置等待時限 OS_EventTaskWait(pevent);/將任務放置到信號量的等待列表中 OS_Sched(); /內核實施任務調度,系統(tǒng)切換到另一就緒任務執(zhí)行 if (OSTCBCur-OSTCBStat /任務由于獲得信號量而恢復執(zhí)行,本調用成功返回 ,獲?。o等待地請求)一個信號量OSSemAccept(),INT16U OSSemAccept (OS_EVENT *pevent) INT16U cnt; cnt =

21、pevent-OSEventCnt; if (cnt 0) pevent-OSEventCnt-; return (cnt); ,注意:即使不能成功獲得信號量(返回值為0),調用者也不會被阻塞。此函數可以在中斷處理程序中使用。,釋放信號量,功能:釋放一個應用指定的信號量。 if 沒有任務等待這個信號量 then 信號量的值加1 else 將信號量分配給一個等待任務(將相應的任務移出等待隊列,使其就緒) 如果使用了優(yōu)先級繼承或優(yōu)先級天花板算法,那么執(zhí)行該功能(系統(tǒng)調用)的任務的優(yōu)先級將恢復到原來的高度。,釋放一個信號量OSSemPost(),INT8U OSSemPost (OS_EVENT *

22、pevent) if (pevent-OSEventGrp!=0 x00) /如果有任務在等待該信號量 OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /使等待任務列表中優(yōu)先級最高的任務就緒 OS_Sched(); /內核實施任務調度 return (OS_NO_ERR);/成功返回 if (pevent-OSEventCnt OSEventCnt+; /信號量的值加1 return (OS_NO_ERR);/成功返回 return (OS_SEM_OVF);/信號量溢出 ,刪除信號量,功能:從系統(tǒng)中刪除應用指定的一個信號量 內核動作:將信號量

23、控制塊返還給系統(tǒng) 刪除信號量的不一定是創(chuàng)建信號量的任務 如果有任務正在等待獲得該信號量,執(zhí)行此功能將使所有等待這個信號量的任務回到就緒隊列中,且返回一個狀態(tài)碼指示該信號量已被刪除,刪除信號量,企圖獲取已刪除的信號量將返回一個錯誤; 在互斥信號量正被使用時(已經被某任務獲?。荒軇h除它。因為該信號量正在保護一個共享資源或臨界代碼段,該動作可能造成數據崩潰或其他嚴重問題。,刪除一個信號量OSSemDel(),OS_EVENT *OSSemDel(OS_EVENT *pevent, INT8U opt, INT8U *err) BOOLEAN tasks_waiting; if(pevent-OS

24、EventGrp!=0 x00/根據是否有任務在等待信號量設置等待標志 tasks_waiting=TRUE; else tasks_waiting=FALSE; switch(opt) case OS_DEL_NO_PEND:/如果有任務等待信號量則不刪除信號量 if(task_waiting=FALSE/沒有任務等待,釋放ECB回空閑鏈 pevent-OSEventType=OS_EVENT_TYPE_UNUSED; pevent-OSEventPtr=OSEventFreeList; OSEventFreeList=pevent;/調整空閑ECB鏈頭指針 *err=OS_NO_ERR;

25、return(OS_EVENT)0); else*err=OS_ERR_TASK_WAITING;/有任務等待,刪除信號量失敗 return(pevent); ,刪除一個信號量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-

26、OSEventFreeList; OSEventFreeList=pevent; /如果之前有任務等待信號量,內核實施任務調度 if(tasks_waiting=TRUE)OS_Sched(); *err=OS_NO_ERR; return(OS_EVENT *)0); default: *err=OS_ERR_INVALID_OPT; return(pevent); ,清除信號量的任務等待列表,為了清除等待一個信號量的所有任務,某些內核支持Flush操作,以便釋放信號量等待任務列表中的所有任務。當多個任務的執(zhí)行必須在某些點相遇時,需要這樣的機制。,第二節(jié)郵箱和消息隊列,通信方式概述 消息隊列

27、機制的主要數據結構 典型的消息隊列操作 消息隊列的其他典型使用,任務間的通信方式 直接通信。在通信過程中雙方必須明確地知道(命名)彼此: Send (P,message) 發(fā)送一個消息到任務P Receive(Q,message) 從任務Q接收一個消息 間接通信。通信雙方不需要指出消息的來源或去向,而通過中間機制來通信。如: send(A,message) 發(fā)送一個消息給郵箱A receive(A,message) 從郵箱A接收一個消息,通信方式概述,消息隊列:屬于間接通信方式 消息:內存空間中一段長度可變的緩沖區(qū),其長度和內容均可以由用戶定義,其內容可以是實際的數據、數據塊的指針或空。 對消

28、息內容的解釋由應用完成。 從操作系統(tǒng)觀點看,消息沒有定義的格式,所有的消息都是字節(jié)流,沒有特定的含義。 從應用觀點看,根據應用定義的消息格式,消息被解釋成特定的含義。 應用可以只把消息當成一個標志,這時消息機制用于實現(xiàn)同步,概述,一些操作系統(tǒng)內核把消息進一步分為:郵箱和消息隊列 郵箱僅能存放單條消息,它提供了一種低開銷的機制來傳送信息。每個郵箱可以保存一條大小為若干個字節(jié)的消息。 消息隊列可存放若干消息,提供了一種任務間緩沖通信的方法。 消息機制可支持定長與可變長度兩種模式的消息,可變長度的消息隊列需要對隊列中的每一條消息增加額外的存儲開銷。,概述,消息隊列機制的主要數據結構,消息隊列及其相關

29、的參數和支持數據結構,消息隊列狀態(tài)圖,非空,滿,隊列創(chuàng)建 消息數為0,消息隊列狀態(tài)圖,消息發(fā)送 消息數加1,空,消息發(fā)送 消息數為1,消息接收 消息數為0,消息接收 消息數減1,消息接收 消息數減1,消息發(fā)送 消息數等于隊列長度,消息隊列機制的主要數據結構,消息隊列控制塊 管理所有創(chuàng)建的消息隊列,系統(tǒng)運行時動態(tài)分配和回收消息隊列控制塊 消息隊列緩沖區(qū) 存放發(fā)送到該隊列的消息,接收者從緩沖區(qū)中取出消息。 消息的發(fā)送或接收有兩種方法(影響消息緩沖區(qū)結構): 將數據從發(fā)送任務的空間完全拷貝到接收任務的空間中(效率較低,執(zhí)行時間與消息大小有關) 只傳遞指向數據存儲空間的指針(提高系統(tǒng)性能),發(fā)送和接收

30、消息的消息拷貝和內存使用 這種消息傳遞方法效率低、占用空間大 一種效率更高的方式是傳遞消息指針,number_of_message,max_message_count,消息隊列控制塊,消息隊列緩沖區(qū),消息隊列機制的主要數據結構,消息隊列的環(huán)形緩沖,消息隊列機制的主要數據結構,max_message_count,queue_end,queue_start,queue_out,number_of_message,queue_in,消息指針,典型的消息隊列操作,創(chuàng)建消息隊列 發(fā)送普通消息 發(fā)送緊急消息 發(fā)送廣播消息 接收消息 刪除消息隊列 獲取有關消息隊列的各種信息,創(chuàng)建消息隊列,創(chuàng)建消息隊列時,調

31、用者可以指定如下參數: 消息的最大長度 每個消息隊列中最多的消息數 消息隊列的屬性 任務等待消息時的排隊方式:FIFO或PRIORITY 系統(tǒng)為新創(chuàng)建的消息隊列分配唯一的ID,發(fā)送消息,根據緊急程度的不同,消息通??煞譃槠胀ㄏ⑴c緊急消息。 如果有任務正在等待消息(即消息隊列為空),則普通消息發(fā)送和緊急消息發(fā)送的執(zhí)行效果是一樣的。任務從等待隊列移到就緒隊列中,消息被拷貝到任務提供的緩沖區(qū)中(或者由接收任務得到指向消息的指針)。 如果沒有任務等待,發(fā)送普通消息將消息放在隊列尾,而發(fā)送緊急消息將消息放在隊列頭。,發(fā)送消息,發(fā)送消息,如果發(fā)送消息時隊列已被填滿,則不同的操作系統(tǒng)可能采取不同的處理辦法

32、: 掛起試圖向已滿的消息隊列中發(fā)送消息的任務(不適用于中斷服務程序) 簡單地丟棄該條消息并向調用者返回錯誤信息 廣播消息。在此之前所有試圖從隊列中接收消息的任務此時都將獲得相同的消息。該功能拷貝消息到各任務的消息緩沖中(或者讓所有的等待任務得到指向消息的指針),并喚醒所有的等待任務。,接收消息,如果指定的消息隊列中有消息,則將其中的第一條消息拷貝到調用者的緩沖區(qū)(或者將第一條消息指針傳遞給調用者),并從消息隊列中刪除它。 如果此時消息隊列中沒有消息,則可能出現(xiàn)以下幾種情況: 永遠等待消息的到達:等待消息的任務按FIFO或優(yōu)先級高低順序排列在等待隊列中 等待消息且指定等待時限:等待消息的任務按F

33、IFO或優(yōu)先級高低順序排列在等待隊列中 不等待,強制立即返回,接收消息,限時等待可有效預防死鎖 中斷服務程序接收消息時必須選擇不等待,因為中斷服務程序是不能被阻塞的。 如果消息隊列被應用刪除,則所有等待該消息隊列的任務都被返回一個錯誤信息,并回復到就緒狀態(tài)。,接收消息,刪除消息隊列,從系統(tǒng)中刪除指定的消息隊列,釋放消息隊列控制塊及消息隊列緩沖區(qū)。 任何知道此消息隊列ID號的代碼都可以刪除它。 消息隊列被刪除后,所有等待從這個消息隊列接收消息的任務都回到就緒態(tài),并得到一個錯誤信息表明消息隊列已被刪除。,消息隊列的其他典型使用,緊耦合的單向數據通信:發(fā)送任務發(fā)送消息后要求一個響應信號,表明接收任務

34、已經成功接收到消息。,消息隊列的其他典型使用,緊耦合的雙向數據通信 :如果數據需要在任務之間雙向流動,則可以采用緊耦合的雙向數據通信模式(也稱為全雙工通信)。,第三節(jié)事 件,概述 事件機制的主要數據結構 典型的事件操作 事件機制的典型應用,在嵌入式實時內核中,事件是指一種表明預先定義的系統(tǒng)事件已經發(fā)生的機制。 事件機制用于任務與任務之間、任務與ISR之間的同步。其主要的特點是可實現(xiàn)一對多的同步。 一個事件就是一個標志,不具備其它信息。 一個或多個事件構成一個事件集。事件集可以用一個指定長度的變量(比如一個8bit, 16bit或32bit的無符號整型變量,不同的操作系統(tǒng)其具體實現(xiàn)不一樣)來表示

35、,而每個事件由在事件集變量中的某一位來代表。,概述,事件及事件集有以下特點: 事件間相互獨立 事件僅用于同步,不提供數據傳輸功能 事件無隊列,即多次發(fā)送同一事件,在未經過任何處理的情況下,其效果等同于只發(fā)送一次。 提供事件機制的意義在于: 當某任務要與多個任務或中斷服務同步時,就需要使用事件機制。 若任務需要與一組事件中的任意一個發(fā)生同步,可稱為獨立型同步(邏輯“或”關系)。 任務也可以等待若干事件都發(fā)生時才同步,稱為關聯(lián)型同步(邏輯“與”關系)。,概述,“或”同步和“與”同步,概述,任務,任務,任務,任務,ISR,ISR,OR,AND,“與”型同步,“或”型同步,事件集,事件集,POST,P

36、OST,PEND,PEND,用多個事件的組合發(fā)信號給多個任務,概述,任務,任務,任務,ISR,OR,AND,事件集,事件集,事件集 (8,16或32位),POST,PEND,PEND,術語: 發(fā)送事件集 。指在一次發(fā)送過程中發(fā)往接收者(比如任務)的一個或多個事件的組合。 待處理事件集。指已被發(fā)送到一個接收者但還沒有被接收(即正在等待處理)的所有事件的集合。 事件條件。指事件接收者在一次接收過程中期待接收的一個或多個事件的集合。 “或”同步:待處理事件集只要包括事件條件中的任一事件即可滿足要求; “與”同步:其二是待處理事件集必須包括事件條件中的全部事件方可滿足要求。,概述,事件機制的主要數據結

37、構,事件集控制塊:管理所有創(chuàng)建的事件集 或者 事件集附屬于任務,不需創(chuàng)建,其相關參數成為任務控制塊的一部分,事件的內部實現(xiàn)機制實例說明C/OS-II,事件標志組數據結構 typedef struct INT8UOSFlagType;/指示本數據結構的類型 void*OSFlagWaitList;/等待事件標志的任務鏈表 OS_FLAGSOSFlagFlags;/各事件標志的當前狀態(tài) OS_FLAG_GRP; 事件標志節(jié)點數據結構 typedef struct void*OSFlagNodeNext;/后驅指針 void*OSFlagNodePrev;/前驅指針 void*OSFlagNodeT

38、CB;/任務控制塊指針 void*OSFlagNodeFlagGrp;/指回OS_FLAG_GRP結構 OS_FLAGSOSFlagNodeFlags;/所等待的事件標志組合 INT8UOSFlagNodeWaitType;/等待類型(與、或) OS_FLAG_NODE;,事件標志組、事件標志節(jié)點及任務控制塊之間的關系,OS_FLAG_GRP,OS_FLAG_NODE,.OSTCBFlagNode .OSFlagNodeFlags .OSFlagNodeWaitType .OSFlagNodeNext .OSFlagNodePrev .OSFlagNodeTCB,.OSFlagWaitList

39、 .OSFlagFlags .OSFlagType,AND or OR,AND or OR,AND or OR,OS_EVENT_TYPE_FLAG,0,0,.OSTCBFlagNode,OS_TCB,典型的事件操作,創(chuàng)建事件集 刪除事件集 發(fā)送事件(集) 接收事件(集) 獲取有關事件集的各種信息,創(chuàng)建事件集,申請空閑事件集控制塊,設置事件集屬性,初始化控制塊中的域,分配ID號,創(chuàng)建一個事件標志組OSFlagCreate(),OS_FLAG_GRP *OSFlagCreate(OS_FLAGS flags, INT8U *err) OS_FLAG_GRP *pgrp; pgrp=OSFlagF

40、reeList;/獲取一個空閑事件標志組結構 if(pgrp!=(OS_FLAG_GRP *)0)/獲取成功,初始化該結構中的域 OSFlagFreeList=(OS_FLAG_GRP *)OSFlagFreeList-OSFlagWaitList;/調整空閑結構鏈頭指針 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;

41、return(pgrp); ,接收事件(集),在接收事件(集)時可以有如下選項,接收(等待)事件標志組的事件標志位OSFlagPend(),OS_FLAGS OSFlagPend(OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err) OS_FLAG_NODE node;/ OS_FLAG_NODE作為局部變量存在于調用該函數的任務堆棧中 OS_FLAGS flags_cur; OS_FLAGS flags_rdy; switch(wait_type) case OS_FLAG_WAIT_S

42、ET_ALL:/任務以“與”方式等待事件標志 flags_rdy=pgrp-OSFlagFlags,接收(等待)事件標志組的事件標志位OSFlagPend(),case OS_FLAG_WAIT_SET_ANY: /任務以“或”方式等待事件標志 flags_rdy=pgrp-OSFlagFlags ,OS_Sched();/當前任務被放到事件標志等待鏈后,內核實施任務調度 if(OSTCBCur-OSTCBStat ,接收(等待)事件標志組的事件標志位OSFlagPend(),添加一個任務到事件標志組等待任務鏈表中OS_FlagBlock(),OS_FLAG_GRP,OS_EVENT_TYPE

43、_FLAG,AND or OR,AND or OR,0,0,OS_TCB,OS_TCB,OSTCBCur,OS_FLAG_NODE,0,接收(無等待地獲取)事件標志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; switch (wait_type) /判斷等待事件標志的方式 case OS_FLAG_WAIT_SET_ALL:/”與”方式等待

44、flags_rdy = pgrp-OSFlagFlags ,接收(無等待地獲?。┦录酥綩SFlagAccept(),case OS_FLAG_WAIT_SET_ANY:/”或”方式等待 flags_rdy = pgrp-OSFlagFlags ,發(fā)送事件(集),調用者(任務或中斷)構造一個事件(集),將其發(fā)往接收者(比如目標任務)??赡軙霈F(xiàn)以下幾種情況之一: 目標任務正在等待的事件條件得到滿足,任務就緒; 目標任務正在等待的事件條件沒有得到滿足,該事件(集)被按“或”操作,保存到目標任務的待處理事件集中,目標任務繼續(xù)等待; 目標任務未等待事件(集),該事件(集)被按“或”操作,保存到目標任

45、務的待處理事件集中。,發(fā)送(置位)事件標志組中的事件標志OSFlagPost(),OS_FLAGS OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U *err) OS_FLAG_NODE *pnode; BOOLEAN sched= FALSE;/初始化調度標志 OS_FLAGS flags_cur, flags_rdy; pgrp-OSFlagFlags |= flags;/置位事件標志 pnode = (OS_FLAG_NODE *)pgrp-OSFlagWaitList;/獲取任務等待鏈頭節(jié)點 while (pnode != (OS

46、_FLAG_NODE *)0) /如果有任務等待,遍歷等待鏈 switch (pnode-OSFlagNodeWaitType) case OS_FLAG_WAIT_SET_ALL:/”與”方式等待 flags_rdy = pgrp-OSFlagFlags ,case OS_FLAG_WAIT_SET_ANY:/”或”方式等待 flags_rdy = pgrp-OSFlagFlags ,發(fā)送(置位)事件標志組中的事件標志OSFlagPost(),刪除事件集,回收事件集控制塊到空閑鏈中,等待接收該事件集的任務被恢復就緒,刪除事件標志組OSFlagDel(),OS_FLAG_GRP *OSFlag

47、Del (OS_FLAG_GRP *pgrp, INT8U opt, INT8U *err) BOOLEAN tasks_waiting; OS_FLAG_NODE *pnode; if (pgrp-OSFlagWaitList != (void *)0) tasks_waiting = TRUE;/有任務等待 else tasks_waiting = FALSE;/無任務等待 switch (opt) case OS_DEL_NO_PEND:/在無任務等待時才刪除事件標志組 if (tasks_waiting = FALSE) /無任務等待,釋放控制塊到空閑鏈中 pgrp-OSFlagTyp

48、e = OS_EVENT_TYPE_UNUSED; pgrp-OSFlagWaitList = (void *)OSFlagFreeList; OSFlagFreeList = pgrp; *err = OS_NO_ERR; return (OS_FLAG_GRP *)0); else /有任務等待,刪除失敗 *err = OS_ERR_TASK_WAITING; return (pgrp); ,刪除事件標志組OSFlagDel(),case OS_DEL_ALWAYS:/無論是否有任務等待,都刪除事件標志組 pnode = (OS_FLAG_NODE *)pgrp-OSFlagWaitLis

49、t;/獲取等待頭節(jié)點 while (pnode != (OS_FLAG_NODE *)0) /遍歷整個等待任務鏈,使每個等待任務就緒 OS_FlagTaskRdy(pnode, (OS_FLAGS)0); pnode = (OS_FLAG_NODE *)pnode-OSFlagNodeNext; pgrp-OSFlagType = OS_EVENT_TYPE_UNUSED; pgrp-OSFlagWaitList = (void *)OSFlagFreeList; OSFlagFreeList = pgrp;/釋放控制塊回空閑鏈 if (tasks_waiting = TRUE) OS_Sch

50、ed();/如果之前有任務等待, *err = OS_NO_ERR;內核實施調度 return (OS_FLAG_GRP *)0); default: *err = OS_ERR_INVALID_OPT; return (pgrp); ,設置事件,設置事件,Task1,ISR,來自某設備的中斷,Task2,消息隊列Q,事件標志集,信號量S,0,1,0,0,0,1,0,0,發(fā)送消息,釋放信號量,接收消息,獲取信號量,事件機制的典型應用,解決復雜的應用設計問題,發(fā)送方(Task1或ISR)發(fā)送信息(消息或信號量); 發(fā)送方(Task1或ISR)設置相應的事件標志(指示消息或信號量的發(fā)送); 接收方

51、(Task2)檢測事件標志集,判斷是否滿足其接收條件(“與”條件接收或“或”條件接收); 接收方(Task2)根據事件標志集的指示定向接收信息(消息或信號量),達到和不同發(fā)送方(Task1或ISR)同步或通信的目的。,第四節(jié)異步信號,概述 異步信號機制與中斷機制的比較 異步信號機制與事件機制的比較 異步信號機制的主要數據結構 典型的異步信號操作,異步信號機制用于任務與任務之間、任務與ISR之間的異步操作,它被任務(或ISR)用來通知其它任務某個事件的出現(xiàn)。 異步信號標志可以依附于任務。需要處理異步信號的任務由兩部分組成,一個是與異步信號無關的任務主體,另一個是ASR(異步信號服務例程)。 一個

52、ASR對應于一個任務。當向任務發(fā)送一個異步信號,如果該任務正在運行則中止其自身代碼的運行,轉而運行與該異步信號相關的服務例程;或者當該任務被激活時,在投入運行前執(zhí)行ASR。 異步信號機制也可以稱作軟中斷機制,異步信號又被稱為軟中斷信號。,概述,概述,異步信號機制與中斷機制的比較,相同點 具有中斷性。對中斷的處理和對異步信號的處理都要先暫時地中斷當前任務的運行。 有相應的服務程序 根據中斷向量,有一段與中斷信號對應的服務程序,稱為ISR(Interrupt Service Routine) 根據異步信號的編號,有一段與之對應的服務程序,稱為ASR(Asynchronious Service Ro

53、utine) 可以屏蔽其響應 外部硬件中斷可以通過相應的寄存器操作被屏蔽 任務也可屏蔽對異步信號的響應,異步信號機制與中斷機制的比較,不同點 實質不同 中斷由硬件或者特定的指令產生,不受任務調度的控制 異步信號由系統(tǒng)調用(使用發(fā)送異步信號功能)產生,受到任務調度的控制,處理時機(或響應時間)不同 中斷觸發(fā)后,硬件根據中斷向量找到相應的服務程序執(zhí)行。在退出中斷服務程序之前會進行重調度,所以中斷結束后運行的任務不一定是先前被中斷的任務。 異步信號通過發(fā)送異步信號的系統(tǒng)調用觸發(fā),但是系統(tǒng)不一定馬上開始對它的處理: 如果接收異步信號的不是當前任務,則ASR要等到接收任務被調度、完成上下文切換后才能執(zhí)行

54、,之后再執(zhí)行任務自身的代碼。 任務也可以給自己發(fā)送異步信號,在這種情況下,其ASR將馬上執(zhí)行。,執(zhí)行的環(huán)境不同 一般地,ISR在獨立的上下文中運行,操作系統(tǒng)為之提供專門的堆??臻g。 ASR在相關任務的上下文中運行,所以ASR也是任務的一個組成部分。,異步信號機制與事件機制的比較,同樣是標志著某個事件的發(fā)生,事件機制的使用是同步的,而異步信號機制是異步的。 對一個任務來說,什么時候會接收到事件是已知的,因為接收事件的功能是它自己在運行過程中調用的。 任務不能預知何時會收到一個異步信號,并且一旦接收到了異步信號,在允許響應的情況下,它會中斷正在運行的代碼而去執(zhí)行異步信號處理程序。,異步信號機制的主要數據結構,一種異步信號控制結構Asynchronous_Signal_Control_Block enabled 是否使能對異步信號的響應 handler 處理例程 attribute_set ASR的執(zhí)行屬性 signals_posted 使能響應時,已發(fā)送但尚未處理的信號 signals_pending 屏蔽響應時,已發(fā)送但尚未處理的信號 nest_level ASR中異步信號的嵌套層數,異步信號機制的主要數據結構,ASR的執(zhí)行屬性 是否允許任務在執(zhí)行ASR過程中被搶占 是否允許時間片切換 是否

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論