2)使用stomic_inc()增加threads_active计数,在synchronize_irq()函数中会判断threads_active计数是否为0来决定是否需要等待irq_thread执行完毕。
说了这些,不知道你是否知道什么是irq_thread呢?我们通过request_thread_irq()函数指定thread_fn,这个thread_fn就是irq_thread线程最终调用的函数。而每个irq都会创建一个irq线程,创建的过程在setup_irq_thread()函数进行,setup_irq_thread()函数代码如下:
static int setup_irq_thread(struct irqaction *new, unsigned int irq, bool secondary)
{
struct task_struct *t;
struct sched_param param = {
.sched_priority = MAX_USER_RT_PRIO/2,
};
if (!secondary) {
t = kthread_create(irq_thread, new, "irq/%d-%s", irq, new->name);
} else {
t = kthread_create(irq_thread, new, "irq/%d-s-%s", irq, new->name);
param.sched_priority -= 1;
}
if (IS_ERR(t))
return PTR_ERR(t);
sched_setscheduler_nocheck(t, SCHED_FIFO, ¶m);
get_task_struct(t);
new->thread = t;
set_bit(IRQTF_AFFINITY, &new->thread_flags);
return 0;
}
通过kthread_create()创建irq/irq-new-name的线程,该线程的入口函数值irq_thread。在irq_thread()中每执行完成一个thread_fn就会threads_active计数减1。
现在可以考虑第三个问题了,假如register_thread_irq方式注册的threaded irq中调用msleep(1000),睡眠1秒,请问系统此时会继续睡下去而没调度回来吗?因此导致msleep后续的操作没有执行。答案就是不会,因为suspend时候会等待threaded handler执行完毕,所以系统不会睡眠,放心好了。
2.8. 工作队列会睡眠吗?
现在来思考一个按键消抖问题。如果你还不知道什么是按键消抖的话,我……。按键消抖在内核中通常是这样处理,通过变压触发中断,在中断handler中通过queue delayed work一段时间,计时结束执行按键上报处理。从内核的gpio_keys抠出部分代码如下:
static void gpio_keys_gpio_work_func(struct work_struct *work)
{
struct gpio_button_data *bdata =
container_of(work, struct gpio_button_data, work.work);
gpio_keys_gpio_report_event(bdata);
}
static irqreturn_t gpio_keys_gpio_isr(int irq, void *dev_id)
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-77055-9.html
有个叫巴菲特的貌似比你有钱
444444444444444
凡是敌人反对的我们就支持