linux驱动34:tasklet小任务机制
tasklet在很多地方类似于内核定时器,如它们始终在中断期间运行,始终会在调度它们的同一CPU上运行,在“软件中断”上下文以原子模式执行。和内核定时器不同的是,不能要求tasklet在某个给定时间执行,调度一个tasklet,内核会选择某个其后的时间来执行给定的函数。
特性:
一个tasklet可在稍后被禁止或者重新启用;只有启用的次数和禁用的次数相同时,tasklet才会被执行。
tasklet可以注册自身。
tasklet可被调度以在通常的优先级或者高优先级执行;高优先级的tasklet总会首先执行。
如果系统负荷不重,tasklet会立即执行,始终不会晚于下一个定时器滴答。
一个tasklet可以和其它tasklet并发,但对自身来讲是严格串行处理的,即同一tasklet不会在多个处理器上同时运行。
基本API:
void tasklet_init(struct tasklet_struct *t, void (*func)(unsigned long), unsigned long data);
void tasklet_disable(struct tasklet_struct *t); //禁用指定的tasklet
void tasklet_disable_nosync(struct tasklet_struct *t);//禁用指定的tasklet,但不会等待任何正在运行的tasklet退出
void tasklet_enable(struct tasklet_struct *t);//启用一个先前被禁用的tasklet
void tasklet_schedule(struct tasklet_struct *t);//调度执行指定的tasklet
void tasklet_hi_schedule(struct tasklet_struct *t);//以高优先级调度执行指定的tasklet
void tasklet_kill(struct tasklet_struct *t);//指定的tasklet不会被再次调度,在设备关闭或模块移除时调用
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/time.h>
#include <linux/interrupt.h>static struct timeval lastTime;
static struct tasklet_struct myTasklet;
static char data[] = "hello";
int cnt = 0;//不能在tasklet_callback中调用tasklet_disable、tasklet_enable
void tasklet_callback(long unsigned int data)
{struct timeval curTime;char *p = (char *)data;printk("%s:%s\n", __func__, p);do_gettimeofday(&curTime);printk("interval: %ld s, %ld us\n",curTime.tv_sec - lastTime.tv_sec, curTime.tv_usec - lastTime.tv_usec);lastTime = curTime;if (cnt <= 5){tasklet_schedule(&myTasklet);}cnt++;
}static int __init hello_init(void)
{printk("hello_init. \n");do_gettimeofday(&lastTime);tasklet_init(&myTasklet, tasklet_callback, (long unsigned int)data);tasklet_disable(&myTasklet);tasklet_enable(&myTasklet);tasklet_schedule(&myTasklet);return 0;
}static void __exit hello_exit(void)
{printk("hello_exit. \n");tasklet_kill(&myTasklet);
}MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);
linux驱动34:tasklet小任务机制相关推荐
- Linux驱动——mmc card热插拔检测机制(十)
Linux驱动--mmc card热插拔检测机制(十) 备注: 1. Kernel版本:5.4 2. 使用工具:Source Insight 4.0 3. 参考博客: [sd card] ...
- linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写
摘要:媒介 Device Tree是一种用去描绘硬件的数据布局,类似板级描绘说话,发源于OpenFirmware(OF).正在现在遍及应用的kernel 2.6.x版本中,对分歧仄台.分歧硬件,往] ...
- macbook air linux驱动安装教程,小编教你macbook air如何安装win7
不管是游戏玩家还是工作人员,都喜欢使用win7系统.有些朋友购买MacBook Air后因为工作原因需要安装win7系统.可是该如何安装呢?对此,我给大家整理了MacBook Air安装win7系统的 ...
- (十三)linux中断底半部分处理机制
这篇文章介绍一下linux中断的底半部分的tasklet和workquene两种处理机制,其中tasklet中不能有延时函数,workquene的处理函数可以加入延时操作 目录 (一)tasklet小 ...
- linux中的tasklet机制【转】
转自:http://blog.csdn.net/yasin_lee/article/details/12999099 转自: http://www.kerneltravel.net/?p=143 中断 ...
- linux platform匹配机制,Linux驱动中的platform总线详解
platform总线是学习linux驱动必须要掌握的一个知识点. 一.概念 嵌入式系统中有很多的物理总线:I2c.SPI.USB.uart.PCIE.APB.AHB linux从2.6起就加入了一套新 ...
- linux 内核驱动的poll,嵌入式Linux驱动开发(五)——poll机制原理以及驱动实现...
前情回顾: 再开始今天的内容之前,先简单review一下,我们都用了什么方案来获取按键值,他们的特点都是什么.只有不断地理清了思路,我们才能够更好的理解,为何会出现如此多的解决方案,当遇到问题的时候, ...
- 《Linux总线、设备与驱动》USB设备发现机制
http://blog.csdn.net/tankai19880619/article/details/11639185 说明:本分析基于mstar801平台Linux2.6.35.11内核,其他内核 ...
- linux驱动面试题整理
1.字符型驱动设备你是怎么创建设备文件的,就是/dev/下面的设备文件,供上层应用程序打开使用的文件? 答:mknod命令结合设备的主设备号和次设备号,可创建一个设备文件. 评:这只是其中一种方式,也 ...
最新文章
- Linux下各文件夹的结构说明及用途介绍(转载)
- unity shader 纹理透明效果
- 修建道路 贪心,思维(女赛)
- VTK:Filtering之ContoursFromPolyData
- mySQL教程 第1章 数据库设计
- 处理SAP Netweaver gateway service使用过程中遇到的404 error
- 去掉网页上链接或按钮的虚线框
- IDEA 访问Maven私服与上传组件
- VC++ COMBO BOX控件的使用
- Mac---使用tree生成目录结构
- python 的库如何开发_Python开发者必备6个基本库
- 新版GitHub客户端上传文件夹教程笔记
- 【错误记录】Kotlin 报错 ( Some kotlin libraries attached to this project were compiled with a newer kotlin )
- 美团App用户界面分析
- 将链接转成base64格式生成二维码和把页面生成图片
- iOS各版本发布时间和特点
- 世界上第一台通用计算机是多少年诞生的,世界上第一台通用计算机ENIAC是( )年诞生的。...
- Windows10关机时出现 等待应用程序响应 / ETDCtrlHelper 影响关机
- 柳州高级中学2021年高考成绩查询,2021年柳州所有高中排名一览表
- 局部非饱和性的含义_范里安-微观经济学现代观点讲义(new)