内核定时器timer_list
内核在时钟中断发生后执行检测各个定时器是否到期,到期后的定时器处理函数将作为软中断在底半部执行。实质上,时钟中断处理程序会唤起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的更多相关文章
- 模仿linux内核定时器代码,用python语言实现定时器
大学无聊的时候看过linux内核的定时器,如今已经想不起来了,也不知道当时有没有看懂,如今想要模仿linux内核的定时器.用python写一个定时器,已经想不起来它的设计原理了.找了一篇blog,li ...
- Linux内核定时器struct timer_list
1.前言 Linux内核中的定时器是一个很常用的功能,某些需要周期性处理的工作都需要用到定时器.在Linux内核中,使用定时器功能比较简单,需要提供定时器的超时时间和超时后需要执行的处理函数. 2.常 ...
- 【整理】--【KERNEL】内核定时器
一.LINUX内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <linux/timer.h> 和 kernel/timer.c 文件中 ...
- Linux设备驱动——内核定时器
内核定时器使用 内核定时器是内核用来控制在未来某个时间点(基于jiffies)调度执行某个函数的一种机制,其实现位于 <Linux/timer.h> 和 kernel/timer.c 文件 ...
- Linux内核——定时器和时间管理
定时器和时间管理 系统定时器是一种可编程硬件芯片.它能以固定频率产生中断.该中断就是所谓的定时器中断.它所相应的中断处理程序负责更新系统时间,还负责执行须要周期性执行的任务. 系统定时器和时钟中断处理 ...
- Linux驱动技术(七) _内核定时器与延迟工作
内核定时器 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行.实际上,时钟中断处理程 ...
- 芯灵思Sinlinx A64开发板Linux内核定时器编程
开发平台 芯灵思Sinlinx A64 内存: 1GB 存储: 4GB 开发板详细参数 https://m.tb.cn/h.3wMaSKm 开发板交流群 641395230 Linux 内核定时器是内 ...
- 全志A33开发板Linux内核定时器编程
开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...
- 芯灵思SinlinxA33开发板Linux内核定时器编程
开发平台 * 芯灵思SinlinxA33开发板 淘宝店铺: https://sinlinx.taobao.com/ 嵌入式linux 开发板交流 QQ:641395230 Linux 内核定时器是内核 ...
随机推荐
- Python实现天数倒计时计算
tips:在datetime模块里有一个计算时间差的 timedelta.让两个datetime对象相减就得到timedelta ###--Python实现天数倒计时计算 #tips:在datetim ...
- JavaScript 设计模式之建造者模式
一.建造者模式概念解读 1.建造者模式概念文字解读 建造者模式可以将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示.也就是说如果我们用了建造者模式,那么用户就需要指定需要建造的类 ...
- Redis客户端
1.自带的: Redis-cli 2.redis-desktop-manager-0.7.9.809 是一个图形化客户端 但是不支持集群 **由于linux防火墙默认开启,redis的服务端口63 ...
- python学习笔记012——pdb调试
1 描述 pdb 是 python 自带的一个包,为 python 程序提供了一种交互的源代码调试功能, 主要特性包括设置断点.单步调试.进入函数调试.查看当前代码.查看栈片段.动态改变变量的值等 调 ...
- Linux中断 - IRQ Domain介绍
一.概述 在linux kernel中,我们使用下面两个ID来标识一个来自外设的中断: 1.IRQ number.CPU需要为每一个外设中断编号,我们称之IRQ Number.这个IRQ number ...
- Linux时间子系统(十六) clockevent
一.clock event控制的通用逻辑 1.产生clock event的设备 各种系统的timer硬件形形色色,不过在general clock event device layer,struct ...
- Python 元组 min() 方法
描述 Python 元组 min() 方法返回元组中元素最小值. 语法 min() 方法语法: min(T) 参数 T -- 指定的元组. 返回值 返回元组中元素最小值. 实例 以下实例展示了 min ...
- [hihoCoder] #1158 : 质数相关
时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 两个数a和 b (a<b)被称为质数相关,是指a × p = b,这里p是一个质数.一个集合S被称为质数相关,是指S中 ...
- CentOS防火墙开启、关闭与开放指定端口
系统为centos 5.5,部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页.由于以前部署在Win Server的VPS上,Linux ...
- [svc]samba服务搭建
说实话搞这些很蛋疼, 没啥技术含量. What is Samba? 这个历史悠久了 Since 1992, Samba has provided secure, stable and fast fil ...