第10章 線程間通信_(tái)第1頁(yè)
第10章 線程間通信_(tái)第2頁(yè)
第10章 線程間通信_(tái)第3頁(yè)
第10章 線程間通信_(tái)第4頁(yè)
第10章 線程間通信_(tái)第5頁(yè)
已閱讀5頁(yè),還剩36頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

嵌入式系統(tǒng)原理及應(yīng)用第10章線程間通信1郵箱2消息隊(duì)列3信號(hào)45應(yīng)用實(shí)例課后作業(yè)6本章總結(jié)郵箱概念郵箱工作機(jī)制10.1郵箱郵箱管理方式郵箱應(yīng)用方法本節(jié)小結(jié)10.1.1郵箱概念線程間同步用于解決線程執(zhí)行順序的問(wèn)題,線程間通信主要用于線程間信息傳遞,同時(shí)能夠改變線程執(zhí)行順序。線程間通信的方式有郵箱、消息隊(duì)列和信號(hào)。10.1.1郵箱概念郵箱是一種線程間通信方法,開(kāi)銷較低,效率較高,郵箱中的每一封郵件只能容納固定的4字節(jié)內(nèi)容(針對(duì)32位處理系統(tǒng),指針的大小即為4個(gè)字節(jié),一封郵件恰好能容納一個(gè)指針)。線程1:按鍵狀態(tài)線程2:溫度信息線程3:執(zhí)行操作郵箱sendsendrec10.1.2郵箱工作機(jī)制發(fā)送線程或中斷服務(wù)例程把一封4字節(jié)長(zhǎng)度的郵件發(fā)送到郵箱中,一個(gè)或多個(gè)線程從郵箱中接收郵件并處理。10.1.2郵箱工作機(jī)制郵箱控制塊是操作系統(tǒng)用于管理郵箱的一個(gè)數(shù)據(jù)結(jié)構(gòu),由結(jié)構(gòu)體structrt_mailbox表示。rt_mailbox_t表示郵箱句柄,即指向郵箱控制塊的指針。rt_mailbox繼承rt_ipc_object,由IPC容器管理,郵箱容量的最大值是65535。10.1.3郵箱管理方式10.1.3郵箱管理方式1.創(chuàng)建和刪除郵箱名稱創(chuàng)建郵箱函數(shù)原型rt_mailbox_trt_mb_create(constchar*name,rt_size_tsize,rt_uint8_tflag)參數(shù)1name:郵箱名稱參數(shù)2value:郵箱容量參數(shù)3flag:郵箱標(biāo)志,可取RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO返回值成功返回郵箱句柄,失敗返回RT_NULL名稱刪除郵箱函數(shù)原型rt_err_trt_mb_delete(rt_mailbox_tmb)參數(shù)mb:郵箱句柄返回值成功返回RT_EOK10.1.3郵箱管理方式2.發(fā)送和接收郵件名稱發(fā)送郵件函數(shù)原型rt_err_trt_mb_send(rt_mailbox_tmb,rt_ubase_tvalue)參數(shù)1mb:郵箱句柄參數(shù)2value:郵件內(nèi)容,可以是一個(gè)整型值或一個(gè)指向緩沖區(qū)的指針?lè)祷刂党晒Ψ祷豏T_EOK,失敗返回-RT_EFULL(郵箱已滿)名稱接收郵件函數(shù)原型rt_err_trt_mb_recv(rt_mailbox_tmb,rt_ubase_t*value,rt_int32_ttimeout)參數(shù)1mb:郵箱句柄參數(shù)2value:接收緩沖參數(shù)3timeout:線程等待時(shí)間,可填具體數(shù)值或RT_WAITING_FOREVER(永久等待)返回值成功獲取郵箱返回RT_EOK,超時(shí)未獲得郵件返回-RT_ETIMEOUT,其它錯(cuò)誤返回-RT_ERROR10.1.4郵箱應(yīng)用方法郵箱的應(yīng)用有固定的步驟,以動(dòng)態(tài)郵箱為例,包括如下4個(gè)步驟:(1)定義郵箱句柄:rt_mb_tdmb=RT_NULL;(2)主線程創(chuàng)建郵箱:dmb=rt_mb_create("dmb",10,RT_IPC_FLAG_FIFO);(3)線程1#X發(fā)送郵件:rt_mb_send(dmb,(rt_ubase_t)value);(4)線程2#Y接收郵件:rt_mb_recv(dmb,(rt_ubase_t*)&value,RT_WAITING_FOREVER);10.1.4郵箱應(yīng)用方法注意:1.郵箱句柄應(yīng)定義為全局變量;2.郵箱應(yīng)在線程啟動(dòng)前創(chuàng)建;3.發(fā)送和接收郵件時(shí)應(yīng)對(duì)郵件內(nèi)容進(jìn)行強(qiáng)制類型轉(zhuǎn)換。本節(jié)小結(jié)理解郵箱的概念和工作機(jī)制;掌握郵箱應(yīng)用方法。消息隊(duì)列概念消息隊(duì)列工作機(jī)制10.2消息隊(duì)列消息隊(duì)列管理方式消息隊(duì)列應(yīng)用方法本節(jié)小結(jié)10.2.1消息隊(duì)列概念消息隊(duì)列是郵箱的擴(kuò)展,能夠接收來(lái)自線程或中斷服務(wù)例程中不固定長(zhǎng)度的消息,并把消息緩存在自己的內(nèi)存空間中。其他線程也能夠從消息隊(duì)列中讀取相應(yīng)的消息,而當(dāng)消息隊(duì)列是空的時(shí)候,可以掛起讀取線程。當(dāng)有新的消息到達(dá)時(shí),掛起的線程將被喚醒以接收并處理消息。10.2.2消息隊(duì)列工作機(jī)制每個(gè)消息隊(duì)列中包含多個(gè)消息框,每個(gè)消息框可以存放一條消息;消息隊(duì)列中的第一個(gè)和最后一個(gè)消息框被分別稱為消息鏈表頭和消息鏈表尾。所有消息隊(duì)列中的消息框總數(shù)即是消息隊(duì)列的長(zhǎng)度,這個(gè)長(zhǎng)度可在消息隊(duì)列創(chuàng)建時(shí)指定。消息隊(duì)列控制塊是操作系統(tǒng)用于管理消息隊(duì)列的一個(gè)數(shù)據(jù)結(jié)構(gòu),由結(jié)構(gòu)體structrt_messagequeue表示。rt_mq_t表示消息隊(duì)列句柄,即指向消息隊(duì)列控制塊的指針。rt_messagequeue繼承rt_ipc_object,由IPC容器管理。10.2.2消息隊(duì)列工作機(jī)制10.2.3消息隊(duì)列管理方式1.創(chuàng)建和刪除消息隊(duì)列10.2.3消息隊(duì)列管理方式名稱創(chuàng)建消息隊(duì)列函數(shù)原型rt_mq_trt_mq_create(constchar*name,rt_size_tmsg_size,rt_size_tmax_msgs,rt_uint8_tflag)參數(shù)1name:消息隊(duì)列名稱參數(shù)2msg_size:消息隊(duì)列中一條消息的最大長(zhǎng)度,單位字節(jié)參數(shù)3max_msgs:消息隊(duì)列中最大消息個(gè)數(shù)參數(shù)4flag:消息隊(duì)列標(biāo)志,可取RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO返回值成功返回消息隊(duì)列句柄,失敗返回RT_NULL名稱刪除消息隊(duì)列函數(shù)原型rt_err_trt_mq_delete(rt_mq_tmq)參數(shù)mq:消息隊(duì)列句柄返回值成功返回RT_EOK2.發(fā)送消息rt_err_trt_mq_send_wait(rt_mq_tmq,

const

void*buffer,rt_size_tsize,rt_int32_ttimeout);rt_err_trt_mq_urgent(rt_mq_tmq,

void*buffer,rt_size_tsize);10.2.3消息隊(duì)列管理方式名稱發(fā)送消息函數(shù)原型rt_err_trt_mq_send(rt_mq_tmq,constvoid*buffer,rt_size_tsize)參數(shù)1mq:消息隊(duì)列句柄參數(shù)2buffer:消息內(nèi)容參數(shù)3size:消息大小返回值成功返回RT_EOK,失敗返回-RT_EFULL(消息隊(duì)列已滿)3.接收消息10.2.3消息隊(duì)列管理方式名稱接收消息函數(shù)原型rt_err_trt_mq_recv(rt_mq_tmq,void*buffer,rt_size_tsize,rt_int32_ttimeout)參數(shù)1mq:消息隊(duì)列句柄參數(shù)2buffer:接收緩沖參數(shù)3size:消息大小參數(shù)4timeout:線程等待時(shí)間,可填具體數(shù)值或RT_WAITING_FOREVER(永久等待)返回值成功獲取消息隊(duì)列返回RT_EOK,超時(shí)未獲得消息返回-RT_ETIMEOUT,其它錯(cuò)誤返回-RT_ERROR10.2.4消息隊(duì)列應(yīng)用方法消息隊(duì)列的應(yīng)用有固定的步驟,以動(dòng)態(tài)消息隊(duì)列為例,包括如下4個(gè)步驟:(1)定義消息隊(duì)列句柄:rt_mq_tdmq=RT_NULL;(2)主線程創(chuàng)建消息隊(duì)列:dmq=rt_mq_create("dmq",100,10,RT_IPC_FLAG_FIFO);(3)1#線程發(fā)送消息:rt_mq_send(dmq,&b,sizeof(b));(4)2#線程接收消息:rt_mq_recv(dmq,&b,sizeof(b),RT_WAITING_FOREVER);10.2.4消息隊(duì)列應(yīng)用方法注意:1.消息隊(duì)列句柄應(yīng)定義為全局變量;2.消息隊(duì)列應(yīng)在線程啟動(dòng)前創(chuàng)建;3.發(fā)送和接收消息的類型和大小應(yīng)保持一致,并且以地址形式發(fā)送和接收。本節(jié)小結(jié)理解消息隊(duì)列的概念和工作機(jī)制;掌握消息隊(duì)列應(yīng)用方法。信號(hào)概念信號(hào)工作機(jī)制10.3信號(hào)信號(hào)管理方式信號(hào)應(yīng)用方法本節(jié)小結(jié)10.3.1信號(hào)概念信號(hào)(又稱為軟中斷信號(hào)),在軟件層次上是對(duì)中斷機(jī)制的一種模擬,用來(lái)通知線程發(fā)生了異步事件,用做線程之間的異常通知、應(yīng)急處理。在原理上,一個(gè)線程收到一個(gè)信號(hào)與處理器收到一個(gè)中斷請(qǐng)求可以說(shuō)是類似的。信號(hào)本質(zhì)是軟中斷,線程不必通過(guò)任何操作來(lái)等待信號(hào)的到達(dá),事實(shí)上,線程也不知道信號(hào)到底什么時(shí)候到達(dá),線程之間可以互相通過(guò)調(diào)用rt_thread_kill()發(fā)送軟中斷信號(hào)。10.3.2信號(hào)工作機(jī)制假設(shè)線程1#需要對(duì)信號(hào)進(jìn)行處理。首先,線程1要執(zhí)行三個(gè)操作:安裝信號(hào)(類似硬件中工作方式設(shè)置為中斷模式)、解除阻塞(類似開(kāi)中斷)和設(shè)置異常處理方式(類似中斷服務(wù))。然后,線程2#可以給線程1發(fā)送信號(hào)(類似產(chǎn)生中斷),觸發(fā)線程1對(duì)該信號(hào)的處理。處理方式處理方法說(shuō)明方式一指定處理函數(shù)類似中斷服務(wù)程序方式二忽略信號(hào)(SIG_IGN)對(duì)該信號(hào)不做任何處理,就像未發(fā)生過(guò)一樣方式三系統(tǒng)默認(rèn)值(SIG_DFL)直接返回,什么都不做,與方式二相同。10.3.3信號(hào)管理方式1.安裝信號(hào)10.3.3信號(hào)管理方式名稱創(chuàng)建事件集函數(shù)原型rt_sighandler_trt_signal_install(intsigno,rt_sighandler_thandler)參數(shù)1signo:信號(hào)值,只可選SIGUSR1或SIGUSR2參數(shù)2handler:設(shè)置對(duì)信號(hào)值的處理方式,可為自定義函數(shù)、SIG_IGN或SIG_DFL返回值成功handler,失敗返回SIG_ERR2.解除阻塞信號(hào)名稱解除阻塞函數(shù)原型voidrt_signal_unmask(intsigno)參數(shù)signo:信號(hào)值,只可選SIGUSR1或SIGUSR2返回值無(wú)3.發(fā)送信號(hào)10.3.3信號(hào)管理方式名稱發(fā)送信號(hào)函數(shù)原型intrt_thread_kill(rt_thread_ttid,intsig)參數(shù)1tid:接收信號(hào)的線程句柄參數(shù)2sig:信號(hào)值,只可選SIGUSR1或SIGUSR2,需與接收信號(hào)線程安裝的信號(hào)值一致返回值成功返回RT_EOK,錯(cuò)誤返回-RT_EINVAL10.3.4信號(hào)應(yīng)用方法信號(hào)的應(yīng)用包括如下5個(gè)步驟:(1)在RT-ThreadSettings中使能信號(hào)(默認(rèn)不使能);(2)線程1#安裝信號(hào):rt_signal_install(SIGUSR1,thread1_signal_handler);(3)線程1#解除信號(hào)阻塞:rt_signal_unmask(SIGUSR1);(4)編寫信號(hào)處理函數(shù):voidtid1_signal_handler(intsig)(5)線程2#發(fā)送信號(hào):rt_thread_kill(tid1,SIGUSR1);10.3.4信號(hào)應(yīng)用方法本節(jié)小結(jié)理解信號(hào)的概念和工作機(jī)制;掌

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論