tasklet主要用在中断函数中。它对于中断处理特别有用,由于硬件中断必须尽快处理, 但大部分的数据管理可以延后到以后安全的时间执行。所以可以使用tasklet。

tasklet的使用比较简单,只需要定义tasklet及其处理函数并将两者关联即可,在定义时可以采用两种形式。

例子:struct tasklet_struct my_tasklet;Void my_tasklet_func(unsigned long);第一种:DECLARE_TASKLET(my_tasklet,my_tasklet_func,data)代码DECLARE_TASKLET实现了定义名称为my_tasklet的tasklet并将其与my_tasklet_func这个函数绑定,而传入这个函数的参数为data。第二种:tasklet_init(&my_tasklet, my_tasklet_func, data);需要调度tasklet的时候引用一个tasklet_schedule()函数就能使系统在适当的时候进行调度,如下所示tasklet_schedule(&my_tasklet)

tasklet以一个数据结构形式存在,使用前必须被初始化。初始化能够通过调用一个特定函数或者通过使用某些宏定义声明结构:

#include <linux/interrupt.h>
struct tasklet_struct {struct tasklet_struct *next;unsigned long state;atomic_t count;void (*func)(unsigned long);unsigned long data;
};
void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);
#define DECLARE_TASKLET(name, func, data) \ struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(0), func, data }
#define DECLARE_TASKLET_DISABLED(name, func, data) \ struct tasklet_struct name = { NULL, 0, ATOMIC_INIT(1), func, data }
1) void tasklet_disable(struct tasklet_struct *t);
函数暂时禁止给定的 tasklet被 tasklet_schedule 调度,直到这个 tasklet 再次被enable;若这个 tasklet 当前在运行, 这个函数忙等待直到这个tasklet退出。
2) void tasklet_disable_nosync(struct tasklet_struct *t);
和tasklet_disable类似,但是tasklet可能仍然运行在另一个 CPU。
3) void tasklet_enable(struct tasklet_struct *t);
使能一个之前被disable的 tasklet。若这个 tasklet 已经被调度, 它会很快运行。 tasklet_enable和tasklet_disable必须匹配调用, 因为内核跟踪每个 tasklet 的"禁止次数"。
4) void tasklet_schedule(struct tasklet_struct *t);
调度 tasklet 执行,如果tasklet在运行中被调度, 它在完成后会再次运行; 这保证了在其他事件被处理当中发生的事件受到应有的注意. 这个做法也允许一个 tasklet 重新调度它自己。
5) void tasklet_hi_schedule(struct tasklet_struct *t);
和tasklet_schedule类似,只是在更高优先级执行。当软中断处理运行时, 它处理高优先级 tasklet。在其他软中断之前,只有具有低响应周期要求的驱动才应使用这个函数, 可避免其他软件中断处理引入的附加周期。
6) void tasklet_kill(struct tasklet_struct *t);
确保了 tasklet 不会被再次调度来运行,通常当一个设备正被关闭或者模块卸载时被调用。如果 tasklet正在运行, 这个函数等待直到它执行完毕。若 tasklet 重新调度它自己,则必须阻止在调用 tasklet_kill前它重新调度它自己,如同使用 del_timer_sync。

tasklet驱动调用模板:

void xxx_do_tasklet(unsigned long);DECLARE_TASKLET(xxx_tasklet,xxx_do_tasklet,0);void xxx_do_tasklet(unsigned long)
{……
}irqreturn_t xxx_interrupt(int irq,void *dev_id,struct pt_regs *regs)
{……tasklet_schedule(&xxx_tasklet);……
}
int _init xxx_init(void)
{……result=request_irq(xxx_irq,xxx_interrupt,SA_INTERRUPT,”xxx”,NULL)……
}
void _exit xxx_exit(void)
{……free_irq(xxx_irq,xxx_irq_interrupt);……
}

Linux的tasklet函数详解相关推荐

  1. linux下readlink函数详解

    linux下readlink函数详解 相关函数: stat, lstat, symlink 表头文件: #include <unistd.h> 定义函数:int  readlink(con ...

  2. Linux 文件锁 fcntl 函数详解

    Linux 文件锁 fcntl 函数详解 #include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); ...

  3. Linux中fork()函数详解

    Linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...

  4. linux 系统函数调用脚本文件,Linux系统调用fsync函数详解

    Linux系统调用fsync函数详解 发布时间:2013-11-14 19:55:10   作者:佚名   我要评论 Linux fsync函数主要用于将同步内存中所有已修改的文件数据到储存设备,多用 ...

  5. linux 中 sigaction 函数详解

    linux 中 sigaction 函数详解 一.函数原型 sigaction 函数的功能是检查或修改与指定信号相关联的处理动作(可同时两种操作) int sigaction(int signum, ...

  6. Linux下system () 函数详解简介

    (执行shell 命令) 相关函数 fork,execve,waitpid,popen 表头文件 #include<stdlib.h> 定义函数 int system(const char ...

  7. Linux内核开发函数详解

    MKDEV 功能   将主.次设备号转换成dev_t类型 主设备号 major 次设备号 minor 头文件 定义在<linux/cdev.h>中的宏 MKDEV(int major,in ...

  8. linux磁盘同步函数,Linux系统调用fsync函数详解

    功能描述: 同步内存中所有已修改的文件数据到储存设备. 用法: #include int fsync(int fd); 参数: fd:文件描述词. 返回说明: 成功执行时,返回0.失败返回-1,err ...

  9. linux中 fopen函数,详解C语言中的fopen()函数和fdopen()函数

    C语言fopen()函数:打开一个文件并返回文件指针头文件: #include fopen()是一个常用的函数,用来以指定的方式打开文件,其原型为: FILE * fopen(const char * ...

  10. Linux中execl函数详解与日常应用(附图解与代码实现)

    目录 execl函数 exec函数族的日常应用 1.Linux中第一个终端的创建 2.终端下.c文件的执行 exec其实并不是一个函数,而是由六个以exec开头的函数所构成的一个函数族,如下图所示 e ...

最新文章

  1. 彩色空间及cvtColor解析
  2. pgsql 前10条_白沙湾南片区11条新建道路最新进度及建成时间,已建成一条!还有一条将通车...
  3. LUA实现单词替换功能
  4. 为Windows Server 2012 R2指定授权服务器
  5. neo4j java查找_Spring-Boot使用neo4j-java-driver-- 查找两个节点之间关系的最短路径
  6. 积米浏览器如何清除浏览数据
  7. 100个最古老互联网域名 最久只有23年(附名单)
  8. Springboot @Transactional Mysql事务 无效
  9. thinkphp开启子域名无法正常访问_解决TP6报错“当前访问路由未定义或不匹配”...
  10. 数据库写入性能测试小工具
  11. ExtJS 3.2 学习笔记(1)
  12. 决策树_预测泰坦尼可号幸存者
  13. SHAP(SHapley Additive exPlanation):Python的可解释机器学习库
  14. 戴维斯计算机科学值得读吗,2018加州大学戴维斯分校计算机科学专业基本信息详细解读...
  15. jzoj3337. wyl8899的TLE
  16. 2017 北京商改住政策
  17. 华为HarmonyOS 鸿蒙,华为鸿蒙OS系统规划曝光,原来国产自主研发系统已经如此强大...
  18. sklearn中transform和fit_transform的区别(解决中文向量化特征不一致问题)
  19. 怪物Appr值与Data里Mon-x.wil里图像的对应关系
  20. 我的世界java版骷髅_我的世界:击杀凋灵骷髅,才会掉落“凋灵头”?听起来有些不靠谱...

热门文章

  1. 树形dp 没有上司的舞会
  2. DOM扩展-HTML5、专有扩展
  3. Oracle 中取当前日期的上个月最后天和第一天
  4. HandlerMethodArgumentResolver 参数解析器
  5. 缺少训练样本怎么做实体识别?小样本下的NER解决方法汇总
  6. 【进阶】PyTorch自定义CUDA算子教程与运行时间分析
  7. 图文并茂带你迅速了解本科、硕士、博士的区别
  8. 【资源汇总】超全整理深度学习相关学习资料,提供系统化的深度学习路径
  9. 表妹即将去读研,我送了她11个建议
  10. 深度学习2.0-37.循环神经网络层