在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > arm驅動linux等待隊列阻塞中斷IO的應用

            arm驅動linux等待隊列阻塞中斷IO的應用

            作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
            《[arm驅動]linux等待隊列阻塞中斷IO的應用》涉及內核驅動函數(shù)四個,內核結構體零個,分析了內核驅動函數(shù)四個;可參考的相關應用程序模板或內核驅動模板一個,可參考的相關應用程序模板或內核驅動一個

            一、概念:
            要休眠進程,必須有一個前提:有人能喚醒進程,而起這個人必須知道在哪兒能喚醒進程,這里,就引入了“等待隊列”這個概念。
            二、應用場景:
            等待隊列用來實現(xiàn)進程的阻塞,等待隊列可看作保存進程的容器,在阻塞進程時,將進程放入等待隊列,當喚醒進程時,從等待等列中取出進程。進程進入休眠后必須有個地方能夠喚醒休眠的進程;喚醒進程的地方最大可能是中斷里面,應為硬件資源的獲取的同時往往伴隨著一個中斷。所以在中斷中常常使用等待隊列來休眠進程,將cpu資源讓給其他進程,中斷發(fā)生時喚醒進程
            三、中斷休眠相關函數(shù)
            1、生成等待事件的函數(shù)

            本文引用地址:http://www.biyoush.com/article/201611/318222.htm

            內核函數(shù)一)a)函數(shù)wait_event_interruptible(queue,condition)函數(shù)

            wait_event_interruptible(queue,condition) //當condition(一個布爾表達式)為真時,立即返回;
            //否則讓進程進入TASK_INTERRUPTIBLE的睡眠,并掛在名為queue所指定的等待隊列上。

            內核代碼一)b)內核代碼

            #define wait_event_interruptible(wq, condition)
            ({
            int __ret = 0;
            if (!(condition))
            __wait_event_interruptible(wq, condition, __ret);
            __ret;
            })

            內核函數(shù)二)2、wake_up_interruptible(queue);//喚醒隊列中的名為queue的隊列
            內核代碼二)a)內核源碼

            #define wake_up_interruptible(x) __wake_up(x, TASK_INTERRUPTIBLE, 1, NULL)
            void fastcall __wake_up(wait_queue_head_t *q, unsigned int mode,
            int nr_exclusive, void *key)
            {
            unsigned long flags;
            spin_lock_irqsave(&q->lock, flags);
            __wake_up_common(q, mode, nr_exclusive, 0, key);
            spin_unlock_irqrestore(&q->lock, flags);
            }

            3、定義隊列名為queue的兩種方法
            內核函數(shù)三)a)靜態(tài)定義方法: DECLARE_QUEUE_HEAD(name)(常用)
            內核代碼三)內核代碼

            #define DECLARE_WAIT_QUEUE_HEAD(name) wait_queue_head_t name = __WAIT_QUEUE_HEAD_INITIALIZER(name)
            #define __WAIT_QUEUE_HEAD_INITIALIZER(name) {
            .lock = __SPIN_LOCK_UNLOCKED(name.lock),
            .task_list = { &(name).task_list, &(name).task_list } }

            內核函數(shù)四)b)動態(tài)定義方法:

            wait_queue_head_t my_queue;
            init_waitqueue_head(&my_queue);

            內代碼四)內核代碼

            init_waitqueue_head(&my_queue)的內核代碼
            void init_waitqueue_head(wait_queue_head_t *q)
            {
            spin_lock_init(&q->lock);
            INIT_LIST_HEAD(&q->task_list);
            }

            三、等待隊列代碼使用參考模板

            模板一)

            staticDECLARE_WAIT_QUEUE_HEAD(queue);
            staticintflag =0;
            staticirqreturn_t irq_handle(intirq, void*dev__id){
            //printk("irq = %dn", irq);
            //..........其他代碼.............
            flag = 1;
            wake_up_interruptible(&queue);
            returnIRQ_RETVAL(IRQ_HANDLED);//warn:榪斿洖IRQ_HANDLED
            }
            ssize_t XXXXX_read(structfile *filp,char__user *buf,size_tcount,loff_t *pos)
            {
            //pirntk(KERN_DEBUG "process %i (%s) going to sleepn",current->pid,current->comm);
            wait_event_interruptible(queue,flag);//此時進程被加入等待隊列,等待中斷發(fā)生
            flag=0;
            //printk(KERN_DEBUG "awoken %i (%s) n",current->pid,current->comm);
            returncount;//這個count變量看自己需要更改
            }



            評論


            技術專區(qū)

            關閉