内核在时钟中断发生后执行检测各个定时器是否到期,到期后的定时器处理函数将作为软中断在底半部执行。实质上,时钟中断处理程序会唤起TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。linux提供的内核定时器数据结构为timer_list。

一. 定义

timer_list定义在linux/timer.h中,实现在kernel/timer.c中。

struct timer_list {
struct list head_entry;
unsigned long expires; //到期时间
struct tves_base *base; void (*func)(unsigned long);
unsigned long data; int slack; #ifdef CONFIG_TIMER_STATS
int start_pid;
void *start_site;
char start_comm[];
#endif #ifdef CONFIG_LOCKDEP
struct lockdep_map lockdep_map;
#endif };

内核相关定义:HZ和jiffies

HZ  时钟频率
jiffies 32位无符号数,当前时钟计数

# define HZ     CONFIG_HZ   /* Internal kernel timer frequency */
# define USER_HZ /* some user interfaces are */
linux/jiffies.h
/*
* The 64-bit value is not atomic - you MUST NOT read it
* without sampling the sequence number in jiffies_lock.
* get_jiffies_64() will do this for you as appropriate.
*/
extern u64 __jiffy_data jiffies_64;
extern unsigned long volatile __jiffy_data jiffies; #if (BITS_PER_LONG < 64)
u64 get_jiffies_64(void);
#else
static inline u64 get_jiffies_64(void)
{
return (u64)jiffies;
}
#endif

二. 函数

初始化定时器

init_timer(&mytimer);

DEFINE_TIMER(_name, _function, _expires, _data);

TIMER_INITIALIZER(_function, _expires, _data);

setup_timer(timer, fn, data);

首次使能定时器

add_timer(&mytimer);
再次使能定时器

mod_timer(&mytimer, unsigned long expires);
删除定时器

del_timer_sync(&mytimer); //删除前要等待定时器处理完,不能发生在中断上下文。

del_timer(&mytimer); //删除定时器

三. 示例

#include <linux/init.h>
#include <linux/module.h>
#include <asm/current.h>
#include <linux/timer.h>
#inlcude <linux/sched.h> MODULE_LISENCE("GPL"); extern struct task_struct *current; struct timer_list mytimer; void timer_handler(unsigned long arg)
{
printk("timer arg = %d\n", arg);
mod_timer(&mytimer, jiffies + HZ * ); return;
} static int __init akae_init(void)
{
int local = ; printk("module name is %s\n", KBUILD_MODNAME);
printk("akae_init at %p\n", akae_init); printk("jiffies at %p\n", &jiffies);
printk("jiffies is %ld\n", jiffies); printk("The process is \"%s\" (pid %i)\n", current->name, curent->pid); init_timer(&mytimer); printk("HZ is %d\n", HZ);
mytimer.expires = jiffies + HZ * ;
mytimer.function = timer_handler;
mytimer.data = ; add_timer(&mytimer); return ;
} static void __exit akae_exit(void)
{
printk("module eixt.\n");
printk("akae_exit at %p\n", akae_exit); del_timer_sync(&mytimer); return;
} module_init(akae_init);
module_exit(akae_exit);

内核定时器timer_list的更多相关文章

  1. 模仿linux内核定时器代码,用python语言实现定时器

    大学无聊的时候看过linux内核的定时器,如今已经想不起来了,也不知道当时有没有看懂,如今想要模仿linux内核的定时器.用python写一个定时器,已经想不起来它的设计原理了.找了一篇blog,li ...

  2. Linux内核定时器struct timer_list

    1.前言 Linux内核中的定时器是一个很常用的功能,某些需要周期性处理的工作都需要用到定时器.在Linux内核中,使用定时器功能比较简单,需要提供定时器的超时时间和超时后需要执行的处理函数. 2.常 ...

  3. 【整理】--【KERNEL】内核定时器

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

  4. Linux设备驱动——内核定时器

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

  5. Linux内核——定时器和时间管理

    定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...

  6. Linux驱动技术(七) _内核定时器与延迟工作

    内核定时器 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行.实际上,时钟中断处理程 ...

  7. 芯灵思Sinlinx A64开发板Linux内核定时器编程

    开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 Linux 内核定时器是内 ...

  8. 全志A33开发板Linux内核定时器编程

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...

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

    开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...

随机推荐

  1. JDK 生成数字证书

    JDK(keytool.exe)生成数字证书 2010-11-21 15:52 QUOTE: keytool JAVA是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数 ...

  2. HDUOJ ---悼念512汶川大地震遇难同胞——来生一起走

    悼念512汶川大地震遇难同胞——来生一起走 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  3. C#搞工控的一些代码

    首先工控项目都会用到: using System.Runtime.InteropServices; 1.字节转化为单精度浮点数 2.单精度转成字节 3.使用结构体 4.使用动态链接库 5.ASCCII ...

  4. 用PowerDesigner对现有的数据库反向工程建立E-R图

    由于早期的一个项目在数据库设计建立时没有输出为E-R图,偶在对此项目进行二次改造升级时则使用了PD对原有的数据库进行反向工程,即根据数据源将数据库的的所有表生成为E-R图结构,我使用的是PD 15,反 ...

  5. Python学习笔记020——数据库基本操作

    本数据库的操作是Linux虚拟机平台下进行的 1 启动和链接MySQL服务 1.1 服务端 (1)查看服务状态 sudo /etc/init.d/mysql stauts (2)启动服务端 sudo ...

  6. python练习笔记——完全数(1000以内的)

    完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数.它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身.如果一个数恰好等于它的因子之和,则称该数为“完 ...

  7. SQL 语句递归查询 With AS 查找所有子节点

    create table #EnterPrise (   Department nvarchar(50),--部门名称   ParentDept nvarchar(50),--上级部门   Depar ...

  8. jenkins job构建后汇总结果到同一个文本文档中去

    jenkins 构建后,执行下shell脚本,把结果汇总到同一个文件中,这样多个job构建后的结果可以在一个文件中展示 result_all_dir="/app/jenkins_result ...

  9. FPGA管脚约束

    Edit → language templates : 打开即可查看基本语法. 一.xilinx中的约束文件 1.约束的分类 利用FPGA进行系统设计常用的约束主要分为3类. (1)时序约束:主要用于 ...

  10. unity physics joint

    除了unity文档(有点儿过于简略)之外,可以参考一下PhysX文档: http://docs.nvidia.com/gameworks/content/gameworkslibrary/physx/ ...