当前位置:网站首页>中断的顶半部和底半部介绍以及实现方式(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);
边栏推荐
- 电子宠物小狗-内部结构是什么?
- Summary of tx.origin security issues
- 【HCIA持续更新】网络管理与运维
- Analysis of abnormal frequency of minor GC in container environment
- 【Go ~ 0到1 】 第六天 文件的读写与创建
- MD5加密的两种方式
- Is it safe for Anxin securities to open an account online? Is the account opening fee charged
- 开发者,MySQL专栏完更,助你轻松从安装到入门进阶
- Solve the El input input box For number number input problem, this method can also be used to replace the problem of removing the arrow after type= "number"
- 我写了一份初学者的学习实践教程!
猜你喜欢
The 18th IET AC / DC transmission International Conference (acdc2022) was successfully held online
Zhijieyun - meta universe comprehensive solution service provider
就在今天丨汇丰4位专家齐聚,共讨银行核心系统改造、迁移、重构难题
What is low code development?
开发者,MySQL专栏完更,助你轻松从安装到入门进阶
码农版隐秘的角落:作为开发者最讨厌的5件
【华为HCIA持续更新】SDN与FVC
How to implement a delay queue?
NFT liquidity market security issues occur frequently - Analysis of the black incident of NFT trading platform quixotic
解读数据安全治理能力评估框架2.0,第四批DSG评估征集中
随机推荐
Implementation of super large-scale warehouse clusters in large commercial banks
中银证券网上开户安全吗?
gatling 之性能测试
tx.origin安全问题总结
NFT liquidity market security issues occur frequently - Analysis of the black incident of NFT trading platform quixotic
Offline and open source version of notation -- comprehensive evaluation of note taking software anytype
New technology releases a small program UNIPRO to meet customers' mobile office scenarios
The company needs to be monitored. How do ZABBIX and Prometheus choose? That's the right choice!
被PMP考试“折磨”出来的考试心得,值得你一览
Great Wall Securities security does not open a securities account
Go micro tutorial - Chapter 2 go micro V3 using gin and etcd
leetcode:421. 数组中两个数的最大异或值
Hidden corners of coder Edition: five things that developers hate most
公司要上监控,Zabbix 和 Prometheus 怎么选?这么选准没错!
智捷云——元宇宙综合解决方案服务商
What are cache penetration, cache breakdown, and cache avalanche
Dynamic programming stock problem comparison
Ks007 realizes personal blog system based on JSP
KS007基于JSP实现人个人博客系统
To sort out messy header files, I use include what you use