当前位置: 首页 > news >正文

内核定时器的简单应用

从离开大学到现在,接触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);

相关文章:

  • python编程笔记--字符编码
  • 增、删、改、查,数据库和表操作
  • Confluence 6 管理和恢复空间管理权限
  • iOS 系统授权开发
  • Kubernetes首爆严重安全漏洞,请升级你的Kubernetes
  • oracle asm amdu和dd使用
  • shell脚本编程之“最简单的死循环”【转】
  • 用户,组和权限零碎知识
  • Java 与 PHP 的MD5加密方法
  • 关闭webstorm(2017.3.5)的分号检测
  • vue 之 .sync 修饰符
  • 75、STP环路防护UDLD、Loop Guard简介
  • TensorFlow提示AVX2...
  • 【转】Android自动化测试(UiAutomator)简要介绍
  • 进程 守护
  • [NodeJS] 关于Buffer
  • [译]Python中的类属性与实例属性的区别
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Java到底能干嘛?
  • Java的Interrupt与线程中断
  • JAVA多线程机制解析-volatilesynchronized
  • Java应用性能调优
  • PHP的Ev教程三(Periodic watcher)
  • Web标准制定过程
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 大快搜索数据爬虫技术实例安装教学篇
  • 给初学者:JavaScript 中数组操作注意点
  • 利用DataURL技术在网页上显示图片
  • 两列自适应布局方案整理
  • 前嗅ForeSpider采集配置界面介绍
  • 浅谈Golang中select的用法
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 一文看透浏览器架构
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • ()、[]、{}、(())、[[]]命令替换
  • (06)金属布线——为半导体注入生命的连接
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 物件導向與老子思想 (OO)
  • (转)winform之ListView
  • (转载)OpenStack Hacker养成指南
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...