芯灵思SinlinxA33开发板Linux内核定时器编程

  
  

Linux内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于& lt; Linux/timer.h>和内核/计时器。c文件中。

  

芯灵思SinlinxA33开发板Linux内核定时器编程

  

开发平台

  
      <李>芯灵思SinlinxA33开发板   

    淘宝店铺:https://sinlinx.taobao.com/

      
     

芯灵思SinlinxA33开发板Linux内核定时器编程

  

嵌入式linux开发板交流QQ: 641395230

  

内核定时器的数据结构

  
 <代码> struct timer_list {
  struct list_head条目;//双向链表元素列表:用来将多个定时器连接成一条双向循环队列。
  无符号长到期;//到期字段表示期望定时器执行的jiffies值,到达该jiffies值时,将调用函数函数,并传递数据作为参数。
  空白(*函数)(无符号长);//指向一个可执行函数。当定时器到期时,内核就执行函数所指定的函数。而数据域则被内核用作功能函数的调用参数。
  无符号长数据;
  struct tvec_base *基地;/*……*/}; 
  

时间比较操作

  
  

在定时器应用中经常需要比较两个时间值,以确定计时器是否超时,所以Linux内核在timer.h头文件中定义了4个时间关系比较操作宏。这里我们说时刻一个在时刻b之后,就意味着时间值一个≥b.Linux强烈推荐用户使用它所定义的下列4个时间比较操作宏(包括/Linux/timer.h):

  
 <代码> # define time_after (a, b)((长)(b) -(长)(a)和lt;0)
  #定义time_before (a, b) time_after (b, a)
  #定义time_after_eq (a, b)((长)(一)——(长)(b)和gt;=0)
  #定义time_before_eq (a, b) time_after_eq (b, a)  
     

Linux内核时间相关转换函数

  

1。无符号长usecs_to_jiffies (const unsigned int u)

  
 <代码>功能:把微秒转换成时钟节拍
  参数:u时间微秒
  返回:对应的时钟节拍数量 
  

2。无符号长msecs_to_jiffies (const unsigned int)

  
 <代码>功能:把毫秒转换成时钟节拍
  参数:u时间毫秒
  返回:对应的时钟节拍数量
  示例:要定时从现在开始,3毫秒执行一个函数
  到期设置为jiffies + msecs_to_jiffies(3)  
  

Linux内核定时器操作相关API

  
      <李>静态定义结构体变量并且初始化(宏)
    <代码> DEFINE_TIMER (_name、_function _expires, _data)   
  

功能:定义一个名字为_name的struct timer_list结构的变量,并且初始化它的功能、失效、数据成员

  

2。定时器初始化(宏)

  

<代码> init_timer(计时器)

  

功能:只是对结构timer_list结构成员进行一些基础初始化操作,函数,到期后,数据成员还需要用户自
己填充。

  

3。设置定时器(宏)

  

<代码> setup_timer(定时器、fn、数据)

  

功能:设置定时器中的功能、数据和一些基础成员,到期并没有初始化,需要用户自己进行初始化

  

4。注册定时器到内核

  

<代码>空白add_timer (struct timer_list *计时器)

  

功能:向内核注册一个定时器,注册后会马上开始计时。

  

5。从内核注销定时器

  

<代码> int del_timer (struct timer_list *计时器);

  

功能:从内核定时链表上删除指定的定时器,删除后就不会再执行绑定的函数

  

6。修改定时器定时时间值,并且重新注册

  

<代码> int mod_timer (struct timer_list *计时器,无符号长expire0.s);

  

功能:修改定时器定时时间值,并且重新注册,不管这个定时的超时函数是否执行过。执行完成后会马上启
动定时。

  

内核定时器编程步骤

  

Step1定义timer_list结构变量

  

步骤2定义超时函数

  

Step3对timer_list结构变量进行初始化

  

第四注册定时器,启动定时

  

第五注销定时器

  

<>强实验平台:芯灵思SinlinxA33开发板

  

驱动代码:

  
 <代码> # include & lt; linux/module.h>
  # include & lt; linux/init.h>
  # include & lt; linux/timer.h>//Step1 timer_list结构变量
  struct timer_list定时器;//步骤2超时函数
  空白timer_fun(长数据)
  {
  printk (“% s的电话!数据:% d \ r \ n”, __FUNCTION__,数据);//__FUNCTION__获取当前函数名
  mod_timer(和计时器,jiffies +赫兹* 1);//再次修改本定时器超时时间为当前时间后1秒
  }
  静态int __init timer_init(空白)
  {//将发髻对timer_list结构变量进行初始
  init_timer(及计时器);
  setup_timer(和计时器,timer_fun, 666);
  计时器。到期=jiffies +赫兹* 2;//第四注册定时器,启动定时
  add_timer(及计时器);
  printk(“计时器开始! \ r \ n”);
  返回0;
  }
  静态孔隙__exit timer_exit (void)//模块退出函数指定module_exit ()
  {//第五注销定时器
  del_timer_sync(及计时器);
  printk(“计时器! \ r \ n”);
  }
  module_init (timer_init);
  module_exit (timer_exit);
  MODULE_LICENSE (GPL);
  

芯灵思SinlinxA33开发板Linux内核定时器编程