中断上下文

一、什么是中断上下文
中断上下文是指在一次中断处理中,中断处理的过程可以分成两个函数
在这里插入图片描述
就是在一个中断进程中先处理上文,然后直接返回执行正常程序。然后再通过其它方式去实现下半文。
如果遇到中断处理函数中比较费时的操作就利用利用中断上下文。
————————————————————————————————————————————————
下半文的实现方法
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);
————————————————————就可以了。

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值