一、什么是中断上下文
中断上下文是指在一次中断处理中,中断处理的过程可以分成两个函数
就是在一个中断进程中先处理上文,然后直接返回执行正常程序。然后再通过其它方式去实现下半文。
如果遇到中断处理函数中比较费时的操作就利用利用中断上下文。
————————————————————————————————————————————————
下半文的实现方法
1,softirq: 处理比较快,但是内核级别的机制,需要修改整个内核源码,不推荐也不常用
2,tasklet: 内部实现实际调用了softirq
3, workqueue: 工作队列
一、tasklet :也叫软中断,微进程
它的实现方法是将中断下半部,放入到内核线程的一个软中断链表(SOFTIRQD)中,内核线程会自动执行链表的方法。
注意的是这个线程是运行在中断上下文中的,只要涉及到中断,就不可以使用休眠或延时等阻塞函数。中断不允许有这样的操作。
实现步骤:
1、定义一个TASKLET对像:struct tasklet_struct mytasklet; (结构体头文件包含了,我们就定义一下就可以 )
2、初始化结构体对象:
tasklet_init(struct tasklet_struct * t, void(* func)(unsigned long), unsigned long data)
在初始化的时候就创建了一个软中断链表,所以用完之后要销毁
参数一、我们定义的对象地址,参数二,结构体执行的函数就是中断下半部函数,参数三、给函数传的值
3,编写我们的中断下半部函数(函数名自定义)
4,在中断上半部在放入到内核线程中–启动下半部
tasklet_schedule(&key_dev->mytasklet);
5,卸载结构体对像
tasklet_kill(&key_dev->mytasklet);
————————————————————————————————————
二、工作队列。
工作队列和软中断链表相似。
不同的就是工作队列不需要创建,它内核启动后会创建一个工作线程和一个工作队列,也就是说内核会提供一个工作队列给所有人共用 。,因此自然而然的也就不需要释放这个工作队列的内存资源。,所以这个队列不是我们申请的,自然我们就不用去释放了。
还有就是这个队列是运行在进程上下文中,所以可以使用延时,休眠等阻塞操作。
实现步骤。
1、在装载模块中初始化工作队列
INIT_WORK(struct work_struct *work, work_func_t func);
2、实现工作队列的下半部函数
3、在中断上半部在放入到内核线程中–启动下半部
schedule_work(&key_dev->mywork);
————————————————————就可以了。
中断上下文
最新推荐文章于 2024-03-17 10:50:48 发布