Linux驱动开发之中断处理

参考

内核线程同步之signal

tasklet

软中断中执行,当tasklet在执行的时候,不会重复进入。

worker工作队列

可重复进入。

内核线程

内核线程函数体常用循环控制条件,其中signal_pending用来接收kill -SIGKILL <pid>kthread_should_stop用来接收kthread_stop

#include <linux/module.h>
#include <linux/kthread.h>
#include <linux/delay.h>

static struct task_struct * slam_thread = NULL;
static int is_signal_exited = 0;

static int func(void *data) 
{
    allow_signal(SIGKILL);
    mdelay(1000);
	while(!signal_pending(current) && !kthread_should_stop()) {
	    set_current_state(TASK_INTERRUPTIBLE);
	    schedule_timeout(msecs_to_jiffies(5000));
	}
	is_signal_exited = 1;
	return 0;
}
static __init int kthread_signal_example_init(void)
{
        slam_thread = kthread_run(func, NULL, "slam");
        return 0;
}
static __exit void kthread_signal_example_exit(void)
{
    if(!is_signal_exited && !IS_ERR(slam_thread))
        kthread_stop(slam_thread);
}
module_init(kthread_signal_example_init);
module_exit(kthread_signal_example_exit);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章