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

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

各種通信機制使用舉例

作者:佚名   來源:本站原創   點擊數:  更新時間:2014年08月18日   【字體:

 1:當緩沖區滿,寫操作的任務加入到對應的等待隊列中去,通過相關的信號量等的通信喚醒機制讓寫操作在緩沖區有空間時寫入,將寫-滿-等待-喚醒-再寫

linux內核的 等待隊列 使用方法,wait_queue_head_t,進程休眠 (2011-11-28 09:29:44)轉載▼
標簽: linux內核驅動 雜談 分類: LINUX內核
當你在用戶空間需要讀寫一大片數據的時候,這個就用上了。
 
 
 
假設我們在 kernel 里產生一個 buffer,user 可以經由 read,write 等 system call 來讀取或寫資料到這個 buffer 里。如果有一個 user 寫資料到 buffer 時,此時 buffer 已經滿了。那請問你要如何去處理這種情形呢 ? 第一種,傳給 user 一個錯誤訊息,說 buffer 已經滿了,不能再寫入。第二種,將 user 的要求 block 住, 等有人將 buffer 內容讀走,留出空位時,再讓 user 寫入資料。但問題來了,你要怎么將 user 的要求 block 住。難道你要用
while ( is_full );
write_to_buffer;
這 樣的程序代碼嗎? 想想看,如果你這樣做會發生什么事? 第一,kernel會一直在這個 while 里執行。第二個,如果 kernel 一直在這個 while 里執行,表示它沒有辦法去 maintain系統的運作。那此時系統就相當于當掉了。在這里 is_full 是一個變量,當然,你可以讓 is_full 是一個 function,在這個 function里會去做別的事讓 kernel 可以運作,那系統就不會當。這是一個方式。還有,你說可以在while里面把buffer里的內容讀走,再把is_full的值改了,但是我們會可能把重 要的數據在我們不想被讀的時候被讀走了,那是比較麻煩的,而且很不靈活.如果我們使用 wait_queue 的話,那程序看起來會比較漂亮,而且也比較讓人了解,如下所示:
 
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 這個 wait_queue 里。在 interruptible_sleep_on 里,則是最后會呼叫 schedule() 來做 schedule 的動作,誰調用了schedule誰就趴下,讓別人去運行,醒來就原地起來,執行schedule()后的代碼。那那個調用了schedule的家伙什么 醒過來呢?這時候就需要用到另一個函數了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是等待隊列頭,傳值方式
condition是任意一個布爾表達式,在休眠前后多次對condition求值,為真則喚醒
喚醒進程的基本函數是wake_up
void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);
實踐中,一般是wait_event和 wake_up, wait_event_interruptible和 wake_up_interruptible 成對使用。
【補充】其實看了那么多,他們也沒有給個立即可用的步驟,寫blog嘛,就是分享心得。我基于2.6.24總結一下,希望對大家有幫助:
1、定義:wait_queue_head_t my_queue;
2、初始化 init_waitqueue_head(&my_queue);
3、在一個函數里面等待:wait_event(queue, condition) ;(別在中斷里面搞)
 
4、在另一個函數里面喚醒:wake_up(wait_queue_head_t *queue); (這個可以在中斷調用,去喚醒別的進程,特別是dma操作類的)
 
有好幾個等待和喚醒函數,大家可以慢慢試。
關閉窗口
主站蜘蛛池模板: 日本中文字幕在线观看 | 国产天堂网 | 日韩看片 | 中文字幕在线一区二区三区 | 精品国产乱码一区二区三 | 欧美日韩国产一区二区 | 日韩亚洲欧美在线观看 | 中文字幕免费观看 | 国产激情一区二区三区 | 欧美不卡一区二区三区 | 久久久精品一区 | 综合久久99 | 黑人巨大精品欧美一区二区 | 免费的黄色网 | 免费看成人片 | 日韩精品视频免费在线观看 | 国产成人精品一区二区三区在线观看 | 97超碰资源站 | 特级黄色大片 | 精品一区国产 | 久草热视频 | 国产精品主播一区二区 | 久久伊人热 | 9.1成人看片免费版 国产草草影院 | 精品久久久久久久久久久 | 神马福利视频 | 2021国产精品 | 欧美日韩精品 | 欧美一级片在线 | 男人天堂网在线 | 综合激情网 | 中文字幕一区二区三区在线观看 | 欧美日韩综合网 | 欧美精品网| 欧美激情亚洲 | 国产91页 | 一区二区三区四区精品 | 91久久综合| 中文字幕免费在线 | 91看片看淫黄大片 | 自拍偷拍综合 |