栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

linux中断的上半部和下半部(linux驱动开发篇)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux中断的上半部和下半部(linux驱动开发篇)

1.简介

上半部:
上半部就是中断处理函数,那些处理过程比较快,不会占用很长时间的处理就可以放在上半部完成。

下半部:
如果 中断处理过程比较耗时,那么就将这些比较耗时的代码提出来,交给下半部去执行,这样中断处理函数就会快进快出。

总结:
因此linux内核将中断分为上半部和下半部的主要目的就是实现中断处理函数的快进快出,那些对时间敏感、执行速度快的操作可以放到中断处理函数中,也就是上半部。剩下的所有工作就放到下半部去执行,
比如,上半部将数据copy到内存中,下半部就执行对数据的处理。

经验列举:

1.如果要处理的内容不希望被其他中断打断,可以放在上半部
2.如果要处理的任务对时间敏感,可以放到上半部
3.如果要处理的任务与硬件有关,可以放到上半部
4.除了上述三点以外的其他任务,优先考虑放到下半部。

2.实现

上半部的处理即使直接编写中断处理函数。主要针对下半部的实现,主要分为软中断和工作队列。

2.1软中断

一开始 Linux 内核提供了“bootom half”机制来实现下半部,简称“BH”。后面引入了软中断和 tasklet 来替代“BH”机制,完全可以使用软中断和 taskled 来替代 BH,从 2.5 版本的 Linux内核开始 BH 已经被抛弃了。

struct tasklet_struct testtasklet;

void testtasklet_func(unsigned long data) {
 
}

irqreturn_t test_handler(int irq, void *dev_id) {
 ......
 
 tasklet_schedule(&testtasklet);
 ......
}

static int __init xxxx_init(void) {
 ......
 
 tasklet_init(&testtasklet, testtasklet_func, data);
 
 request_irq(xxx_irq, test_handler, 0, "xxx", &xxx_dev);
 ......
}
2.2 工作队列

工作队列是另外一种下半部执行方式,工作队列在进程上下文执行,工作队列将要推后的工作交给一个内核线程去执行,因为工作队列工作在进程上下文,因此工作队列允许睡眠或重新调度。因此如果你要推后的工作可以睡眠那么就可以选择工作队列,否则的话就只能选择软中断或 tasklet。

struct work_struct testwork;

void testwork_func_t(struct work_struct *work);
{
 
}

irqreturn_t test_handler(int irq, void *dev_id) {
 ......
 
 schedule_work(&testwork);
 ......
}

static int __init xxxx_init(void) {
 ......
 
 INIT_WORK(&testwork, testwork_func_t);
 
 request_irq(xxx_irq, test_handler, 0, "xxx", &xxx_dev);
 ......
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/729331.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号