中断下文使用工作队列

发布时间 2023-12-18 18:59:02作者: zxz-FINE

Hello World

/*中断下半部分使用工作队列*/

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <mach/hardware.h>
#include <mach/regs-gpio.h>
#include <plat/gpio-fns.h>
#include <linux/workqueue.h>

int irq_num;
/*定义工作队列*/

struct work_struct test_workqueue;

/*工作任务*/
void test_workqueue_handler(struct work_struct *work)
{
	msleep(1000);

	printk(KERN_INFO "I am a work_func_t function\n");
}

irqreturn_t irq_handler(int irq, void *args)
{
	printk(KERN_INFO "I am a irq_handler function\n");
	//调度工作队列
	schedule_work(&test_workqueue);
	return IRQ_RETVAL(IRQ_HANDLED);
}
static int __init hello_init(void)
{
	int ret;
	//申请GPIO中断
	irq_num = gpio_to_irq(S3C2410_GPF(0));
	printk(KERN_INFO "irq_num = %d\n", irq_num);
	//申请中断
	ret = request_irq(irq_num, irq_handler, IRQF_TRIGGER_RISING, "irq_test", NULL);
	if (ret < 0)
	{
		printk(KERN_INFO "request_irq failed\n");
	}
	//静态初始化工作队列
	INIT_WORK(&test_workqueue, test_workqueue_handler);

	return 0;
}

static void __exit hello_exit(void)
{

	free_irq(irq_num, NULL);

	printk(KERN_INFO "irq_exit\n");

	return;
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");