内核定时器的简单应用

简介:
从离开大学到现在,接触linux内核也差不多有一个月了,基本上对于我来说只是了解一下理论知识,而并没有去用过,本篇主要是介绍了内核定时器的一个简单的应用,其实,内核定时器如果去深入的了解的话,当然是不简单,光从内核源码来看,它的数据结构就尤为复杂,但是今天这个例子, 会非常简单。
  在 Linux 内核中,有这样的一个定时器,叫做内核定时器,内核定时器用于控制某个函数,也就是定时器将要处理的函数在未来的某个特定的时间内执行。内核定时器注册的处理函数只执行一次,即不是循环执行的。

 

如果对延迟的精度要求不高的话,最简单的实现方法如下---忙等待:

Unsigned long  j = jiffies + jit_delay * HZ;

While(jiffies  <  j)

{

         ……

}

jiffies:全局变量,用来记录自系统启动以来产生的节拍总数。启动时内核将该变量初始化为0

此后每次时钟中断处理程序增加该变量的值。每一秒钟中断次数HZjiffies一秒内增加HZ。系统运行时间 = jiffie/HZ.

jiffies用途:计算流逝时间和时间管理

jiffies内部表示:

             extern u64 jiffies_64;

             extern unsigned long volatilejiffies;     //位长更系统有关32/64

  32位:497天后溢出

64位:……

 

在定时器中有这样一个概念,度量时间差:

时钟中断由系统的定时硬件以周期性的时间间隔产生,这个间隔说白了其实就是频率由内核根据HZ来确定,HZ是一个与体系结构无关的常数,可以配置为(50-1200),X86平台,它的值被默认为1000 ;

 

定时器数据结构被组织成双向链表,如下:

Struct  timer_list  {

              struct list_head entry;

              //定时值基于jiffies

              unsigned long expires;

              //定时器内部值

              struct tvec_base *base;

              //定时器处理函数

              void (*function)(unsigned long);

              //定时器处理函数参数

              unsigned long data;   

              ……

      };

 

对内核定时器操作有如下函数:

Void init_timer(struct timer_list *timer) ;

void add_timer(struct timer_list *timer);

int del_timer(struct timer_list *timer) ;

 

分别表示初始化定时器队列结构,启动定时器,在定时器超时前将它删除。当定时器超时后,系统会自动将它删除掉。

 

接下来我们来看一个例子:

 

#include <linux/kernel.h>

#include <linux/module.h>

#include <linux/init.h>

#include <linux/timer.h>  /*timer*/

#include <asm/uaccess.h>  /*jiffies*/

 

MODULE_LICENSE("GPL");

MODULE_AUTHOR("yangyuanxin");

MODULE_DESCRIPTION("TimerModule");

MODULE_ALIAS("timer module");

 

struct timer_list timer;

//定时器超时执行函数 

void timer_function(int para)

{

   printk("<0>Timer Expired and para is %d !!\n",para);   

}
 

int timer_init()

{

         init_timer(&timer);                   //初始化内核定时器

         timer.data= 5;                       //给执行的函数传参

         timer.expires= jiffies + (5 * HZ);         //当前jiffies的值加上5秒钟之后

         timer.function= timer_function;        //如果超时了就执行这个函数

         add_timer(&timer);                  //启动定时器

        

         return0;

} 

void timer_exit()

{

         del_timer(&timer );

}

 

module_init(timer_init);

module_exit(timer_exit);

目录
相关文章
|
Go 开发工具 C语言
flutter项目打包.exe文件发布windows版
目录 发布windows版 1.为现有的 Flutter 应用程序添加桌面支持 2..创建main_desktop.dart文件 3.hover安装和环境配置 4.初始化,并打包 坑1
1716 0
flutter项目打包.exe文件发布windows版
|
9月前
|
人工智能 自然语言处理 程序员
通义灵码2.0全新升级,AI程序员全面开放使用
通义灵码2.0来了,成为全球首个同时上线JetBrains和VSCode的AI 程序员产品!立即下载更新最新插件使用。
3592 85
通义灵码2.0全新升级,AI程序员全面开放使用
|
12月前
|
自然语言处理 数据处理 Python
python操作和解析ppt文件 | python小知识
本文将带你从零开始,了解PPT解析的工具、工作原理以及常用的基本操作,并提供具体的代码示例和必要的说明【10月更文挑战第4天】
1856 60
|
存储 NoSQL 大数据
【MongoDB】GridFS机制
【4月更文挑战第2天】【MongoDB】GridFS机制
|
缓存 NoSQL Java
【异常】com.alicp.jetcache.CacheException: refresh error
【异常】com.alicp.jetcache.CacheException: refresh error
337 1
|
Java 关系型数据库 MySQL
全网最实用的 IDEA Debug 调试技巧(超详细案例)
Debug 是程序员的开发神器,使用好了可以帮助我们非常高效的工作、学习、排查问题等。毫不客气的说,是决定我们进阶到更高层级的一个重要技能。 今天跟大家分享一下 IDEA 中 Debug 调试的各种奇技淫巧。
3450 0
全网最实用的 IDEA Debug 调试技巧(超详细案例)
|
监控 前端开发 关系型数据库
Linux 基于官网快速安装zabbix5.0图文教程
Linux 基于官网快速安装zabbix5.0图文教程
1016 0
|
机器学习/深度学习 数据挖掘 大数据
SAP MMBE字段解释
关于以下MMBE界面中每个库存字段的解释,相信除了常用的几个,很多小伙伴都不太清楚他们都应对于什么场景,笔者近期也受其困扰,较劲儿之下查询了相关资料,整理了每个MMBE每个字段栏位对应的场景,以下信息来源于网络资料汇总记录,仅供参考验证之用
SAP MMBE字段解释
|
安全 测试技术 数据安全/隐私保护