久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

各種通信機(jī)制使用舉例

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年08月18日   【字體:

 1:當(dāng)緩沖區(qū)滿,寫操作的任務(wù)加入到對應(yīng)的等待隊(duì)列中去,通過相關(guān)的信號量等的通信喚醒機(jī)制讓寫操作在緩沖區(qū)有空間時(shí)寫入,將寫-滿-等待-喚醒-再寫

linux內(nèi)核的 等待隊(duì)列 使用方法,wait_queue_head_t,進(jìn)程休眠 (2011-11-28 09:29:44)轉(zhuǎn)載▼
標(biāo)簽: linux內(nèi)核驅(qū)動(dòng) 雜談 分類: LINUX內(nèi)核
當(dāng)你在用戶空間需要讀寫一大片數(shù)據(jù)的時(shí)候,這個(gè)就用上了。
 
 
 
假設(shè)我們在 kernel 里產(chǎn)生一個(gè) buffer,user 可以經(jīng)由 read,write 等 system call 來讀取或?qū)戀Y料到這個(gè) buffer 里。如果有一個(gè) user 寫資料到 buffer 時(shí),此時(shí) buffer 已經(jīng)滿了。那請問你要如何去處理這種情形呢 ? 第一種,傳給 user 一個(gè)錯(cuò)誤訊息,說 buffer 已經(jīng)滿了,不能再寫入。第二種,將 user 的要求 block 住, 等有人將 buffer 內(nèi)容讀走,留出空位時(shí),再讓 user 寫入資料。但問題來了,你要怎么將 user 的要求 block 住。難道你要用
while ( is_full );
write_to_buffer;
這 樣的程序代碼嗎? 想想看,如果你這樣做會(huì)發(fā)生什么事? 第一,kernel會(huì)一直在這個(gè) while 里執(zhí)行。第二個(gè),如果 kernel 一直在這個(gè) while 里執(zhí)行,表示它沒有辦法去 maintain系統(tǒng)的運(yùn)作。那此時(shí)系統(tǒng)就相當(dāng)于當(dāng)?shù)袅恕T谶@里 is_full 是一個(gè)變量,當(dāng)然,你可以讓 is_full 是一個(gè) function,在這個(gè) function里會(huì)去做別的事讓 kernel 可以運(yùn)作,那系統(tǒng)就不會(huì)當(dāng)。這是一個(gè)方式。還有,你說可以在while里面把buffer里的內(nèi)容讀走,再把is_full的值改了,但是我們會(huì)可能把重 要的數(shù)據(jù)在我們不想被讀的時(shí)候被讀走了,那是比較麻煩的,而且很不靈活.如果我們使用 wait_queue 的話,那程序看起來會(huì)比較漂亮,而且也比較讓人了解,如下所示:
 
struct wait_queue_head_t wq;
DECLARE_WAIT_QUEUE_HEAD (wq);
 
while ( is_full ){
interruptible_sleep_on( &wq );
} write_to_buffer();
 
interruptible_sleep_on( &wq ) 是用來將目前的 process,也就是要求寫資料到buffer 的 process放到 wq 這個(gè) wait_queue 里。在 interruptible_sleep_on 里,則是最后會(huì)呼叫 schedule() 來做 schedule 的動(dòng)作,誰調(diào)用了schedule誰就趴下,讓別人去運(yùn)行,醒來就原地起來,執(zhí)行schedule()后的代碼。那那個(gè)調(diào)用了schedule的家伙什么 醒過來呢?這時(shí)候就需要用到另一個(gè)函數(shù)了wake_up_interruptible()了。
以下來自:http://tauruspdj.blog.163.com/blog/static/4312500620090794030998/
linux中最簡單的休眠方式是下面的宏,
wait_event(queue, condition)
wait_event_interruptible(queue, condition)
wait_event_timeout(queue, condition, timeout)
wait_event_interruptible_timeout(queue, condition, timeout)
queue是等待隊(duì)列頭,傳值方式
condition是任意一個(gè)布爾表達(dá)式,在休眠前后多次對condition求值,為真則喚醒
喚醒進(jìn)程的基本函數(shù)是wake_up
void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);
實(shí)踐中,一般是wait_event和 wake_up, wait_event_interruptible和 wake_up_interruptible 成對使用。
【補(bǔ)充】其實(shí)看了那么多,他們也沒有給個(gè)立即可用的步驟,寫blog嘛,就是分享心得。我基于2.6.24總結(jié)一下,希望對大家有幫助:
1、定義:wait_queue_head_t my_queue;
2、初始化 init_waitqueue_head(&my_queue);
3、在一個(gè)函數(shù)里面等待:wait_event(queue, condition) ;(別在中斷里面搞)
 
4、在另一個(gè)函數(shù)里面喚醒:wake_up(wait_queue_head_t *queue); (這個(gè)可以在中斷調(diào)用,去喚醒別的進(jìn)程,特別是dma操作類的)
 
有好幾個(gè)等待和喚醒函數(shù),大家可以慢慢試。
關(guān)閉窗口
主站蜘蛛池模板: 一区视频在线播放 | 久久爱黑人激情av摘花 | 国产精品亚洲综合 | 成人久久18免费网站麻豆 | 久在线视频播放免费视频 | 国产免费黄网 | 好姑娘影视在线观看高清 | 天天躁日日躁xxxxaaaa | 国产精品jizz在线观看老狼 | 亚洲一区二区三区视频 | 欧美一级特黄aaa大片在线观看 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 成人依人| 中文字幕日韩在线观看 | av黄色在线 | 啪啪网页 | 久久精品性视频 | 色一阁 | 欧美黄色绿像 | 国产精品一区在线观看你懂的 | 国产成人免费视频网站高清观看视频 | 色综合一区二区 | 久久国产婷婷国产香蕉 | 九九亚洲 | 在线亚洲电影 | 欧洲色| 国产精品成人一区二区三区吃奶 | 欧美性tv| 午夜www| 夜夜操天天干 | 黄色av网站在线观看 | 成人免费网视频 | 日韩视频在线免费观看 | 欧美日韩成人在线 | 97精品超碰一区二区三区 | 欧美精品一区二区免费 | 成人午夜视频在线观看 | 神马九九| 天天夜夜操 | 久色激情 | 亚洲 欧美 日韩在线 |