嵌入式系統(tǒng) RTOS uCOS-II 原理及應(yīng)用 -- 4.ppt_第1頁
嵌入式系統(tǒng) RTOS uCOS-II 原理及應(yīng)用 -- 4.ppt_第2頁
嵌入式系統(tǒng) RTOS uCOS-II 原理及應(yīng)用 -- 4.ppt_第3頁
嵌入式系統(tǒng) RTOS uCOS-II 原理及應(yīng)用 -- 4.ppt_第4頁
嵌入式系統(tǒng) RTOS uCOS-II 原理及應(yīng)用 -- 4.ppt_第5頁
已閱讀5頁,還剩89頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、西安郵電學(xué)院 計(jì)算機(jī)系,1,2020/8/25,嵌入式實(shí)時(shí)操作系統(tǒng) C/OS-II,西安郵電學(xué)院-計(jì)算機(jī)系 Tel: 85383409 (ZQL) Email: ,2020/8/25,西安郵電學(xué)院 計(jì)算機(jī)系,2,第4章 任務(wù)的同步與通信,西安郵電學(xué)院 計(jì)算機(jī)系,3,2020/8/25,第4章 任務(wù)的同步與通信,一個(gè)應(yīng)用系統(tǒng)通常是由多個(gè)任務(wù)組成,任務(wù)之間互相協(xié)作共同完成目標(biāo)功能。例如任務(wù)對(duì)共享資源競(jìng)爭(zhēng),先采集數(shù)據(jù)才能處理數(shù)據(jù)等情況。(任務(wù)的同步控制,共享資源的競(jìng)爭(zhēng),任務(wù)間的通信等問題的解決方案-OS) 任務(wù)間的同步-任務(wù)間的制約、合作運(yùn)行機(jī)制。 系統(tǒng)各任務(wù)之間通過 “任務(wù)通信” 的方式,實(shí)現(xiàn)任務(wù)

2、的信息傳遞和同步控制, “任務(wù)通信” 的載體就是 - 事件。 常用的事件:信號(hào)量(計(jì)數(shù)型-SEM/互斥型-MUTEX)、消息郵箱(MBOX)、消息隊(duì)列(Q)、事件標(biāo)志組等。 事件用 “事件控制塊”(ECB) 來描述。,西安郵電學(xué)院 計(jì)算機(jī)系,4,2020/8/25,第4章 目錄,1、 任務(wù)間的同步和事件控制塊 2、 信號(hào)量及其操作 3、互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn) 4、消息郵箱及其操作 5、消息隊(duì)列及其操作,西安郵電學(xué)院 計(jì)算機(jī)系,5,2020/8/25,第4章 目錄,1、 任務(wù)間的同步和事件控制塊 2、 信號(hào)量及其操作 3、互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn) 4、消息郵箱及其操作 5、消息隊(duì)列及其

3、操作,西安郵電學(xué)院 計(jì)算機(jī)系,6,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,任務(wù)間的同步 - 各任務(wù)運(yùn)行的先后、觸發(fā)等關(guān)系,備注:數(shù)據(jù)采集任務(wù)A 和數(shù)據(jù)處理任務(wù)B 之間存在同步關(guān)系。,西安郵電學(xué)院 計(jì)算機(jī)系,7,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,任務(wù)間的互斥 - 共享資源的申請(qǐng)使用,備注:數(shù)據(jù)采集任務(wù)A 和數(shù)據(jù)處理任務(wù)B 之間存在互斥關(guān)系。,西安郵電學(xué)院 計(jì)算機(jī)系,8,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,任務(wù)之間的這種相互制約、相互合作的運(yùn)行機(jī)制稱為 “任務(wù)間的同步” 系統(tǒng)中任務(wù)之間相互傳遞事件,來實(shí)現(xiàn)任務(wù)的同步、協(xié)作。,備注:用戶自定義全局變

4、量的方法,也可以編程實(shí)現(xiàn)程序間的信息傳遞。但如果想將信息傳遞的各項(xiàng)功能作完備,工作量是比較大的。況且,這類需求在應(yīng)用系統(tǒng)設(shè)計(jì)中是很常用的。 uC/OS-II 中將此類工作以系統(tǒng)功能方式提供與用戶 - 事件操作。,西安郵電學(xué)院 計(jì)算機(jī)系,9,2020/8/25,舉例:任務(wù)間的共享資源競(jìng)爭(zhēng)問題及處理方式。,某一分布式系統(tǒng),需要主設(shè)備(M_Dev)使用同一個(gè)UART 資源分別與從設(shè)備1(S_Dev1)和從設(shè)備2(S_Dev2)以不同的 “串行通信模式” 進(jìn)行通信。,西安郵電學(xué)院 計(jì)算機(jī)系,10,2020/8/25,void main(void)/系統(tǒng)主函數(shù) OSInit(); .; OSTaskCr

5、eate(Task_A,(void *)pdata,.); OSTaskCreate(Task_B,(void *)pdata,.); .; OSStart(); ,void Task_A(void * pdata) .; /Task_A環(huán)境初始化 for (;) .; / Task_A 業(yè)務(wù) OSTaskCreate(UART_S1_Task,(void *)US1,.); .; / Task_A 業(yè)務(wù) OSTimeDly( xxx ); ,void Task_B(void * pdata) .; /Task_B環(huán)境初始化 for (;) .; / Task_B 業(yè)務(wù) OSTaskCreat

6、e(UART_S2_Task,(void *)US2,.); .; / Task_B 業(yè)務(wù) OSTimeDly( yyy ); ,說明:如此設(shè)計(jì)未對(duì)共享資源作任何約束,實(shí)際運(yùn)行中可能發(fā)生Task_A與Task_B 沖突競(jìng)爭(zhēng)。,BOOLEAN uart_key; void main(void)/系統(tǒng)主函數(shù) OSInit(); .; uart_key = TRUE; OSTaskCreate(Task_A,(void *)pdata,.); OSTaskCreate(Task_B,(void *)pdata,.); .; OSStart(); ,void Task_A(void * pdata)

7、.; /Task_A環(huán)境初始化 for (;) .; / Task_A 業(yè)務(wù) if (uart_key) uart_key = FALSE; OSTaskCreate(UART_S1_Task,(void *)US1,.); uart_key = TRUE; .; / Task_A 業(yè)務(wù) OSTimeDly( xxx ); ,void Task_B(void * pdata) .; /Task_B環(huán)境初始化 for (;) .; / Task_B 業(yè)務(wù) if (uart_key) uart_key = FALSE; OSTaskCreate(UART_S2_Task,(void *)US2,.

8、); uart_key = TRUE; .; / Task_B 業(yè)務(wù) OSTimeDly( yyy ); ,(互斥型任務(wù)處理) 說明:通過用戶定義全局變量uart_key 對(duì)任務(wù)使用共享資源作約束,可以避免Task_A與Task_B 沖突競(jìng)爭(zhēng),但其管理性能支持較弱。,void * msg_ptr; INT16U AD_Value; void main(void)/系統(tǒng)主函數(shù) OSInit(); .; OSTaskCreate(Task_A,(void *)pdata,.); OSTaskCreate(Task_B,(void *)pdata,.); .; OSStart(); ,void Ta

9、sk_A(void * pdata) .; /Task_A環(huán)境初始化 for (;) .; / Task_A 業(yè)務(wù) if (msg_ptr=NULL) Signal_Capture(AD_Value); /采集數(shù)據(jù) msg_ptr = ,void Task_B(void * pdata) .; /Task_B環(huán)境初始化 INT16U AD_B; for (;) .; / Task_B 業(yè)務(wù) if (msg_ptr != NULL) AD_B = * msg_ptr; / 數(shù)據(jù)處理 msg_ptr = NULL; .; / Task_B 業(yè)務(wù) OSTimeDly( yyy ); ,(帶數(shù)據(jù)傳遞的

10、協(xié)作型任務(wù)處理) 說明:Task_A數(shù)據(jù)采集任務(wù),Task_B數(shù)據(jù)處理任務(wù);通過用戶定義全局指針變量msg_ptr 對(duì)(采集、處理數(shù)據(jù))任務(wù)作約束,可以協(xié)調(diào)Task_A與Task_B,但其管理性能支持較弱。,西安郵電學(xué)院 計(jì)算機(jī)系,13,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件,漢語中所謂的 “事件” ,是指一個(gè)事情的發(fā)生。在 uC/OS-II 中將信號(hào)量、消息郵箱和消息隊(duì)列的一個(gè)存在稱為一個(gè)事件,事件操作:創(chuàng)建、發(fā)送 、請(qǐng)求和刪除等。 (uC/OS的原作者將 “事件-EVENT” 理解為靜態(tài)的數(shù)據(jù)結(jié)構(gòu)。) 發(fā)送事件 - 向信號(hào)量、消息郵箱和消息隊(duì)列的一次信息發(fā)送(寫-Pos

11、t)操作。 請(qǐng)求事件 - 對(duì)信號(hào)量、消息郵箱和消息隊(duì)列的一次查詢(讀-Pend)操作。 uC/OS-II 中以系統(tǒng)函數(shù)的方式向任務(wù)提供事件操作。,西安郵電學(xué)院 計(jì)算機(jī)系,14,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件(1) - 信號(hào)量(Sem / Mutex),兩類信號(hào)量:互斥信號(hào)量-Mutex、計(jì)數(shù)型信號(hào)量-Sem; 互斥信號(hào)量是一個(gè)二值信號(hào)量,主要用于 “獨(dú)占式共享資源” 的管理(例如:打印機(jī))。 計(jì)數(shù)型信號(hào)量用以 “多個(gè)同類型資源” 的管理,通常用一個(gè)計(jì)數(shù)器實(shí)現(xiàn)(例如:存儲(chǔ)塊)。,試驗(yàn):E_RTOS uC/OS-II 任哲 Page 100 Exp 4-1 , Page

12、 103 Exp 4-2 在ARM板上改為L(zhǎng)amp A、B、C 模擬,Task_A 控制 A、B 燈,Task_B 控制B、C 燈。,BOOLEAN uart_key; /互斥標(biāo)志 void main(void) /系統(tǒng)主函數(shù) OSInit(); .; uart_key = TRUE; OSTaskCreate(Task_A,(void *)pdata,.); OSTaskCreate(Task_B,(void *)pdata,.); .; OSStart(); ,void Task_A(void * pdata) .; /Task_A環(huán)境初始化 for (;) .; / Task_A 業(yè)務(wù)

13、if (uart_key) uart_key = FALSE; OSTaskCreate(UART_S1_Task,(void *)US1,.); uart_key = TRUE; .; / Task_A 業(yè)務(wù) OSTimeDly( xxx ); ,void Task_B(void * pdata) .; /Task_B環(huán)境初始化 for (;) .; / Task_B 業(yè)務(wù) if (uart_key) uart_key = FALSE; OSTaskCreate(UART_S2_Task,(void *)US2,.); uart_key = TRUE; .; / Task_B 業(yè)務(wù) OSTi

14、meDly( yyy ); ,(互斥型任務(wù)處理) 說明:通過用戶定義全局變量uart_key 對(duì)任務(wù)使用共享資源作約束,可以避免Task_A與Task_B 沖突競(jìng)爭(zhēng),但其管理性能支持較弱。,西安郵電學(xué)院 計(jì)算機(jī)系,16,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件(2) - 消息郵箱(Mbox),用于解決任務(wù)間的數(shù)據(jù)傳送問題。,在多任務(wù)OS中采用消息傳送的方式實(shí)現(xiàn)任務(wù)間的 “單批次數(shù)據(jù)” 通信,這個(gè)數(shù)據(jù)稱為 “消息” 。,例如:Task_A 采集一個(gè)數(shù)據(jù),Task_B 要使用 Task_A 采集的數(shù)據(jù)。,原理:在內(nèi)存中創(chuàng)建數(shù)據(jù)傳送緩沖區(qū)(消息緩沖區(qū)),通過傳送該緩沖區(qū)的地址指針傳

15、遞數(shù)據(jù)。,這個(gè)緩沖區(qū)指針的數(shù)據(jù)結(jié)構(gòu)稱為 “消息郵箱” 。,西安郵電學(xué)院 計(jì)算機(jī)系,17,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件(2) - 消息郵箱(Mbox),西安郵電學(xué)院 計(jì)算機(jī)系,18,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件(2) - 消息郵箱(Mbox),試驗(yàn): 1、(傳統(tǒng)的全局變量方式 - 數(shù)據(jù)傳送) Task_A 每次按鍵“計(jì)數(shù)” +1,并傳送 “計(jì)數(shù)” 數(shù)據(jù),Task_B 在LED 或 LCD 顯示收到的該數(shù)據(jù)。 2、用消息郵箱方式-數(shù)據(jù)傳送; Task_A 每次按鍵“計(jì)數(shù)” +1,并傳送 “計(jì)數(shù)” 數(shù)據(jù),Task_B 在LED 或 LCD

16、顯示收到的該數(shù)據(jù)。 比較兩種程序設(shè)計(jì)風(fēng)格,分析代碼執(zhí)行效率; E_RTOS uC/OS-II 任哲 Page 107 Exp 4-3,西安郵電學(xué)院 計(jì)算機(jī)系,19,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件(3) - 消息隊(duì)列(Q),用于解決任務(wù)間的 “多個(gè)數(shù)據(jù)” 傳送問題。 在多任務(wù)OS中,采用 “指針數(shù)組” 的方式進(jìn)行多數(shù)據(jù)的傳送。 這個(gè)指向 “指針數(shù)組” 的指針 + “指針數(shù)組” + 消息緩沖區(qū) 所構(gòu)成的數(shù)據(jù)結(jié)構(gòu)稱為 “消息隊(duì)列” 。,西安郵電學(xué)院 計(jì)算機(jī)系,20,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,等待任務(wù)列表,當(dāng)一個(gè) “事件” 被占用時(shí),其它請(qǐng)求該事

17、件的任務(wù)暫時(shí)得不到事件的服務(wù),處于等待狀態(tài)。 OS使用等待任務(wù)表管理“事件” ;即使用等待任務(wù)表對(duì)那些等待該事件的各個(gè)任務(wù)進(jìn)行管理(記錄等待該事件的任務(wù)并排序,任務(wù)等待事件有限時(shí)等) 。 每個(gè)事件都有一個(gè)“等待任務(wù)表” ,用于完成事件對(duì)任務(wù)的驅(qū)動(dòng)、限時(shí)等管理,其原理類似于任務(wù)就續(xù)表。 任務(wù)等待事件限時(shí)則記錄在TCB的OSTCBDly成員中,每個(gè)Tick都會(huì)對(duì)其進(jìn)行維護(hù),當(dāng)限時(shí)到時(shí)uC/OS-II強(qiáng)行將其轉(zhuǎn)入就續(xù)狀態(tài)。,西安郵電學(xué)院 計(jì)算機(jī)系,21,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件控制塊(ECB),uC/OS-II 使用ECB的數(shù)據(jù)結(jié)構(gòu)統(tǒng)一描述三類事件(信號(hào)量、消息郵箱

18、、消息隊(duì)列)。 uC/OS-II 中的ECB數(shù)據(jù)結(jié)構(gòu)如下:,typedef struct INT8U OSEventType;/事件類型 INT16U OSEventCnt;/計(jì)數(shù)信號(hào)量的計(jì)數(shù)器 void * OSEventPtr;/消息(消息隊(duì)列)指針 INT8U OSEventGrp;/等待事件的任務(wù)組 INT8U OSEventTblOS_EVENT_TBL_SIZE; /任務(wù)等待表 OS_EVENT;,西安郵電學(xué)院 計(jì)算機(jī)系,22,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件控制塊(ECB)的結(jié)構(gòu),OSEventType取值含義,OSEventTbl ,任務(wù)等待表,西安郵

19、電學(xué)院 計(jì)算機(jī)系,23,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,空事件控制塊(ECB)鏈表,uC/OS-II 初始化(OSInit( ))時(shí),按OS_CFG.H中OS_MAX_EVENTS 定義的系統(tǒng)事件總數(shù)創(chuàng)建該鏈表。 使用中應(yīng)用系統(tǒng)每創(chuàng)建一個(gè)事件,都會(huì)從此鏈表中申請(qǐng)一個(gè)空ECB,并填寫相關(guān)成員初值;刪除一個(gè)事件時(shí),會(huì)將相應(yīng)事件的ECB歸還該鏈表。,西安郵電學(xué)院 計(jì)算機(jī)系,24,2020/8/25,4.1 任務(wù)間的同步和事件控制塊,事件控制塊(ECB)操作函數(shù),uC/OS-II 有三類事件(信號(hào)量-Sem/互斥信號(hào)量-Mutex、消息郵箱-Mbox、消息隊(duì)列-Q)。 uC/OS

20、-II 中對(duì)每種事件提供5個(gè)基本操作函數(shù),供用戶管理事件。,這些系統(tǒng)函數(shù)定義在相應(yīng)的 “事件” 文件中。,OSxxxCreate( ) -創(chuàng)建事件; OSxxxPost( ) -發(fā)送事件; OSxxxPend( ) -請(qǐng)求事件; OSxxxDel( ) -刪除事件; OSxxxQuery( ) -查看事件;,備注:其中 xxx 為事件名(Sem、Mutex、Mbox、Q),西安郵電學(xué)院 計(jì)算機(jī)系,25,2020/8/25,第4章 目錄,1、 任務(wù)間的同步和事件控制塊 2、 信號(hào)量及其操作 3、互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn) 4、消息郵箱及其操作 5、消息隊(duì)列及其操作,西安郵電學(xué)院 計(jì)算機(jī)系,26

21、,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量(Sem),1、信號(hào)量事件的數(shù)據(jù)成員 OSEventType = OS_EVENT_TYPE_SEM,OSEventPtr = Null 2、有任務(wù)申請(qǐng)某信號(hào)量時(shí), if ( The ECB-OSEventCnt 0 ) then OSEventCnt- ; The Task Goon; else Set the Task at WAIT_STATE; 3、有任務(wù)發(fā)送某信號(hào)量時(shí), if ( no Task Waitting the SEM) then The ECB-OSEventCnt+; else Set the H_Prio_TASk

22、at READY; OS_Sched( ); ,西安郵電學(xué)院 計(jì)算機(jī)系,27,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量的操作 - 創(chuàng)建信號(hào)量,信號(hào)量操作系統(tǒng)函數(shù)定義在 OS_SEM.C 文件。 在使用信號(hào)量之前,必須創(chuàng)建信號(hào)量。 創(chuàng)建信號(hào)量系統(tǒng)函數(shù)的原型:,OS_EVENT * OSSemCreate( INT16U cnt/信號(hào)量計(jì)數(shù)初值 ),功能:從OSEventFreeList中申請(qǐng)一個(gè)ECB,并進(jìn)行初始化(用cnt初始化ECB(Sem)-OSEventCnt);返回一個(gè)已初始化的 ECB 的指針。,西安郵電學(xué)院 計(jì)算機(jī)系,28,2020/8/25, OS_EVENT * UA

23、RT_Flag; /聲明事件指針變量 INT8U err; /聲明全局狀態(tài)變量 void main (void) OSInit(); UART_Flag = OSSemCreate(1); /創(chuàng)建信號(hào)量 OSTaskCreate(Task_A,); /創(chuàng)建任務(wù)A OSTaskCreate(Task_B,); /創(chuàng)建任務(wù)B OSStart( ); ,信號(hào)量的應(yīng)用舉例1 - 主函數(shù)部分,西安郵電學(xué)院 計(jì)算機(jī)系,29,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量的操作 - 發(fā)送信號(hào)量,發(fā)送信號(hào)量也稱為釋放信號(hào)量。 釋放信號(hào)量系統(tǒng)函數(shù)的原型:,INT8U OSSemPost( OS_EVENT

24、* pevent/信號(hào)量指針指示釋放目標(biāo) ),操作:檢查是否還有等待該信號(hào)量的任務(wù),若有則OS_Sched( )調(diào)度優(yōu)先級(jí)最高的任務(wù)運(yùn)行,否則OSEventCnt+; 函數(shù)返回值解釋: OS_NO_ERR 釋放成功; OS_ERR_EVENT_TYPE 釋放的不是信號(hào)量事件; OS_SEM_OVF 信號(hào)量(個(gè)數(shù) 65535)溢出;,西安郵電學(xué)院 計(jì)算機(jī)系,30,2020/8/25,void Task_A(void *pdata) ; for (;)/任務(wù)體A OSSemPend(UART_Flag,0, / Task_A 延時(shí) nnnn 個(gè)時(shí)鐘節(jié)拍 ,信號(hào)量的應(yīng)用舉例1 - 任務(wù)部分,void

25、 Task_B(void *pdata) ; for (;)/任務(wù)體B OSSemPend(UART_Flag,0, / Task_B 延時(shí) mmm 個(gè)時(shí)鐘節(jié)拍 ,西安郵電學(xué)院 計(jì)算機(jī)系,31,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量的操作 - 請(qǐng)求信號(hào)量,請(qǐng)求信號(hào)量系統(tǒng)函數(shù)的原型:,void OSSemPend( OS_EVENT * pevent, /信號(hào)量指針指示申請(qǐng)目標(biāo) INT16U timeout, /等待限時(shí),OS Tick 數(shù) INT8U *err ); /函數(shù)執(zhí)行情況,備注:參數(shù) timeout 用于約定本任務(wù)等待申請(qǐng)信號(hào)量的時(shí)限,單位是Tick;當(dāng)?shù)却瑫r(shí)時(shí),本任務(wù)

26、被uC/OS-II直接轉(zhuǎn)入就續(xù)狀態(tài)。當(dāng)該參數(shù)為 0 時(shí),含義為無限時(shí)等待。通過查閱 *err 參數(shù)可知函數(shù)的執(zhí)行情況。,操作:如果信號(hào)量有效( ECB(Sem)-OSEventCnt 0),則OSEventCnt-,本任務(wù)goon;否則,將申請(qǐng)的事件的ECB-OSEventGrp及OSEventTbl 相應(yīng)位置1,本Task轉(zhuǎn)入Wait狀態(tài)并執(zhí)行OS_Sched( )。,西安郵電學(xué)院 計(jì)算機(jī)系,32,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量的操作 - 請(qǐng)求信號(hào)量,請(qǐng)求信號(hào)量系統(tǒng)函數(shù)的原型:,void OSSemPend( OS_EVENT * pevent,/信號(hào)量指針指示申請(qǐng)目標(biāo)

27、INT16U timeout,/等待限時(shí) INT8U *err );/函數(shù)執(zhí)行情況,函數(shù)返回值解釋: OS_NO_ERR 信號(hào)量申請(qǐng)成功; OS_ERR_EVENT_TYPE 申請(qǐng)的不是信號(hào)量事件; OS_ERR_EVENT_NULL 申請(qǐng)的信號(hào)量不存在; OS_ERR_PEND_ISR 不能在 ISR 中申請(qǐng)信號(hào)量; OS_TIMEOUT 申請(qǐng)信號(hào)量超時(shí)退出;,西安郵電學(xué)院 計(jì)算機(jī)系,33,2020/8/25,void Task_A(void *pdata) ; for (;)/任務(wù)體A OSSemPend(UART_Flag,0, / Task_A 延時(shí) nnnn 個(gè)時(shí)鐘節(jié)拍 ,信號(hào)量的應(yīng)

28、用舉例1 - 任務(wù)部分,void Task_B(void *pdata) ; for (;)/任務(wù)體B OSSemPend(UART_Flag,0, / Task_B 延時(shí) mmm 個(gè)時(shí)鐘節(jié)拍 ,西安郵電學(xué)院 計(jì)算機(jī)系,34,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量的操作 - 無等待請(qǐng)求信號(hào)量,無等待請(qǐng)求信號(hào)量系統(tǒng)函數(shù)的原型:,INT16U OSSemAccept( OS_EVENT * pevent,/信號(hào)量指針指示申請(qǐng)目標(biāo) );,該函數(shù)無等待地申請(qǐng)指定的信號(hào)量。 函數(shù)返回值解釋: 0 信號(hào)量申請(qǐng)成功; 0 信號(hào)量申請(qǐng)不成功;,西安郵電學(xué)院 計(jì)算機(jī)系,35,2020/8/25,4.

29、2 信號(hào)量及其操作,信號(hào)量的操作 - 刪除信號(hào)量,刪除信號(hào)量系統(tǒng)函數(shù)的原型:,OS_EVENT * OSSemDel( OS_EVENT * pevent,/信號(hào)量指針指示刪除目標(biāo) INT8U opt,/刪除條件、方式 INT8U *err );/函數(shù)執(zhí)行情況,備注: (信號(hào)量不能在ISR中刪除) 1、刪除系統(tǒng)不再使用的信號(hào)量,歸還事件資源; 2、參數(shù)opt 用于約定刪除信號(hào)量的條件,其可有兩個(gè)取值:,OS_DEL_NO_PEND - 若事件無等待任務(wù)時(shí),刪除該事件且*err = OS_NO_ERR;否則直接返回,且 *err = OS_ERR_TASK_WAITING; OS_DEL_ALL

30、WAYS - 直接刪除,且 *err = OS_NO_ERR ; 錯(cuò)誤的 opt 參數(shù)時(shí),*err = OS_ERR_INVALID_OPT;,西安郵電學(xué)院 計(jì)算機(jī)系,36,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量的操作 - 查詢信號(hào)量的狀態(tài),查詢信號(hào)量系統(tǒng)函數(shù)的原型:,INT8U OSSemQuery( OS_EVENT * pevent,/信號(hào)量指針指示申請(qǐng)目標(biāo) OS_SEM_DATA *pdata ); /信號(hào)量查詢結(jié)果數(shù)據(jù)結(jié)構(gòu)指針,Typedef struct INT16U OSCnt; INT8U OSEventTblOS_EVENT_TBL_SIZE; INT8U OSE

31、ventGrp; OS_SEM_DATA;,備注:(該數(shù)據(jù)類型在 uCOS_II.H文件中定義) OS_NO_ERR 信號(hào)量查詢成功; 在使用該函數(shù)前要先定義一個(gè)OS_SEM_DATA類型的變量;,西安郵電學(xué)院 計(jì)算機(jī)系,37,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量的應(yīng)用舉例1,某系統(tǒng)中有 Task_A、Task_B 兩個(gè)任務(wù)都要使用公共資源(例如UART),他們可以分別使用,但不能同時(shí)使用。 可用信號(hào)量的方法解決此問題。,西安郵電學(xué)院 計(jì)算機(jī)系,38,2020/8/25, OS_EVENT * UART_Flag; /聲明事件指針變量 INT8U err; /聲明全局狀態(tài)變量 v

32、oid main (void) OSInit(); UART_Flag = OSSemCreate(1); /創(chuàng)建信號(hào)量 OSTaskCreate(Task_A,); /創(chuàng)建任務(wù)A OSTaskCreate(Task_B,); /創(chuàng)建任務(wù)B OSStart(); ,信號(hào)量的應(yīng)用舉例1 - 主函數(shù)部分,西安郵電學(xué)院 計(jì)算機(jī)系,39,2020/8/25,void Task_A(void *pdata) ; for (;)/任務(wù)體A OSSemPend(UART_Flag,0, / Task_A 延時(shí) nnnn 個(gè)時(shí)鐘節(jié)拍 ,信號(hào)量的應(yīng)用舉例1 - 任務(wù)部分,void Task_B(void *pd

33、ata) ; for (;)/任務(wù)體B OSSemPend(UART_Flag,0, / Task_B 延時(shí) mmm 個(gè)時(shí)鐘節(jié)拍 ,西安郵電學(xué)院 計(jì)算機(jī)系,40,2020/8/25,4.2 信號(hào)量及其操作,信號(hào)量的應(yīng)用舉例2,某系統(tǒng)中有 Task_A、Task_B 兩個(gè)任務(wù),若想執(zhí)行Task_B,必須首先經(jīng)過Task_A。 可用信號(hào)量的方法,將Task_B作為Task_A的后續(xù)功能,解決此問題。,西安郵電學(xué)院 計(jì)算機(jī)系,41,2020/8/25, OS_EVENT * Task_Flag; /聲明信號(hào)量 void main (void) OSInit(); Task_Flag = OSSemC

34、reate(0); /創(chuàng)建信號(hào)量 OSTaskCreate(Task_A,); /創(chuàng)建任務(wù)A OSTaskCreate(Task_B,); /創(chuàng)建任務(wù)B OSStart(); ,信號(hào)量的應(yīng)用舉例2 - 主函數(shù)部分,西安郵電學(xué)院 計(jì)算機(jī)系,42,2020/8/25,void Task_A(void *pdata) ; for (;)/任務(wù)體A OSSemPost(Task_Flag); / 發(fā)送信號(hào)量Task_Flag ; / Task_A 業(yè)務(wù)功能代碼 OSTimeDly(nnnn); / Task_A 延時(shí) nnnn 個(gè)時(shí)鐘節(jié)拍 ,信號(hào)量的應(yīng)用舉例2 - 任務(wù)部分,void Task_B(v

35、oid *pdata) ; for (;)/任務(wù)體B OSSemPend(Task_Flag,0, / Task_B 延時(shí) mmm 個(gè)時(shí)鐘節(jié)拍*/ ,備注:Task_B 一直等待 Task_A 而運(yùn)行。,西安郵電學(xué)院 計(jì)算機(jī)系,43,2020/8/25,第4章 目錄,1、 任務(wù)間的同步和事件控制塊 2、 信號(hào)量及其操作 3、互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn) 4、消息郵箱及其操作 5、消息隊(duì)列及其操作,西安郵電學(xué)院 計(jì)算機(jī)系,44,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),所謂的互斥型信號(hào)量是一個(gè)二值信號(hào)量,簡(jiǎn)稱為 “信號(hào)” ,它是一種特殊的信號(hào)量,主要用于處理任務(wù)對(duì)共享資源獨(dú)占問題

36、。 使用互斥型信號(hào)量時(shí)要注意任務(wù)優(yōu)先級(jí)反轉(zhuǎn)的問題。,西安郵電學(xué)院 計(jì)算機(jī)系,45,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),任務(wù)優(yōu)先級(jí)的反轉(zhuǎn)現(xiàn)象,是指在剝奪式OS中,當(dāng)任務(wù)以獨(dú)占方式使用共享資源時(shí),低優(yōu)先級(jí)的任務(wù)可能先于高優(yōu)先級(jí)任務(wù)得到系統(tǒng)調(diào)度而運(yùn)行的現(xiàn)象。,西安郵電學(xué)院 計(jì)算機(jī)系,46,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),任務(wù)優(yōu)先級(jí)的反轉(zhuǎn)現(xiàn)象分析,造成的結(jié)果:Task_B 優(yōu)先于 Task_A 得到運(yùn)行。 問題的嚴(yán)重性:如果Task_B之類的任務(wù)較多時(shí),甚至?xí)绊懴到y(tǒng)的設(shè)計(jì)目標(biāo)。 原因:低優(yōu)先級(jí)的任務(wù)獨(dú)占共享資源,迫使高優(yōu)先級(jí)任務(wù)因等待資源而讓出CPU。

37、 解決辦法:暫時(shí)提升獲得共享資源任務(wù)的優(yōu)先級(jí)別,盡快釋放共享資源,之后再恢復(fù)其原有的優(yōu)先級(jí)別。,備注:決定任務(wù)得到運(yùn)行的條件不僅僅是優(yōu)先級(jí),還有任務(wù)所需的資源。,西安郵電學(xué)院 計(jì)算機(jī)系,47,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),互斥型信號(hào)量(Mutex),互斥型信號(hào)量是一個(gè)二值信號(hào)量,是一種處理“任務(wù)優(yōu)先級(jí)反轉(zhuǎn)”現(xiàn)象的特殊信號(hào)量,主要用于處理任務(wù)對(duì)共享資源獨(dú)占問題。為此,“事件” 數(shù)據(jù)結(jié)構(gòu)上有一些特約: 將OSEventCnt拆為了高8位(prio事件優(yōu)先級(jí))和低8位(資源標(biāo)志)兩個(gè)成員。,西安郵電學(xué)院 計(jì)算機(jī)系,48,2020/8/25,4.1 任務(wù)間的同步和事件控制塊

38、-(臨時(shí)參考),事件控制塊(ECB),uC/OS-II 使用ECB的數(shù)據(jù)結(jié)構(gòu)統(tǒng)一描述三類事件(信號(hào)量、消息郵箱、消息隊(duì)列)。 uC/OS-II 中的ECB數(shù)據(jù)結(jié)構(gòu)如下:,typedef struct INT8U OSEventType;/事件類型 INT16U OSEventCnt;/計(jì)數(shù)信號(hào)量的計(jì)數(shù)器 void * OSEventPtr;/消息(消息隊(duì)列)指針 INT8U OSEventGrp;/等待事件的任務(wù)組 INT8U OSEventTblOS_EVENT_TBL_SIZE; /任務(wù)等待表 OS_EVENT;,西安郵電學(xué)院 計(jì)算機(jī)系,49,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)

39、優(yōu)先級(jí)反轉(zhuǎn),創(chuàng)建互斥型信號(hào)量,調(diào)用系統(tǒng)函數(shù)OSMutexCreate( )創(chuàng)建互斥型信號(hào)量,其原型如下:,OS_EVENT * OSMutexCreate( INT8U prio,/信號(hào)量?jī)?yōu)先級(jí)別 INT8U *err/函數(shù)結(jié)果狀態(tài)信息 );,函數(shù)操作說明:該函數(shù)從空事件控制塊隊(duì)列(OSEventFreeList)獲得一個(gè)ECB,并將其初始化(初始化后的數(shù)據(jù)情況見前頁插圖);用戶查看 *err 可知道本函數(shù)的執(zhí)行結(jié)果(OS_NO_ERR);用戶通過本函數(shù)返回的事件指針來使用該 “信號(hào)” 。,西安郵電學(xué)院 計(jì)算機(jī)系,50,2020/8/25,4.2 信號(hào)量及其操作-(臨時(shí)參考),信號(hào)量的操作 -

40、 創(chuàng)建信號(hào)量,信號(hào)量操作系統(tǒng)函數(shù)定義在 OS_SEM.C 文件。 在使用信號(hào)量之前,必須創(chuàng)建信號(hào)量。 創(chuàng)建信號(hào)量系統(tǒng)函數(shù)的原型:,OS_EVENT * OSSemCreate( INT16U cnt/信號(hào)量計(jì)數(shù)初值 ),功能:從OSEventFreeList中申請(qǐng)一個(gè)ECB,并進(jìn)行初始化(用cnt初始化ECB(Sem)-OSEventCnt);返回一個(gè)已初始化的 ECB 的指針。,西安郵電學(xué)院 計(jì)算機(jī)系,51,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),創(chuàng)建互斥型信號(hào)量,調(diào)用系統(tǒng)函數(shù)OSMutexCreate( )創(chuàng)建互斥型信號(hào)量注意事項(xiàng):,1、不支持在ISR中創(chuàng)建互斥信號(hào)量;否

41、則,創(chuàng)建失敗且返回出錯(cuò)信息 *err = OS_ERR_CREATE_ISR 2、指定的互斥信號(hào)量?jī)?yōu)先級(jí)不能與其它任務(wù)沖突;否則,創(chuàng)建失敗且返回出錯(cuò)信息 *err = OS_PRIO_EXIST 3、指定的優(yōu)先級(jí)要合法,否則,創(chuàng)建失敗且返回出錯(cuò)信息 *err = OS_PRIO_INVALID 4、如果信號(hào)量創(chuàng)建失敗,創(chuàng)建函數(shù)返回事件的指針為空(即 = Null) 5、正確創(chuàng)建了互斥信號(hào)量,函數(shù)返回一個(gè) ECB 指針,且 *err = OS_NO_ERR,西安郵電學(xué)院 計(jì)算機(jī)系,52,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),請(qǐng)求互斥型信號(hào)量,當(dāng)任務(wù)要訪問一個(gè)獨(dú)占共享資源時(shí),要

42、先調(diào)用系統(tǒng)函數(shù)OSMutexPend( )函數(shù)申請(qǐng)相應(yīng)的互斥信號(hào)量;其原型如下:,void OSMutexPend( OS_EVENT * pevent ,/信號(hào)量指針 INT16U timeout,/等待時(shí)間 INT8U *err/函數(shù)結(jié)果狀態(tài)信息 );,西安郵電學(xué)院 計(jì)算機(jī)系,53,2020/8/25,4.2 信號(hào)量及其操作-(臨時(shí)參考),信號(hào)量的操作 - 請(qǐng)求信號(hào)量,請(qǐng)求信號(hào)量系統(tǒng)函數(shù)的原型:,void OSSemPend( OS_EVENT * pevent, /信號(hào)量指針指示申請(qǐng)目標(biāo) INT16U timeout, /等待限時(shí),OS Tick 數(shù) INT8U *err ); /函數(shù)執(zhí)

43、行情況,備注:參數(shù) timeout 用于約定本任務(wù)等待申請(qǐng)信號(hào)量的時(shí)限,單位是Tick;當(dāng)?shù)却瑫r(shí)時(shí),本任務(wù)被uC/OS-II直接轉(zhuǎn)入就續(xù)狀態(tài)。當(dāng)該參數(shù)為 0 時(shí),含義為無限時(shí)等待。通過查閱 *err 參數(shù)可知函數(shù)的執(zhí)行情況。,操作:如果信號(hào)量有效( ECB(Sem)-OSEventCnt 0),則OSEventCnt-,本任務(wù)goon;否則,將申請(qǐng)的事件的ECB-OSEventGrp及OSEventTbl 相應(yīng)位置1,本Task轉(zhuǎn)入Wait狀態(tài)并執(zhí)行OS_Sched( )。,西安郵電學(xué)院 計(jì)算機(jī)系,54,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),請(qǐng)求互斥型信號(hào)量,調(diào)用系統(tǒng)函數(shù)

44、OSMutexPend( )申請(qǐng)互斥型信號(hào)量注意事項(xiàng):,1、不支持在ISR中申請(qǐng)互斥信號(hào)量;否則,申請(qǐng)失敗且返回出錯(cuò)信息 *err = OS_ERR_PEND_ISR 2、申請(qǐng)的互斥信號(hào)量必須存在;否則,申請(qǐng)失敗且返回出錯(cuò)信息 *err = OS_ERR_PEVENT_NULL 3、指定的事件要是互斥信號(hào)量,否則,申請(qǐng)失敗且返回出錯(cuò)信息 *err = OS_ERR_EVENT_TYPE 4、申請(qǐng)到了互斥信號(hào)量,*err = OS_NO_ERR 5、如果信號(hào)量未申請(qǐng)到,本任務(wù)則進(jìn)入 “等待” 狀態(tài)。,西安郵電學(xué)院 計(jì)算機(jī)系,55,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),發(fā)送互斥

45、型信號(hào)量,調(diào)用系統(tǒng)函數(shù)OSMutexPost( )發(fā)送(釋放)互斥型信號(hào)量,其原型如下:,INT8U OSMutexPost( OS_EVENT * pevent /信號(hào)量指針 );,西安郵電學(xué)院 計(jì)算機(jī)系,56,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),發(fā)送互斥型信號(hào)量,調(diào)用系統(tǒng)函數(shù)OSMutexPost( )釋放互斥型信號(hào)量注意事項(xiàng):,1、不支持在ISR中釋放互斥信號(hào)量;否則釋放失敗且函數(shù)返回OS_ERR_POST_ISR 2、釋放的互斥信號(hào)量必須存在;否則釋放失敗且函數(shù)返回OS_ERR_PEVENT_NULL 3、釋放的事件要是互斥信號(hào)量,否則釋放失敗且函數(shù)返回OS_ER

46、R_EVENT_TYPE 4、只能釋放自己的信號(hào),否則釋放失敗且函數(shù)返回OS_ERR_NOT_MUTEX_OWNER 5、正確釋放了互斥信號(hào)量,函數(shù)返回 OS_NO_ERR,西安郵電學(xué)院 計(jì)算機(jī)系,57,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),刪除互斥型信號(hào)量,可以調(diào)用系統(tǒng)函數(shù)OSMutexDel( )函數(shù)刪除不再使用的互斥信號(hào)量;其原型如下:,OS_EVENT * OSMutexDel( OS_EVENT * pevent ,/信號(hào)量指針 INT8U opt,/刪除方式選項(xiàng) INT8U *err/函數(shù)結(jié)果狀態(tài)信息 );,備注:函數(shù)返回刪除事件的 “事件指針” ;當(dāng)刪除一個(gè)不

47、存在的事件時(shí),返回 Null 。,西安郵電學(xué)院 計(jì)算機(jī)系,58,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),刪除互斥型信號(hào)量,系統(tǒng)函數(shù)OSMutexDel( )刪除互斥型信號(hào)量注意事項(xiàng):,1、opt 參數(shù)含義:,2、返回信息 *err 的含義:,OS_NO_ERR Mutex刪除成功; OS_ERR_DEL_ISR 不允許在ISR中進(jìn)行刪除 OS_ERR_INVALID_OPT 刪除方式參數(shù)非法 OS_ERR_TASK_WAITING 還有等待該信號(hào)的任務(wù) OS_ERR_EVENT_TYPE 指定的事件不是Mutex OS_ERR_PEVENT_NULL 事件指針為空了,OS_D

48、EL_NO_PEND - 無申請(qǐng)等待任務(wù)時(shí)方刪除。 OS_DEL_ALWAYS - 無條件直接刪除,所有的等待任務(wù)皆轉(zhuǎn) 入到ready 狀態(tài)。,西安郵電學(xué)院 計(jì)算機(jī)系,59,2020/8/25,4.3 互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn),互斥型信號(hào)量應(yīng)用舉例,某系統(tǒng)中有 Task_A、Task_B 兩個(gè)任務(wù)都要使用公共資源(例如UART),他們可以分別使用,但不能同時(shí)使用;Task_A、Task_B 兩任務(wù)的優(yōu)先級(jí)之間還存在許多中間優(yōu)先級(jí)的任務(wù);例如:Prio(Task_A) = 3 , Prio(Task_B) = 20 , 優(yōu)先級(jí)在 3,20 之間還存在5個(gè)任務(wù) Task_1,Task_2,Ta

49、sk_5,有可能引起優(yōu)先級(jí)反轉(zhuǎn)。 使用互斥信號(hào)量的方法解決此問題。,西安郵電學(xué)院 計(jì)算機(jī)系,60,2020/8/25, OS_EVENT * UART_Flag; /聲明信號(hào)量 INT8U err; /聲明全局狀態(tài)變量 void main (void) OSInit(); UART_Flag = OSMutexCreate(2, ,互斥信號(hào)量的應(yīng)用舉例 - 主函數(shù)部分,西安郵電學(xué)院 計(jì)算機(jī)系,61,2020/8/25,void Task_A(void *pdata) ; for (;)/任務(wù)體A OSMutexPend(UART_Flag,0, / Task_A 延時(shí) nnnn 個(gè)時(shí)鐘節(jié)拍 ,

50、互斥信號(hào)量的應(yīng)用舉例 - 任務(wù)部分,void Task_B(void *pdata) ; for (;)/任務(wù)體B OSMutexPend(UART_Flag,0, / Task_B 延時(shí) mmm 個(gè)時(shí)鐘節(jié)拍 ,西安郵電學(xué)院 計(jì)算機(jī)系,62,2020/8/25,第4章 目錄,1、 任務(wù)間的同步和事件控制塊 2、 信號(hào)量及其操作 3、互斥型信號(hào)量和任務(wù)優(yōu)先級(jí)反轉(zhuǎn) 4、消息郵箱及其操作 5、消息隊(duì)列及其操作,西安郵電學(xué)院 計(jì)算機(jī)系,63,2020/8/25,4.4 消息郵箱及其操作,消息郵箱(Mbox),它的主要功能就是用于在任務(wù)間傳遞一個(gè)數(shù)據(jù);還要為操作系統(tǒng)管理事件和任務(wù)提供一些參數(shù)。結(jié)構(gòu)如下:

51、,消息郵箱使用傳遞變量指針的手段在任務(wù)之間進(jìn)行通信。,西安郵電學(xué)院 計(jì)算機(jī)系,64,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的操作 - 創(chuàng)建消息郵箱,可以調(diào)用系統(tǒng)函數(shù)OSMboxCreate( )函數(shù)創(chuàng)建消息郵箱;其原型如下:,OS_EVENT * OSMboxCreate( void * msg/ 消息指針 );,備注: 1、形參 msg 是一個(gè)要在任務(wù)間傳遞的變量指針; 2、當(dāng)創(chuàng)建消息郵箱成功時(shí),返回消息郵箱指針; 3、消息郵箱創(chuàng)建失敗時(shí),返回一個(gè) Null 。,西安郵電學(xué)院 計(jì)算機(jī)系,65,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的操作 - 向消息郵箱發(fā)送消息

52、,可以調(diào)用系統(tǒng)函數(shù)OSMboxPost( )函數(shù)向消息郵箱發(fā)送消息;其原型如下:,INT8U OSMboxPost( OS_EVENT * pevent,/消息郵箱指針 void * msg/ 消息指針 );,備注: 1、形參 msg 是一個(gè)要在任務(wù)間傳遞的變量指針; 2、形參 pevent 是消息郵箱指針;,西安郵電學(xué)院 計(jì)算機(jī)系,66,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的操作 - 向消息郵箱發(fā)送消息,向消息郵箱發(fā)送消息系統(tǒng)函數(shù)OSMboxPost( )返回值含義:,1、OS_NO_ERR - 消息發(fā)送成功; 2、 OS_MBOX_FULL - 不能向滿郵箱在發(fā)送消息;

53、3、OS_ERR_EVENT_TYPE - 指定的事件不是消息郵箱類型; 4、OS_ERR_PEVENT_NULL - 不能向不存在的消息郵箱發(fā)送消息; 5、OS_ERR_POST_NULL_PTR - 消息緩沖區(qū)不能為空;,西安郵電學(xué)院 計(jì)算機(jī)系,67,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的操作 - 請(qǐng)求消息郵箱,void *OSMboxPend ( OS_EVENT *pevent, /消息郵箱指針 INT16U timeout,/等待時(shí)限 INT8U *err /函數(shù)執(zhí)行信息 );,所謂的 “請(qǐng)求消息郵箱” 就是等待一個(gè)消息傳送到消息郵箱,或取得一個(gè)消息數(shù)據(jù)。請(qǐng)求消息郵

54、箱函數(shù)原型:,當(dāng)返回值 != Null 時(shí),返回值就是一個(gè)預(yù)期消息的指針; 當(dāng)返回值 =Null 時(shí),意味著未得到消息,此時(shí)uC/OS-II執(zhí)行OS_Sched();可能消息未準(zhǔn)備好,或指示的事件出錯(cuò)、超時(shí)等,此時(shí)函數(shù)直接返回,用戶應(yīng)查閱 *err的狀態(tài)。,西安郵電學(xué)院 計(jì)算機(jī)系,68,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的操作 - 請(qǐng)求消息郵箱,err 是本函數(shù)執(zhí)行狀態(tài)的返回值,*err 的值含義:,OS_NO_ERR - 請(qǐng)求成功,得到目標(biāo)數(shù)據(jù); OS_TIMEOUT - 超時(shí),未得到目標(biāo)數(shù)據(jù); OS_ERR_EVENT_TYPE - 無效的事件類型; OS_ERR_PE

55、ND_ISR - 不支持ISR中的消息郵箱請(qǐng)求; OS_ERR_PEVENT_NULL - 指定的事件為空(不存在);,西安郵電學(xué)院 計(jì)算機(jī)系,69,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的操作 - 刪除消息郵箱,對(duì)一個(gè)不再使用的消息郵箱要及時(shí)刪除以釋放資源。其函數(shù)原型為:,函數(shù)參數(shù)說明: 1、opt = OS_DEL_NO_PEND 如果沒有等待任務(wù)時(shí)刪除郵箱; 2、opt = OS_DEL_ALWAYS 無條件刪除又向,所有等待該事件的任務(wù)急轉(zhuǎn)到就緒狀態(tài);,OS_EVENT *OSMboxDel( OS_EVENT *pevent, /消息郵箱指針 INT8U opt,/刪

56、除方式選項(xiàng) INT8U *err /函數(shù)執(zhí)行信息 );,西安郵電學(xué)院 計(jì)算機(jī)系,70,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的操作 - 刪除消息郵箱,err 是本函數(shù)執(zhí)行狀態(tài)的返回值,*err 的值含義:,OS_NO_ERR - 函數(shù)成功,指定的郵箱被刪除; OS_INVALID_OPT - 刪除方式數(shù)據(jù)錯(cuò); OS_ERR_EVENT_TYPE - 欲刪除的事件類型不是郵箱; OS_ERR_DEL_ISR - 不支持ISR中的消息郵箱刪除操作; OS_ERR_PEVENT_NULL - 指定的事件為空(不存在); OS_ERR_TASK_WAITING - 郵箱中還有等待任務(wù);,西安郵電學(xué)院 計(jì)算機(jī)系,71,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的操作 - 查詢消息郵箱(略),西安郵電學(xué)院 計(jì)算機(jī)系,72,2020/8/25,4.4 消息郵箱及其操作,消息郵箱的應(yīng)用舉例,某應(yīng)用系統(tǒng)含有 “數(shù)據(jù)采集” 任務(wù) Task_A 和 “數(shù)據(jù)處理” 任務(wù) Task_B ;Task_A 周期性的定時(shí)采集數(shù)據(jù),用消息郵箱的方式將數(shù)據(jù)傳送到Task_B處理。,西安郵電學(xué)院 計(jì)算機(jī)系,73,2020/8/25,消息郵箱的應(yīng)用舉例,INT16U zql_data;/存放AD轉(zhuǎn)換后的數(shù)據(jù) OS_EVENT * Dt_box;/消息郵箱指針 void main(void

溫馨提示

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

評(píng)論

0/150

提交評(píng)論