中断tasklet 小实验,初步理解tasklet 使用
文章目录
tasklet 概念
在 Linux 内核驱动开发中,Tasklet 是一种常用的中断下半部(Bottom Half)机制,适用于延迟执行非紧急的中断处理任务。它运行在软中断上下文,不能睡眠,但能保证同一 Tasklet 不会在多个 CPU 上并发行,适合处理轻量级的中断后续工作。
TaskLet 参考资料
Linux 中断下半部tasklet
linux kernel的中断子系统之(九):tasklet
Linux内核中的软中断、tasklet和工作队列详解(超详细~)
Linux下中断机制之tasklet执行过程(详细)总结
【原创】Linux中断子系统(三)-softirq和tasklet
一、Tasklet 的关键特性
-
基于软中断
Tasklet 是通过软中断(HI_SOFTIRQ 或 TASKLET_SOFTIRQ)实现的,优先级低于硬件中断,但高于普通进程。 -
原子性调度
Tasklet 的调度(通过 tasklet_schedule())必须在原子上下文中(如硬件中断、软中断或自旋锁保护的代码中)。 -
串行执行
同一个 Tasklet 实例不会在多个 CPU 上并发执行,避免了竞态条件。 -
不可睡眠
因为运行在软中断上下文,Tasklet 不能调用可能睡眠的函数(如 kmalloc(…, GFP_KERNEL))
二、Tasklet 的主要 API 方法
| 函数/宏 | 说明 |
|---|---|
| DECLARE_TASKLET(name, func, data) | 静态定义 Tasklet,并绑定回调函数 |
| DECLARE_TASKLET_DISABLED(name, func, data) | 定义 Tasklet,但初始状态为 禁用 |
| tasklet_init(t, func, data) | 动态初始化 Tasklet |
| tasklet_schedule(t) | 调度 Tasklet(在软中断上下文中执行) |
| tasklet_hi_schedule(t) | 以 更高优先级(HI_SOFTIRQ)调度 Tasklet |
| tasklet_disable(t) | 临时禁用 Tasklet(可嵌套调用) |
| tasklet_enable(t) | 重新启用 Tasklet |
| tasklet_kill(t) | 强制终止 Tasklet,确保不再运行 |
方法说明如上,核心常用的方法我理解又三个:
动态初始化 tasklet_init -> 调度执行task:tasklet_schedule -> 驱动卸载时候 终止:tasklet_kill
后面再具体讲一讲 核心方法和使用
三、Tasklet 的使用步骤
Tasklet 定义
定义tasklet 分为静态定义和动态定义,如下:
静态定义创建一个tasklet
#include <linux/interrupt.h>
// 定义 tasklet 处理函数
void my_tasklet_handler(unsigned long data)
{
// Tasklet 处理逻辑
// ...
} /
/ 静态初始化 tasklet
DECLARE_TASKLET(my_tasklet, my_tasklet_handler, 0);
// 驱动程序的其他代码
my_tasklet 是 tasklet 的名称, my_tasklet_handler 是 tasklet 的处理函数, 0是传递给处理函数的参数。 但是需要注意的是, 使用 DECLARE_TASKLET 静态初始化的 tasklet无法在运行时动态销毁, 因此在不需要 tasklet 时, 应该避免使用此方法。 如果需要在运行时销毁 tasklet, 应使用 tasklet_init 和 tasklet_kill 函数进行动态初始化和销毁, 接下来我们来学习动态初始化函数

最低0.47元/天 解锁文章
410

被折叠的 条评论
为什么被折叠?



