您的位置 首页 新能源

arm驱动linux等候行列堵塞中止IO的使用

《[arm驱动]linux等待队列阻塞中断IO的应用》涉及内核驱动函数四个,内核结构体零个,分析了内核驱动函数四个;可参考的相关应用程序模板或…

《[arm驱动]linux等候行列堵塞中止IO的运用》触及内核驱动函数四个,内核结构体零个,剖析了内核驱动函数四个;可参阅的相关运用程序模板或内核驱动模板一个,可参阅的相关运用程序模板或内核驱动一个

一、概念:
要休眠进程,有必要有一个条件:有人能唤醒进程,而起这个人有必要知道在哪儿能唤醒进程,这儿,就引入了“等候行列”这个概念。
二、运用场景:
等候行列用来完成进程的堵塞,等候行列可看作保存进程的容器,在堵塞进程时,将进程放入等候行列,当唤醒进程时,从等候等列中取出进程。进程进入休眠后有必要有个当地可以唤醒休眠的进程;唤醒进程的当地最大可能是中止晒干,应为硬件资源的获取的一起往往伴随着一个中止。所以在中止中常常运用等候行列来休眠进程,将cpu资源让给其他进程,中止产生时唤醒进程
三、中止休眠相关函数
1、生成等候事情的函数

内核函数一)a)函数wait_event_interruptible(queue,condition)函数

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;
})

内核函数二)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的两种办法
内核函数三)a)静态界说办法: 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 } }

内核函数四)b)动态界说办法:

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 = %d\n”, 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 sleep\n”,current->pid,current->comm);
wait_event_interruptible(queue,flag);//此刻进程被参加等候行列,等候中止产生
flag=0;
//printk(KERN_DEBUG “awoken %i (%s) \n”,current->pid,current->comm);
returncount;//这个count变量看自己需求更改
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/265201.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部