中断下半部之tasklet(代码片段)

Li-Yongjun Li-Yongjun     2023-03-27     146

关键词:

简介

tasklet 是利用软中断实现的一种下半部机制。
选择到底是使用软中断还是 tasklet 其实很简单:通常你应该用 tasklet。
引入软中断的主要原因是其可扩展性。如果不需要扩展到多个处理器,那么,就使用 tasklet 吧。tasklet 本质上也是软中断,只不过同一个处理程序的多个实例不能在多个处理器上同时运行。软中断只在那些执行频率很高和连续性要求很高的情况下才需要。
而 tasklet 却有更广泛的用途。大多数情况下用 tasklet 效果都不错,而且它们还非常容易使用。
tasklet 由两类软中断代表:HI_SOFTIRQ 和 TASKLET_SOFTIRQ。这两者之间唯一的区别在于前者优先级比后者高。

使用

① 声明你自己的 tasklet
静态创建

DECLARE_TASKLET(name, _callback)
DECLARE_TASKLET_DISABLED(name, _callback)

动态创建

tasklet_init()

② 编写你自己的 tasklet 程序

void tasklet_fn(unsigned long data)

注意,因为是靠软中断实现,所以 tasklet 不能睡眠。
tasklet 运行时允许响应中断,所以你必须做好预防工作(比如屏蔽中断然后获取一个锁)。

③ 调度你自己的 tasklet

tasklet 由以下两个函数进行调度。

tasklet_schedule()
tasklet_hi_schedule()

实例

#include <linux/gpio.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/module.h>

#define BUTTON_PIN 12 /* GPIO 12 */

int flag = 0;

struct tasklet_struct tsklt;

void tasklet_fn(unsigned long data)

	printk("%s(), %s\\n", __func__, current->comm);


static irqreturn_t irq_handler(int irq, void *dev)	// 上半部

	printk("%s(): enter\\n", __FUNCTION__);

	tasklet_hi_schedule(&tsklt);

	printk("%s(): exit\\n", __FUNCTION__);

	return IRQ_HANDLED;


static int led_init(void)

	int err;
	int irq;

	printk("%s()\\n", __FUNCTION__);

	tasklet_init(&tsklt, tasklet_fn, 0);

	err = gpio_request_one(BUTTON_PIN, GPIOF_IN, "Button");
	if (err)
		return err;

	irq = gpio_to_irq(BUTTON_PIN);
	// enable_irq(irq); // why crash ?
	err = request_irq(irq, irq_handler, IRQ_TYPE_EDGE_BOTH, "LED Test", NULL);
	if (err < 0) 
		printk("request irq (%d) failed!\\n", irq);
		return err;
	

	printk("request irq (%d) success!\\n", irq);

	flag = 1;

	return 0;


static void led_exit(void)

	printk("%s()\\n", __FUNCTION__);

	if (flag)
		free_irq(gpio_to_irq(BUTTON_PIN), NULL);

	gpio_free(BUTTON_PIN);

	return;


module_init(led_init);
module_exit(led_exit);

MODULE_LICENSE("Dual BSD/GPL");

其它相关源码参考上篇文章

测试

# tftp -gr irq_tasklet.ko 192.168.31.224
# 
# insmod irq_tasklet.ko 
[39721.126865] led_init()
[39721.130762] request irq (200) success!
# 
# ./gpioout.out 1
[39724.639370] irq_handler(): enter
[39724.644089] irq_handler(): exit
[39724.648772] tasklet_fn(), swapper/0
[39725.639452] irq_handler(): enter
[39725.644161] irq_handler(): exit
[39725.648807] tasklet_fn(), swapper/0
# 
# rmmod irq_tasklet.ko 
[39732.248225] led_exit()
# 

执行中断服务程序后,紧接着执行 tasklet_fn(),符合预期。

linux内核中的下半部机制之tasklet(代码片段)

Tasklet机制是一种较为特殊的软中断。Tasklet一词的原意是“小片任务”的意思,这里是指一小段可执行的代码,且通常以函数的形式出现。但这个名字本身和内核中可调度的任务没有半毛钱的关系。参考Linux内核中的下半... 查看详情

linux内核中的下半部机制之tasklet(代码片段)

Tasklet机制是一种较为特殊的软中断。Tasklet一词的原意是“小片任务”的意思,这里是指一小段可执行的代码,且通常以函数的形式出现。但这个名字本身和内核中可调度的任务没有半毛钱的关系。参考Linux内核中的下半... 查看详情

中断下半部之workqueue(代码片段)

作用workqueue和softirq和tasklet一样,是常用的下半部机制之一。不过,和softirq以及tasklet不同的是,workqueue的本质是把work交给一个内核线程,在进程上下文调度的时候执行。因为这个特点,workqueue允许重新调度和... 查看详情

中断下半部之workqueue(代码片段)

作用workqueue和softirq和tasklet一样,是常用的下半部机制之一。不过,和softirq以及tasklet不同的是,workqueue的本质是把work交给一个内核线程,在进程上下文调度的时候执行。因为这个特点,workqueue允许重新调度和... 查看详情

小任务tasklet应用(代码片段)

tasklet(小任务)一个使用tasklet的中断程序首先会通过执行中断处理程序来快速完成上半部分的工作,接着通过调度tasklet使得下半部分的工作得以完成,但是下半部分何时执行属于内核的工作。tasklet定义在linux/interrupt.h中,实现... 查看详情

中断的顶半部和底半部介绍以及实现方式(tasklet和工作队列)(代码片段)

1、中断处理程序的注意点(1)中断上下文中,不能和用户空间交互数据,因为可能导致休眠或者阻塞;(2)在程序执行完之前不能交出CPU,不能休眠,不能schedule;(3)中断处理程序要尽可能短,越长则导致... 查看详情

rk3399平台开发系列讲解(中断篇)13.8中断下半部tasklet的原理及使用

平台内核版本安卓版本RK3399Linux4.4Android7.1 查看详情

rk3399平台开发系列讲解(中断篇)13.8中断下半部tasklet的原理及使用

平台内核版本安卓版本RK3399Linux4.4Android7.1 查看详情

rk3399平台开发系列讲解(中断篇)13.8中断下半部tasklet的原理及使用

平台内核版本安卓版本RK3399Linux4.4Android7.1 查看详情

linux内核中的软中断tasklet和工作队列详解(超详细~)(代码片段)

...com/read/cv17094615本文基于Linux2.6.32内核版本。引言软中断、tasklet和工作队列并不是Linux内核中一直存在的机制,而是由更早版本的内核中的“下半部”(bottomhalf)演变而来。下半部的机制实际上包括五种,但2.6版本... 查看详情

#导入word文档图片#linux下内核微线程tasklet

...,共享工作队列一样,也可以用于推后执行某些代码。​tasklet(小任务)机制是中断处理下半部分最常用的一种方法,其使用也是非常简单的。​Tasklet内核的实现机制和内核定时器差不多,也是软中断实现的。所以服务函数也... 查看详情

linux中断的上半部和下半部详解(代码片段)

原文地址:http://www.nndssk.com/xtwt/202047JzWsh3.html与Linux中断息息相关的一个重要概念是Linux中断分为两个半部:上半部(tophalf)和下半部(bottomhalf)。上半部的功能是"登记中断",当一个中断发生时,它进... 查看详情

linux中断处理原理分析

Tasklet作为一种新机制,显然可以承担更多的优点。正好这时候SMP越来越火了,因此又在tasklet中加入了SMP机制,保证同种中断只能在一个cpu上执行。在软中断时代,显然没有这种考虑。因此同一种中断可以在两个cpu上同时执行,... 查看详情

linux的中断(代码片段)

...inux中断编程申请和释放中断使能和屏蔽中断底半部机制1.tasklet2.工作队列3.软中断4.threadedirq中断概念和分类中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停当前程序的执行,转去处理突发... 查看详情

linux的中断(代码片段)

...inux中断编程申请和释放中断使能和屏蔽中断底半部机制1.tasklet2.工作队列3.软中断4.threadedirq中断概念和分类中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停当前程序的执行,转去处理突发... 查看详情

linux的中断(代码片段)

...inux中断编程申请和释放中断使能和屏蔽中断底半部机制1.tasklet2.工作队列3.软中断4.threadedirq中断概念和分类中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停当前程序的执行,转去处理突发... 查看详情

10.系统的软中断cpu使用率升高(代码片段)

上一篇说了软中断的基本原理,先回看下。中断是一种异步的事件处理机制,用来提高系统的并发处理能力。中断事件发生,会触发执行中断处理程序,而中断处理程序被分为上半部和下半部这两个部分。上半部对应硬中断,用... 查看详情

dma驱动框架流程编写(代码片段)

...成数据接收之后会产生中断,中断服务程序下半部的tasklet调度函数为࿰ 查看详情