Linux设备驱动程序 之 内核定时器
综述
如果需要在将来的某个时间点调度执行某个动作,同时在该时间点到达之前不会阻塞当前进程,则可以使用内核定时器;
内核定时器是一个数据结构,它告诉内核在用户定义的时间点使用用户定义的参数来执行一个用户定义的函数;
被调度运行的函数几乎肯定不会再注册这些函数的进程正在执行时运行,相反,这些函数会异步的运行;当定时器运行时,调度该定时器的进程可能正在休眠或在其他处理器上执行,或已经退出;
内核定时器常常是作为“软中断”的结果而运行的;在这种原子性上下文中运行时,代码会受到很多限制;
许多动作需要在进程上下文中才能执行,如果处于进程上下文之外,则必须遵守以下规则:
1. 不允许访问用户空间;因为没有进程上下文,无法将任何特定进程与用户空间关联起来;
2. current指针在原子模式下是没有任何意义的;也是不可用的,因为相关代码和被中断的进程没有任何关联;
3. 不能执行休眠或者调度;原子代码不可以调用shcedule或者wait_event,也不能调用任何可能引起休眠的函数;例如,调用kmalloc(…,GFP_KERNEL)就不符合本规则;信号量也不能用,因为可能引起休眠;
内核可以通过调用函数in_interrupt()来判断自己是否正运行于中断上下文,该函数无需参数,如果处理器运行在中断上下文,则返回非0值,无论是硬件中断还是软件中断;
和in_interrupt()相关的函数是in_atomic(),当函数返回非0值时,调度不被允,即处于原子上下文,包括硬件和软件中断上下文以及拥有自旋锁的任何时间点,在后一种情况下,current可能是可用的,但是禁止访问用户空间,因为会导致调度的发生;在使用in_interrupt()的时间点,都应该考虑是否真正的该使用的是in_atomic();
内核定时器的另一个重要特征是,任务可以将自己注册以后再稍后的时间重新运行,这种可能性是因为timer_list结构会在运行之前从活动定时器链表中移走,这样就可以立即链入其他链表;
在SMP系统中,定时器函数会由注册它的同一CPU执行,这样可以尽可能的获得缓存的局域性;因此,一个注册自己的定时器始终会在同一CPU上运行;
即使在单处理器系统上,定时器也会是竞态的潜在来源;这是由其异步执行的特点直接导致的;因此,任何通过定时器函数访问的数据结构都应该针对并发访问进行保护;
定时器API
内核为驱动程序提供了一组用来声明、注册和删除定时器的函数,下面为部分摘取:
struct timer_list {
/*
* All fields that change during normal runtime grouped to the
* same cacheline
*/
struct hlist_node entry;
unsigned long expires; /* 超时时间 */
void (*function)(unsigned long); /* 超时回调 */
unsigned long data; /* 回调参数 */
u32 flags; /* 标志 */
#ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif
};
/* 静态定义初始化 */
#define DEFINE_TIMER(_name, _function, _expires, _data) /* 只初始化,初始化之后再设置结构的回调,超时等 */
#define init_timer(timer) /* 初始化,设置回调,未设置超时 */
#define setup_timer(timer, fn, data) /* 添加定时器,开始工作 */
void add_timer(struct timer_list *timer) /* 未超时之前,可修改定时器的超时时间 */
int mod_timer(struct timer_list *timer, unsigned long expires) /* 删除定时器 */
int del_timer(struct timer_list * timer)
Linux设备驱动程序 之 内核定时器的更多相关文章
- Linux设备驱动程序 之 内核符号表
insmod使用公共内核符号表来解析模块中未定义的符号.功能内核符号表中包含了所有全局内核项(函数和变量)的地址,这是实现模块化驱动程序所必须的.当模块装载到内核后,它所导出的任何符号都会变成内核符号 ...
- 嵌入式Linux设备驱动程序:编写内核设备驱动程序
嵌入式Linux设备驱动程序:编写内核设备驱动程序 Embedded Linux device drivers: Writing a kernel device driver 编写内核设备驱动程序 最 ...
- linux设备驱动程序该添加哪些头文件以及驱动常用头文件介绍(转)
原文链接:http://blog.chinaunix.net/uid-22609852-id-3506475.html 驱动常用头文件介绍 #include <linux/***.h> 是 ...
- Linux设备驱动程序学习----2.内核模块与应用程序的对比
内核模块与应用程序的对比 更多内容请参考Linux设备驱动程序学习----目录 1. 内核模块与应用程序的对比 内核模块和应用程序之间的不同之处: 大多数中小规模的应用程序是从头到尾执行单个任务,而模 ...
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
- 【转】linux设备驱动程序中的阻塞机制
原文网址:http://www.cnblogs.com/geneil/archive/2011/12/04/2275272.html 阻塞与非阻塞是设备访问的两种方式.在写阻塞与非阻塞的驱动程序时,经 ...
- 如何编写Linux设备驱动程序
一.Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看 ...
- Linux设备驱动程序 第三版 读书笔记(一)
Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...
- Linux设备驱动程序学习之分配内存
内核为设备驱动提供了一个统一的内存管理接口,所以模块无需涉及分段和分页等问题. 我已经在第一个scull模块中使用了 kmalloc 和 kfree 来分配和释放内存空间. kmalloc 函数内幕 ...
随机推荐
- cordova 和 java ( JDK ) 和 android-studio (SDK)的初始安装和配置
一:前言(2018) 之前封装APP都是用的HBuilder结合mui来封装的简单app,有空的时候想研究下之前的phonegap来封装app.然后遇到的问题还是蛮多的,毕竟之前没弄过. 下面的步骤主 ...
- JS实现异步的几种方式
1.JS执行环境:单线程 单线程:就是指一次只能完成一件任务.若有多个任务时,就必须排队,等前面一个任务完成之后,再执行后面一个任务 缺点:任务耗时很长,后面的任务需要等待,拖延整个程序的执行.例 ...
- Flutter自定义绘制(1)- 绘制基础
CustomPainter Flutter 中实现绘制的主要是CustomPainter类. 我们一般继承这个类,来使用它: class MyPainter extends CustomPainter ...
- Android写入文件电脑看不到
原因是因为没有刷新,写入文件后执行以下代码即可. 根目录路径: File newfile = new File(Environment.getExternalStorageDirectory() + ...
- css Cascading Style Sheet 层叠样式表
作用 :实现网页布局,美化页面元素 CSS 在文档中的三种方式 1 行内样式/内联样式 特点:在具体的html标签中引入css 代码 语法: 所有的html标签都具有一个style属性,属性值就可以使 ...
- Win10系统更新提示错误0xc1900403的解决方法
Win10系统自从发布上线以来,一直有不断地进行更新,而每次更新也给我们用户带来了大大小小不同的惊喜.但是近来一些用户反应说Win10系统更新一直失败,并出现0xc1900403的错误代码提示. 对于 ...
- C 格式化的输入输出(printf scanf)
- 左对齐 (默认右对齐) printf("%-9d\n",123); 123 printf("%9d\n",123); 123 printf ...
- idou老师教你学Istio 09: 如何用Istio实现K8S Ingress流量管理
前言 在Istio的世界里,如果想把外部的请求流量引入网格,你需要认识并会学会配置Istio Ingress Gateway 什么是Ingress Gateway 由于Kubernetes Ingr ...
- 【NOIP/CSP2019】D2T1 Emiya 家今天的饭
这个D2T1有点难度啊 原题: 花了我一下午的时间,作为D2T1的确反常 条件很奇怪,感觉不太直观,于是看数据范围先写了个暴力 写暴力的时候我就注意到了之前没有仔细想过的点,烹饪方式必须不同 虽然a很 ...
- DNS域名解析系统介绍
域名系统(D N S)是一种用于T C P / I P应用程序的分布式数据库,它提供主机名字和 I P地址之间的转换及有关电子邮件的选路信息.这里提到的分布式是指在 I n t e r n e t上的 ...