当前位置:网站首页>中断的顶半部和底半部介绍以及实现方式(tasklet 和 工作队列)
中断的顶半部和底半部介绍以及实现方式(tasklet 和 工作队列)
2022-07-04 15:58:00 【正在起飞的蜗牛】
1、中断处理程序的注意点
(1)中断上下文中,不能和用户空间交互数据,因为可能导致休眠或者阻塞;
(2)在程序执行完之前不能交出CPU,不能休眠,不能schedule;
(3)中断处理程序要尽可能短,越长则导致响应性能越差;
(4)中断处理程序和一般的处理程序不一样,中断处理程序不参与调度,所以一旦交出CPU就不会再被调度;
2、中断为什么分顶半部和底半部
(1)中断处理程序需要完成一定数量的工作,其中中断处理程序可能很快能完成要处理的工作,也可能要完成的工作比较耗时;
(2)中断处理程序在执行期间会禁止中断,所以中断处理程序要尽快结束不能使中断阻塞时间过长,否则可能会造成中断丢失;
(3)当中断处理程序要处理的任务客观上就比较耗时的时候,就存在工作和速度上的矛盾,一方面任务本身就比较耗时,一方面耗时就会导致中断响应变慢;
(4)针对第三种情况,于是就把中断分为上下半部,将不耗时但必须的操作放在上半部,把耗时的操作放在中断下半部,然后上半部调用下半部;
3、中断顶半部和底半部处理原则
(1)将必须立即处理的极少量任务放入中断的顶半部,此时需要屏蔽于自己同类型的中断,由于任务量少,所以可以迅速不受打扰的处理完紧急任务;
(2)将不太紧急的需要消耗大量事件的任务放到中断的底半部;
4、中断顶半部和底半部两种实现方式
4.1、两种方式的选用原则
(1)需要较少时间的中等数量的急迫任务放在tasklet中。此时不会屏蔽任何中断(包括与自己的顶半部同类型的中断),所以不影响顶半部对紧急事务的处理;同时又不会进行用户进程调度,从而保证了自己急迫任务得以迅速完成。
(2)需要较多时间且并不急迫(允许被操作系统剥夺运行权)的大量任务放在workqueue中。此时操作系统会尽量快速处理完这个任务,但如果任务量太大,期间操作系统也会有机会调度别的用户进程运行,从而保证不会因为这个任务需要运行时间将其它用户进程无法进行。
(3)可能引起睡眠的任务放在workqueue中。因为在workqueue中睡眠是安全的。在需要获得大量的内存时、在需要获取信号量时,在需要执行阻塞式的I/O操作时,用workqueue很合适。
总结:tasklet处理耗时相对较少的底半部,操作是原子的,必须一次运行完,不能让出CPU,不能休眠,但是处理速度快;工作队列处理耗时较长的底半部,参与系统调动,可以让出CPU也可以休眠;
4.2、tasklet示例代码
//中断处理底半部
void func(unsigned long data)
{
int flag;
printk("key-s5pv210: this is bottom half\n");
s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0)); // input妯″紡
flag = gpio_get_value(S5PV210_GPH0(2));
s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0f)); // eint2妯″紡
input_report_key(button_dev, KEY_LEFT, !flag);
input_sync(button_dev);
}
//定义tasklet并绑定中断下半部
DECLARE_TASKLET(mytasklet, func, 0);
//中断处理程序的顶半部
static irqreturn_t button_interrupt(int irq, void *dummy)
{
//做一些中断必要的处理
printk("key-s5pv210: this is top half\n");
//调用中断的底半部
tasklet_schedule(&mytasklet);
return IRQ_HANDLED;
}
//绑定中断处理程序
request_irq(BUTTON_IRQ, button_interrupt, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "button-x210", NULL);
4.3、工作队列示例代码
//中断处理底半部
void func(unsigned long data)
{
int flag;
printk("key-s5pv210: this is bottom half\n");
s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0)); // input妯″紡
flag = gpio_get_value(S5PV210_GPH0(2));
s3c_gpio_cfgpin(S5PV210_GPH0(2), S3C_GPIO_SFN(0x0f)); // eint2妯″紡
input_report_key(button_dev, KEY_LEFT, !flag);
input_sync(button_dev);
}
//定义工作队列并绑定中断底半部
DECLARE_WORK(mywork, func);
//中断处理程序的顶半部
static irqreturn_t button_interrupt(int irq, void *dummy)
{
//做一些中断必要的处理
printk("key-s5pv210: this is top half\n");
//调用中断的底半部
schedule_work(&mywork);
return IRQ_HANDLED;
}
//绑定中断处理程序
request_irq(BUTTON_IRQ, button_interrupt, IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, "button-x210", NULL);
边栏推荐
- 安信证券属于什么档次 开户安全吗
- 一加10 Pro和iPhone 13怎么选?
- 【Go ~ 0到1 】 第六天 文件的读写与创建
- Solution of dealer collaboration system in building materials industry: empowering enterprises to build core competitiveness
- [template] [Luogu p4630] duathlon Triathlon (round square tree)
- 缓存穿透、缓存击穿、缓存雪崩分别是什么
- MVC模式和三层架构
- Implementation of super large-scale warehouse clusters in large commercial banks
- 【测试开发】软件测试——基础篇
- To sort out messy header files, I use include what you use
猜你喜欢

整理混乱的头文件,我用include what you use

Master the use of auto analyze in data warehouse

【Go ~ 0到1 】 第六天 文件的读写与创建

防火墙基础透明模式部署和双机热备

【HCIA持续更新】WLAN概述与基本概念

To sort out messy header files, I use include what you use
![[HCIA continuous update] WLAN overview and basic concepts](/img/50/7eef28b7cfb0a72c97f3c50518ad6d.png)
[HCIA continuous update] WLAN overview and basic concepts

What if Kaili can't input Chinese???

一文掌握数仓中auto analyze的使用

Cann operator: using iterators to efficiently realize tensor data cutting and blocking processing
随机推荐
OPPO小布推出预训练大模型OBERT,晋升KgCLUE榜首
Implementation of super large-scale warehouse clusters in large commercial banks
Vscode modification indentation failed, indent four spaces as soon as it is saved
关于nacos启动时防火墙开启8848的坑
简单易用的地图可视化
Difference between redis' memory obsolescence strategy and expiration deletion strategy
超标量处理器设计 姚永斌 第6章 指令解码 摘录
[Acwing] 58周赛 4489. 最长子序列
CANN算子:利用迭代器高效实现Tensor数据切割分块处理
Electronic pet dog - what is the internal structure?
[template] [Luogu p4630] duathlon Triathlon (round square tree)
R language plot visualization: plot visualizes overlapping histograms and uses geom at the top edge of the histogram_ The rug function adds marginal rug plots
聊聊异步编程的 7 种实现方式
Internet addiction changes brain structure: language function is affected, making people unable to speak neatly
《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(2)-初识Fiddler让你理性认识一下
太方便了,钉钉上就可完成代码发布审批啦!
The company needs to be monitored. How do ZABBIX and Prometheus choose? That's the right choice!
[Huawei HCIA continuous update] SDN and FVC
动态规划股票问题对比
wuzhicms代码审计