嵌入式系統-Chapter6-同步、互斥 與通信_第1頁
嵌入式系統-Chapter6-同步、互斥 與通信_第2頁
嵌入式系統-Chapter6-同步、互斥 與通信_第3頁
嵌入式系統-Chapter6-同步、互斥 與通信_第4頁
嵌入式系統-Chapter6-同步、互斥 與通信_第5頁
已閱讀5頁,還剩124頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、嵌入式系統(xtng)及應用共一百二十九頁第六章同步(tngb)、互斥與通信共一百二十九頁主要(zhyo)內容概述(i sh)信號量郵箱和消息隊列事件異步信號*管道*共一百二十九頁概述(i sh)多任務系統中任務之間的關系相互獨立 僅競爭CPU資源競爭除CPU外的其他資源(互斥)同步 協調彼此運行的步調,保證協同運行的各個任務具有正確的執(zhí)行(zhxng)次序 通信 彼此間傳遞數據或信息,以協同完成某項工作共一百二十九頁任務能以以下方式與中斷處理程序或其他(qt)任務進行同步或通信:單向同步或通信:一個任務與另一個任務或一個ISR同步或通信。 雙向同步或通信:兩個任務相互同步或通信。雙向同步不能

2、在任務與ISR之間進行,因為ISR不能等待。 概述(i sh)共一百二十九頁ISR xTask yPOSTPEND任務(rn wu)與ISR之間的同步(單向)Task xTask yPOSTPENDPOSTPEND任務(rn wu)與任務(rn wu)之間的同步(雙向)任務與任務之間的同步(單向)Task xTask yPOSTPEND共一百二十九頁在嵌入式多任務系統中,任務間的耦合程度是不一樣的:耦合程度較高:任務之間需要進行大量的通信,相應(xingyng)的系統開銷較大;耦合程度較低:任務之間不存在通信需求,其間的同步關系很弱甚至不需要同步或互斥,系統開銷較小。研究任務間耦合程度的高低對

3、于合理地設計應用系統、劃分任務有很重要的作用。 概述(i sh)共一百二十九頁在單處理器平臺上,嵌入式操作系統內核提供的同步、互斥與通信機制(jzh)主要包括:信號量(semaphore),用于互斥與同步事件(組)(event group),用于同步異步信號(asynchronous signal),用于同步郵箱(mailbox)、消息隊列(message queue),用于消息通信管道(pipe),提供非結構化數據交換和實現同步 概述(i sh)共一百二十九頁以下一些(yxi)機制也可用于同步與通信(在單處理器或多處理器系統中):全局變量共享內存Sockets遠程過程調用(Remote Pr

4、ocedure Call)概述(i sh)共一百二十九頁第一節(jié)信號量信號量的種類及用途互斥信號量二值信號量計數(j sh)信號量信號量機制的主要數據結構典型的信號量操作共一百二十九頁信號量用于實現任務與任務之間、任務與中斷處理程序之間的同步(tngb)與互斥。信號量一般分為三種:信號量的種類(zhngli)及用途用于解決互斥問題。它比較特殊,可能會引起優(yōu)先級反轉問題。用于解決同步問題用于解決資源計數問題將信號量進行種類細分,可以根據其用途,在具體實現時做專門處理,提高執(zhí)行效率和可靠性?;コ庑盘柫坑嫈敌盘柫慷敌盘柫抗惨话俣彭撚没コ庑盘柫勘Wo的代碼區(qū)稱作“臨界區(qū)”,臨界區(qū)代碼通常用于對共享資

5、源的訪問(fngwn)?;コ庑盘柫康闹当怀跏蓟?,表明目前沒有任務進入“臨界區(qū)”,但最多只有一個任務可以進入“臨界區(qū)”。第一個試圖進入“臨界區(qū)”的任務將成功獲得互斥信號量,而隨后試圖進入用同一信號量保護的臨界區(qū)的所有其他任務就必須等待。當任務離開“臨界區(qū)”時,它將釋放信號量并允許正在等待該信號量的任務進入“臨界區(qū)”?;コ庑盘柫縏ask1Task2共享資源共一百二十九頁互斥信號量共享資源可能是一段存儲器空間、一個數據結構或I/O設備,也可能是被兩個或多個并發(fā)任務共享的任何內容。使用互斥信號量可以實現對共享資源的串行訪問,保證只有成功地獲取互斥信號量的任務才能夠釋放它?;コ庑盘柫渴且环N特殊的二值

6、信號量,一般它支持所有權、遞歸訪問、任務刪除(shnch)安全和一些避免優(yōu)先級反轉、饑餓、死鎖等互斥所固有問題的協議。 共一百二十九頁互斥信號量狀態(tài)圖互斥信號量狀態(tài)圖開啟(kiq)鎖定(su dn)初始化值為1申請并獲得值為0釋放值為1申請(遞歸)并獲得鎖定數加1釋放(遞歸)鎖定數減1共一百二十九頁互斥信號量所有權:當一個任務通過獲取互斥信號量而將其鎖定時,得到該互斥信號量的所有權。相反(xingfn),當一個任務釋放信號量時,失去對其的所有權。當一個任務擁有互斥信號量時,其他的任務不能再鎖定或釋放它,即任務要釋放互斥信號量,必須事前先獲取該信號量。 共一百二十九頁Task1RoutineAR

7、outineB互斥信號量嵌套(遞歸)資源訪問如果(rgu)Task1調用RoutineA,而RoutineA又調用RoutineB,并且三者訪問相同的共享資源,就發(fā)生了遞歸共享資源的訪問同步問題。 共享資源 一個(y )遞歸的互斥信號量允許嵌套鎖定互斥信號量,而不引起死鎖。 共一百二十九頁互斥信號量嵌套(遞歸)資源訪問每個獲取信號量的調用必須與釋放(shfng)信號量的調用相匹配。當最外層的獲取信號量的調用與釋放(shfng)信號量的調用匹配時,該信號量才允許被其它任務訪問。 用于同步的信號量不支持嵌套訪問,任務如果對同步信號量使用上述操作是錯誤的,任務會被永久阻塞,并且阻塞條件永遠不會解除。

8、 共一百二十九頁互斥信號量刪除安全:在一個受信號量保護的臨界區(qū),經常需要保護在臨界區(qū)執(zhí)行的任務(rn wu)不會被意外地刪除。刪除一個在臨界區(qū)執(zhí)行的任務可能引起意想不到的后果,造成保護資源的信號量不可用,可能導致資源處于破壞狀態(tài),也就導致了其它所有要訪問該資源的任務無法得到滿足。 共一百二十九頁互斥信號量刪除安全:為避免任務在臨界區(qū)執(zhí)行時不被意外刪除:提供“任務保護”和“解除任務保護”原語對同時,為互斥信號量提供“刪除安全”選項。在創(chuàng)建信號量的時候使用這個(zh ge)選項,當應用每次獲取信號量時隱含地使能“任務保護”功能,當每次釋放信號量時隱含地使用“解除任務保護”功能。 共一百二十九頁各種

9、互斥機制(jzh)比較比較項目關中斷使用測試并置位指令禁止任務切換使用信號量鎖定范圍互斥力度最強,鎖定所有外部可屏蔽中斷,凡是以中斷形式到達的外部事件以及與之相關聯的任務或處理過程均得不到執(zhí)行凡是使用該指令訪問共享資源的代碼所有的任務只影響競爭共享資源的任務對系統響應時間的影響如果關中斷的時間較長,對系統的響應性能有很大影響較小如果禁止切換的時間過長,則影響系統的響應性能對系統響應性能有一定影響,可能導致優(yōu)先級反轉實現時的系統開銷小小小較大注意事項關中斷時間要盡量短不是所有的處理器都具備這種指令,影響可移植性關調度的時間要盡量短需采用一定的策略解決優(yōu)先級反轉問題共一百二十九頁二值信號量二值信號

10、量主要用于任務與任務之間、任務與中斷(zhngdun)服務程序之間的同步用于同步的二值信號量初始值為0,表示同步事件尚未產生;任務申請信號量以等待該同步事件的發(fā)生;另一個任務或ISR到達同步點時,釋放信號量(將其值設置為1)表示同步事件已發(fā)生,以喚醒等待的任務。Task1Task2二值信號量初值為0共一百二十九頁二值信號量二值信號量狀態(tài)圖可獲得(hud)不可(bk)獲得申請并獲得(值為0)釋放(值為1)初始化值為0共一百二十九頁Task1() 執(zhí)行一些操作(cozu); 將信號量sem1置1; 申請信號量sem2; Task2() 申請信號量sem1; 執(zhí)行一些(yxi)操作; 將信號量sem

11、2置1; Task2申請信號量sem1失敗,系統切換到Task1sem1被置1后,Task2得到sem1并搶占Task1Task2運行到某處時因某種原因被阻塞,系統切換到Task1用二值信號量實現兩個任務之間的雙向同步Task2優(yōu)先級高于Task1sem1和sem2的初始值均為0共一百二十九頁計數(j sh)信號量計數信號量用于控制系統中共享資源的多個實例(shl)的使用,允許多個任務同時訪問同一種資源的多個實例(shl)計數信號量被初始化為n(非負整數),n為該種共享資源的數目。Task1Task2共享資源實例nTask m共享資源實例1共一百二十九頁計數(j sh)信號量計數(j sh)信

12、號量狀態(tài)圖可獲得不可獲得初始化值大于0申請并獲得值為0釋放值為1申請并獲得值減1釋放值加1共一百二十九頁計數(j sh)信號量 1 2 3 4 n生產者任務消費者任務計數信號量使用實例(shl):有界緩沖問題共一百二十九頁生產者任務(rn wu)do 產生一個數據項申請empty申請mutex將新生成的數據項添加到緩沖中釋放mutex釋放full while (1);消費者任務do 申請full申請mutex從緩沖中移出一個數據項的內容(nirng)釋放mutex釋放empty消費新獲得的數據項內容 while (1); 計數信號量full:已被填充的數據項數目,取值范圍0n,初始值為0計數信

13、號量empty:空閑數據項數目,取值范圍為0n,初始值為n;互斥信號量mutex:控制生產者任務和消費者任務對有界緩沖的訪問,初始值為1。共一百二十九頁信號量機制的主要(zhyo)數據結構SCB1SCB2信號量控制塊count信號量名字或IDTask1Task2任務等待列表共一百二十九頁信號量機制(jzh)的主要數據結構信號量控制塊:管理所有創(chuàng)建的信號量,內核在系統運行(ynxng)時動態(tài)分配和回收信號量控制塊互斥和二值信號量控制塊結構: Binary_Semaphore_Control_Blockwait_queue任務等待隊列attributes信號量屬性lock_nesting_beha

14、vior試圖嵌套獲得時的規(guī)則 wait_discipline任務等待信號量的方式priority_ceiling優(yōu)先級天花板值lock是否被占有holder擁有者 nest_count嵌套層數共一百二十九頁計數信號量控制結構Counting_Semaphore_Control_Block wait_queue任務等待(dngdi)隊列 attributes計數信號量屬性 maximum_count 最大計數值 wait_discipline任務等待信號量的方式 count當前計數值信號量機制(jzh)的主要數據結構共一百二十九頁信號量內部實現機制(jzh)實例說明C/OS-II事件控制塊ECB

15、同步與通信機制的基本數據結構typedef structINT8UOSEventType;/事件類型INT8UOSEventGrp;/等待任務所在的組INT16UOSEventCnt;/計數器(信號量)void*OSEventPtr;/指向消息或消息隊列的指針(zhzhn)INT8UOSEventTblOS_EVENT_TBL_SIZE;/等待任務列表OS_EVENT;共一百二十九頁信號量內部實現機制(jzh)實例說明C/OS-II當一個事件發(fā)生后,等待(dngdi)事件列表中優(yōu)先級最高的任務(即在.OSEventTbl&OSEventGrp中所有被置1的位中優(yōu)先級數值最小的任務)得到該事件。

16、共一百二十九頁信號量內部實現(shxin)機制實例說明C/OS-II當.OSEventTbln中的任何一位為1時,OSEventGrp中的第n位為1。 與任務就緒列表(li bio)類似!共一百二十九頁信號量內部實現機制實例(shl)說明C/OS-II將一個任務插入(ch r)到等待事件的任務列表中:pevent-OSEventGrp |= OSMapTblprio 3;pevent-OSEventTblprio 3 |= OSMapTblprio & 0 x07;與將一個任務插入到就緒列表中的操作類似!Index Bit mask (Binary)0 0 0 0 0 0 0 0 11 0 0

17、 0 0 0 0 1 02 0 0 0 0 0 1 0 03 0 0 0 0 1 0 0 04 0 0 0 1 0 0 0 05 0 0 1 0 0 0 0 06 0 1 0 0 0 0 0 07 1 0 0 0 0 0 0 0共一百二十九頁信號量內部實現(shxin)機制實例說明C/OS-II從等待事件的任務(rn wu)列表中使任務(rn wu)脫離等待狀態(tài)if (pevent-OSEventTblprio 3 &= OSMapTblprio & 0 x07) = 0) pevent-OSEventGrp &= OSMapTblprio 3;與將任務從就緒列表中清除的操作類似!共一百二十九

18、頁信號量內部實現機制實例(shl)說明C/OS-II在等待事件的任務(rn wu)列表中查找優(yōu)先級最高的任務(rn wu)y = OSUnMapTblpevent-OSEventGrp;x = OSUnMapTblpevent-OSEventTbly;prio = (y OSEventPtr;if (pevent != (OS_EVENT *)0) /初始化ECB的各個域pevent-OSEventType = OS_EVENT_TYPE_SEM; /事件類型為信號量pevent-OSEventCnt = cnt; /信號量的初始計數值pevent-OSEventPtr = (void *)0

19、;OS_EventWaitListInit(pevent); /初始化等待任務(rn wu)列表return (pevent); /調用者需檢查返回值,如果為NULL則表示建立失敗共一百二十九頁獲取(huq)(申請)信號量功能:試圖獲得應用指定的信號量。if 信號量的值大于0then 將信號量的值減1else 根據接收信號量的選項,將任務(rn wu)放到等待隊列中,或是直接返回共一百二十九頁獲取(huq)(申請)信號量當所申請的信號量不能被立即獲得時,可以有以下幾種選擇:永遠等待 不等待,立即返回,并返回一個錯誤狀態(tài)碼指定等待時限(可有效避免(bmin)死鎖)注意:不允許在ISR中選擇等待當

20、任務選擇等待時,將被按FIFO或優(yōu)先級順序放置在等待隊列中共一百二十九頁獲取(huq)(申請)信號量如果任務等待一個使用優(yōu)先級繼承算法的互斥信號量,且它的優(yōu)先級高于當前正占有此信號量的任務的優(yōu)先級,那么占有信號量的任務將繼承這個(zh ge)被阻塞的任務的優(yōu)先級。如果任務成功地獲得一個采用優(yōu)先級天花板算法的互斥信號量,它的優(yōu)先級又低于優(yōu)先級天花板,那么它的優(yōu)先級將被抬升至天花板。 共一百二十九頁獲取(huq)(等待)一個信號量OSSemPend()void OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)if (pevent-OS

21、EventCnt 0) /信號量值大于0,成功獲得信號量并返回pevent-OSEventCnt-; *err = OS_NO_ERR;return; OSTCBCur-OSTCBStat |= OS_STAT_SEM; /設置任務狀態(tài)為等待信號量OSTCBCur-OSTCBDly = timeout; /設置等待時限OS_EventTaskWait(pevent);/將任務放置到信號量的等待列表(li bio)中 OS_Sched(); /內核實施任務調度,系統切換到另一就緒任務執(zhí)行if (OSTCBCur-OSTCBStat & OS_STAT_SEM) /判斷任務恢復執(zhí)行的原因,如果等待

22、時限超時但仍然未獲得信號量,則返回超時信息OSEventTO(pevent); *err = OS_TIMEOUT;return;OSTCBCur-OSTCBEventPtr = (OS_EVENT *)0; *err = OS_NO_ERR; /任務由于獲得信號量而恢復執(zhí)行,本調用成功返回共一百二十九頁獲取(無等待地請求(qngqi))一個信號量OSSemAccept()INT16U OSSemAccept (OS_EVENT *pevent)INT16U cnt;cnt = pevent-OSEventCnt; if (cnt 0) pevent-OSEventCnt-; return (

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

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

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

26、iting;if(pevent-OSEventGrp!=0 x00/根據(gnj)是否有任務在等待信號量設置等待標志tasks_waiting=TRUE;elsetasks_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鏈頭指針*e

27、rr=OS_NO_ERR;return(OS_EVENT)0);else*err=OS_ERR_TASK_WAITING;/有任務等待,刪除信號量失敗return(pevent);共一百二十九頁刪除(shnch)一個信號量OSSemDel()case OS_DEL_ALWAYS:/無論有無任務等待都刪除信號量 /將等待列表(li bio)中的每個任務都設置成就緒while(pevent-OSEventGrp!=0 x00)OS_EventTaskRdy(pevent,(void *)0, OS_STAT_SEM);/釋放該信號量的ECB回空閑控制塊鏈pevent-OSEventType=OS_

28、EVENT_TYPE_UNUSED;pevent-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);共一百二十九頁清除信號量的任務(rn wu)等待列表為了清除等待一個信號量的所有任務,某些內核支持Flush操作,以便(ybin)釋放信號量等待任務列表中的所有任務。當多個任務的執(zhí)行必須在某些點

29、相遇時,需要這樣的機制。 SignalTaskTask2 二值信號量初值為0FlushTask1Task3共一百二十九頁第二節(jié)郵箱和消息(xio xi)隊列通信方式(fngsh)概述消息隊列機制的主要數據結構典型的消息隊列操作消息隊列的其他典型使用共一百二十九頁任務間的通信方式直接通信。在通信過程中雙方必須明確地知道(命名)彼此:Send (P,message) 發(fā)送一個消息到任務PReceive(Q,message) 從任務Q接收(jishu)一個消息 間接通信。通信雙方不需要指出消息的來源或去向,而通過中間機制來通信。如:send(A,message) 發(fā)送一個消息給郵箱Areceive(

30、A,message) 從郵箱A接收一個消息通信(tng xn)方式概述共一百二十九頁消息隊列:屬于間接通信方式消息:內存空間中一段長度可變的緩沖區(qū),其長度和內容均可以由用戶定義,其內容可以是實際的數據、數據塊的指針或空。對消息內容的解釋由應用完成。從操作系統觀點看,消息沒有定義的格式,所有的消息都是字節(jié)流,沒有特定的含義。從應用觀點看,根據應用定義的消息格式,消息被解釋成特定的含義。應用可以只把消息當成(dn chn)一個標志,這時消息機制用于實現同步概述(i sh)共一百二十九頁一些操作系統內核把消息進一步分為:郵箱和消息隊列郵箱僅能存放單條消息,它提供了一種低開銷的機制(jzh)來傳送信息

31、。每個郵箱可以保存一條大小為若干個字節(jié)的消息。消息隊列可存放若干消息,提供了一種任務間緩沖通信的方法。消息機制可支持定長與可變長度兩種模式的消息,可變長度的消息隊列需要對隊列中的每一條消息增加額外的存儲開銷。概述(i sh)共一百二十九頁消息(xio xi)隊列機制的主要數據結構隊列控制塊隊列長度QCB1隊列名或IDTask3Task4接收任務等待列表Task1Task2發(fā)送任務等待列表最大消息長度QCB2消息隊列及其相關的參數和支持(zhch)數據結構 共一百二十九頁消息(xio xi)隊列狀態(tài)圖非空滿隊列創(chuàng)建(chungjin)消息數為0消息隊列狀態(tài)圖消息發(fā)送消息數加1空消息發(fā)送消息數為1

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

33、域消息隊列的內存區(qū)域接收任務的內存區(qū)域1st copy2nd copy發(fā)送和接收消息的消息拷貝和內存使用這種消息傳遞方法效率低、占用空間大一種效率更高的方式(fngsh)是傳遞消息指針共一百二十九頁number_of_messagemax_message_countnumber_of_messagemax_message_sizewait_disciplinewait_queuequeue_startqueue_inqueue_outqueue_endmessagemessagemessagemessagemessagemessagemessagemessagemessagemax_messa

34、ge_count消息隊列(duli)控制塊消息(xio xi)隊列緩沖區(qū)消息隊列機制的主要數據結構共一百二十九頁消息隊列(duli)的環(huán)形緩沖消息隊列(duli)機制的主要數據結構max_message_countqueue_endqueue_startqueue_outnumber_of_messagequeue_in消息指針共一百二十九頁典型的消息(xio xi)隊列操作創(chuàng)建消息隊列發(fā)送普通(ptng)消息發(fā)送緊急消息發(fā)送廣播消息接收消息刪除消息隊列獲取有關消息隊列的各種信息 共一百二十九頁創(chuàng)建消息(xio xi)隊列創(chuàng)建消息隊列時,調用者可以指定如下參數(cnsh):消息的最大長度每個消

35、息隊列中最多的消息數消息隊列的屬性任務等待消息時的排隊方式:FIFO或PRIORITY系統為新創(chuàng)建的消息隊列分配唯一的ID 共一百二十九頁發(fā)送(f sn)消息根據緊急程度(chngd)的不同,消息通??煞譃槠胀ㄏ⑴c緊急消息。如果有任務正在等待消息(即消息隊列為空),則普通消息發(fā)送和緊急消息發(fā)送的執(zhí)行效果是一樣的。任務從等待隊列移到就緒隊列中,消息被拷貝到任務提供的緩沖區(qū)中(或者由接收任務得到指向消息的指針)。如果沒有任務等待,發(fā)送普通消息將消息放在隊列尾,而發(fā)送緊急消息將消息放在隊列頭。共一百二十九頁發(fā)送(f sn)消息Msg 3接收任務等待列表Msg 2Msg 1消息隊列發(fā)送普通消息先進先

36、出(FIFO)次序Msg 3接收任務等待列表Msg 2Msg 1消息隊列發(fā)送緊急消息后進先出(LIFO)次序共一百二十九頁發(fā)送(f sn)消息如果發(fā)送消息時隊列已被填滿,則不同的操作系統可能采取不同的處理(chl)辦法:掛起試圖向已滿的消息隊列中發(fā)送消息的任務(不適用于中斷服務程序)簡單地丟棄該條消息并向調用者返回錯誤信息廣播消息。在此之前所有試圖從隊列中接收消息的任務此時都將獲得相同的消息。該功能拷貝消息到各任務的消息緩沖中(或者讓所有的等待任務得到指向消息的指針),并喚醒所有的等待任務。共一百二十九頁接收(jishu)消息如果指定的消息隊列中有消息,則將其中的第一條消息拷貝到調用者的緩沖區(qū)

37、(或者將第一條消息指針傳遞給調用者),并從消息隊列中刪除它。如果此時消息隊列中沒有消息,則可能出現以下幾種情況:永遠等待消息的到達:等待消息的任務按FIFO或優(yōu)先級高低順序排列在等待隊列中 等待消息且指定等待時限(shxin):等待消息的任務按FIFO或優(yōu)先級高低順序排列在等待隊列中不等待,強制立即返回共一百二十九頁接收(jishu)消息限時等待可有效預防死鎖中斷服務程序接收消息時必須選擇不等待,因為中斷服務程序是不能被阻塞(zs)的。如果消息隊列被應用刪除,則所有等待該消息隊列的任務都被返回一個錯誤信息,并回復到就緒狀態(tài)。共一百二十九頁接收(jishu)消息Task 4High消息隊列接收任

38、務等待列表任務等待列表基于優(yōu)先級的次序Task 2mediumTask 3mediumTask 1LowTask 4High消息隊列接收任務等待列表任務等待列表先進先出(FIFO)次序Task 2mediumTask 3mediumTask 1Low共一百二十九頁刪除(shnch)消息隊列從系統中刪除指定的消息(xio xi)隊列,釋放消息隊列控制塊及消息隊列緩沖區(qū)。任何知道此消息隊列ID號的代碼都可以刪除它。消息隊列被刪除后,所有等待從這個消息隊列接收消息的任務都回到就緒態(tài),并得到一個錯誤信息表明消息隊列已被刪除。共一百二十九頁消息隊列(duli)的其他典型使用緊耦合的單向數據通信:發(fā)送(f

39、 sn)任務發(fā)送(f sn)消息后要求一個響應信號,表明接收任務已經成功接收到消息。 Task1Task2 共一百二十九頁消息隊列的其他(qt)典型使用緊耦合的雙向數據通信 :如果數據需要在任務之間雙向流動,則可以(ky)采用緊耦合的雙向數據通信模式(也稱為全雙工通信)。 Task1Task2共一百二十九頁第三節(jié)事 件概述事件(shjin)機制的主要數據結構典型的事件操作事件機制的典型應用共一百二十九頁在嵌入式實時內核中,事件是指一種表明預先定義的系統事件已經發(fā)生的機制。事件機制用于任務與任務之間、任務與ISR之間的同步。其主要的特點是可實現一對多的同步。 一個事件就是一個標志,不具備其它信息

40、。一個或多個事件構成一個事件集。事件集可以用一個指定長度的變量(比如(br)一個8bit, 16bit或32bit的無符號整型變量,不同的操作系統其具體實現不一樣)來表示,而每個事件由在事件集變量中的某一位來代表。 概述(i sh)共一百二十九頁事件及事件集有以下特點: 事件間相互獨立事件僅用于同步,不提供數據傳輸功能事件無隊列,即多次發(fā)送同一事件,在未經過任何處理的情況下,其效果等同于只發(fā)送一次。提供事件機制的意義在于:當某任務要與多個任務或中斷服務同步時,就需要使用事件機制。若任務需要與一組事件中的任意一個(y )發(fā)生同步,可稱為獨立型同步(邏輯“或”關系)。任務也可以等待若干事件都發(fā)生時

41、才同步,稱為關聯型同步(邏輯“與”關系)。 概述(i sh)共一百二十九頁“或”同步(tngb)和“與”同步(tngb)概述(i sh)任務任務任務任務ISRISRORAND“與”型同步“或”型同步事件集事件集POSTPOSTPENDPEND共一百二十九頁用多個事件的組合(zh)發(fā)信號給多個任務概述(i sh)任務任務任務ISRORAND事件集事件集事件集(8,16或32位)POSTPENDPEND共一百二十九頁術語:發(fā)送事件集 。指在一次發(fā)送過程中發(fā)往接收者(比如任務)的一個或多個事件的組合。 待處理事件集。指已被發(fā)送到一個接收者但還沒有(mi yu)被接收(即正在等待處理)的所有事件的集合

42、。 事件條件。指事件接收者在一次接收過程中期待接收的一個或多個事件的集合?!盎颉蓖剑捍幚硎录灰ㄊ录l件中的任一事件即可滿足要求;“與”同步:其二是待處理事件集必須包括事件條件中的全部事件方可滿足要求。 概述(i sh)共一百二十九頁事件機制的主要(zhyo)數據結構事件集控制塊:管理所有創(chuàng)建的事件集或者事件集附屬(fsh)于任務,不需創(chuàng)建,其相關參數成為任務控制塊的一部分共一百二十九頁事件的內部實現機制實例(shl)說明C/OS-II事件標志(biozh)組數據結構typedef structINT8UOSFlagType;/指示本數據結構的類型void*OSFlagWaitLis

43、t;/等待事件標志的任務鏈表OS_FLAGSOSFlagFlags;/各事件標志的當前狀態(tài)OS_FLAG_GRP;事件標志節(jié)點數據結構typedef structvoid*OSFlagNodeNext;/后驅指針void*OSFlagNodePrev;/前驅指針void*OSFlagNodeTCB;/任務控制塊指針void*OSFlagNodeFlagGrp;/指回OS_FLAG_GRP結構OS_FLAGSOSFlagNodeFlags;/所等待的事件標志組合INT8UOSFlagNodeWaitType;/等待類型(與、或)OS_FLAG_NODE;共一百二十九頁事件(shjin)標志組、事

44、件(shjin)標志節(jié)點及任務控制塊之間的關系OS_FLAG_GRPOS_FLAG_NODE.OSTCBFlagNode.OSFlagNodeFlags.OSFlagNodeWaitType.OSFlagNodeNext.OSFlagNodePrev.OSFlagNodeTCB.OSFlagWaitList.OSFlagFlags.OSFlagTypeAND or ORAND or ORAND or OROS_EVENT_TYPE_FLAG00.OSTCBFlagNodeOS_TCB共一百二十九頁典型的事件(shjin)操作創(chuàng)建事件集刪除事件集發(fā)送事件(集)接收事件(集)獲取(huq)有關事件

45、集的各種信息 共一百二十九頁創(chuàng)建(chungjin)事件集申請空閑(kngxin)事件集控制塊,設置事件集屬性,初始化控制塊中的域,分配ID號共一百二十九頁創(chuàng)建(chungjin)一個事件標志組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 *)OSFlagFreeLis

46、t-OSFlagWaitList;/調整空閑結構鏈頭指針pgrp-OSFlagType=OS_EVENT_TYPE_FLAG;pgrp-OSFlagFlags=flags;/初始化當前(dngqin)各事件標志的狀態(tài)pgrp-OSFlagWaitList=(void *)0;/尚無任務等待事件標志*err=OS_NO_ERR;else*err=OS_FLAG_GRP_DEPLETED;return(pgrp);共一百二十九頁接收(jishu)事件(集)在接收事件(shjin)(集)時可以有如下選項WAITNO_WAIT接收事件(集)時可等待接收事件(集)時不等待接收者永遠等待,直到事件條件被滿

47、足后成功返回; 接收者根據指定的時限等待。EVENT_ALLEVENT_ANY待處理事件集必須包含事件條件中的全部事件方可滿足要求,即按照“與”條件接收事件待處理事件集只要包含事件條件中的任一事件即可滿足要求,即按照“或”條件接收事件共一百二十九頁接收(jishu)(等待)事件標志組的事件標志位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作為局部變量存在于

48、調用該函數的任務(rn wu)堆棧中OS_FLAGS flags_cur;OS_FLAGS flags_rdy;switch(wait_type)case OS_FLAG_WAIT_SET_ALL:/任務以“與”方式等待事件標志flags_rdy=pgrp-OSFlagFlags&flags;if(flags_rdy=flags)/事件標志當前狀態(tài)與等待條件相符pgrp-OSFlagFlags&=flags_rdy;/清除(即“消費”)滿足條件的事件標志flags_cur=pgrp-OSFlagFlags;*err=OS_NO_ERR;return(flags_cur);/返回處理后的事件標志

49、組elseOS_FlagBlock(pgrp, &node, flags, wait_type, timeout);/事件標志當前狀態(tài)與等待條件不相符,任務被阻塞break;共一百二十九頁接收(jishu)(等待)事件標志組的事件標志位OSFlagPend()case OS_FLAG_WAIT_SET_ANY: /任務以“或”方式等待事件標志 flags_rdy=pgrp-OSFlagFlags&flags;if(flags_rdy!=(OS_FLAGS)0)/有滿足條件的事件標志 pgrp-OSFlagFlags&=flags_rdy; /清除(即“消費”)滿足條件的事件標志 flags_c

50、ur=pgrp-OSFlagFlags; *err=OS_NO_ERR; return(flags_cur); /返回處理后的事件標志組elseOS_FlagBlock(pgrp, &node, flags, wait_type, timeout);/事件標志當前狀態(tài)(zhungti)與等待條件不相符,任務被阻塞break;default:flags_cur=(OS_FLAGS)0;*err=OS_FLAG_ERR_WAIT_TYPE;return(flags_cur);共一百二十九頁OS_Sched();/當前任務被放到事件標志等待鏈后,內核實施任務調度if(OSTCBCur-OSTCBSt

51、at & OS_STAT_FLAG)/判斷(pndun)任務重新就緒的原因,如果是等待超時OS_FlagUnlink(&node);/將任務從事件標志等待鏈中解除下來OSTCBCur-OSTCBStat=OS_STAT_RDY;/設置當前任務狀態(tài)為就緒flags_cur=(OS_FLAGS)0;/無效的事件標志狀態(tài)*err=OS_TIMEOUT;/超時信號else/任務重新就緒的原因是在限定時間得到了滿足條件的事件標志pgrp-OSFlagFlags&=OSTCBCur-OSTCBFlagsRdy; /清除(即“消費”)滿足條件的事件標志flags_cur=pgrp-OSFlagFlags;*

52、err=OS_NO_ERR;return(flags_cur);接收(jishu)(等待)事件標志組的事件標志位OSFlagPend()共一百二十九頁添加一個任務(rn wu)到事件標志組等待任務(rn wu)鏈表中OS_FlagBlock()OS_FLAG_GRPOS_EVENT_TYPE_FLAGAND or ORAND or OR00OS_TCBOS_TCBOSTCBCurAND or OROS_FLAG_NODEOS_FLAG_NODE0共一百二十九頁接收(無等待(dngdi)地獲取)事件標志OSFlagAccept()OS_FLAGS OSFlagAccept (OS_FLAG_GR

53、P *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:/”與”方式等待flags_rdy = pgrp-OSFlagFlags & flags;if (flags_rdy = flags) pgrp-OSFlagFlags &= flags_rdy;/事件標志當前狀態(tài)與等待條件(tiojin)相符,清除(即“消費”)相應的事件標志els

54、e *err = OS_FLAG_ERR_NOT_RDY;/不符合條件,返回錯誤信息flags_cur = pgrp-OSFlagFlags;break;共一百二十九頁接收(無等待地獲取(huq))事件標志OSFlagAccept() case OS_FLAG_WAIT_SET_ANY:/”或”方式等待flags_rdy = pgrp-OSFlagFlags & flags;if (flags_rdy != (OS_FLAGS)0) pgrp-OSFlagFlags &= flags_rdy;/事件(shjin)標志當前狀態(tài)與等待條件相符,清除(即“消費”)相應的事件(shjin)標志else

55、 *err = OS_FLAG_ERR_NOT_RDY; /不符合條件,返回錯誤信息flags_cur = pgrp-OSFlagFlags;break; default:flags_cur = (OS_FLAGS)0;/0表示無效的事件標志組*err = OS_FLAG_ERR_WAIT_TYPE;/錯誤的等待類型break; return (flags_cur);共一百二十九頁發(fā)送(f sn)事件(集)調用者(任務或中斷)構造一個事件(集),將其發(fā)往接收者(比如目標任務)??赡軙霈F(chxin)以下幾種情況之一:目標任務正在等待的事件條件得到滿足,任務就緒;目標任務正在等待的事件條件沒有

56、得到滿足,該事件(集)被按“或”操作,保存到目標任務的待處理事件集中,目標任務繼續(xù)等待;目標任務未等待事件(集),該事件(集)被按“或”操作,保存到目標任務的待處理事件集中。 共一百二十九頁發(fā)送(置位)事件(shjin)標志組中的事件(shjin)標志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

57、 |= flags;/置位事件標志pnode = (OS_FLAG_NODE *)pgrp-OSFlagWaitList;/獲取(huq)任務等待鏈頭節(jié)點while (pnode != (OS_FLAG_NODE *)0) /如果有任務等待,遍歷等待鏈switch (pnode-OSFlagNodeWaitType) case OS_FLAG_WAIT_SET_ALL:/”與”方式等待 flags_rdy = pgrp-OSFlagFlags & pnode-OSFlagNodeFlags; if (flags_rdy = pnode-OSFlagNodeFlags) /符合等待條件 if (

58、OS_FlagTaskRdy(pnode, flags_rdy) = TRUE) sched = TRUE;/如果任務就緒,設置調度標志 break;共一百二十九頁case OS_FLAG_WAIT_SET_ANY:/”或”方式等待(dngdi) flags_rdy = pgrp-OSFlagFlags & pnode-OSFlagNodeFlags; if (flags_rdy != (OS_FLAGS)0) /有滿足條件的事件標志 if (OS_FlagTaskRdy(pnode, flags_rdy) = TRUE) sched = TRUE; /如果任務就緒,設置調度標志 break;

59、 pnode = (OS_FLAG_NODE *)pnode-OSFlagNodeNext;/下一個等待事件標志的節(jié)點if (sched = TRUE) OS_Sched();/如果設置了調度標志,則實施調度*err = OS_NO_ERR; return (pgrp-OSFlagFlags);發(fā)送(f sn)(置位)事件標志組中的事件標志OSFlagPost()共一百二十九頁刪除(shnch)事件集回收事件集控制塊到空閑(kngxin)鏈中,等待接收該事件集的任務被恢復就緒共一百二十九頁刪除事件(shjin)標志組OSFlagDel()OS_FLAG_GRP *OSFlagDel (OS_F

60、LAG_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) /無任務等待,釋放控制塊到空閑(kngxin)鏈中 pgrp-OSFlagType = O

溫馨提示

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

評論

0/150

提交評論