内核定时器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 内核定时器是内核 ...
随机推荐
- PHP 多个mysql连接的问题
今天在同一个php进程中用mysql_connect新建了两个mysql句柄,这两个句柄都连接同一台数据库,只不过操作的数据库dbname不同,假设这两个句柄分别是$dbhA和$dbhB,它们对应的数 ...
- Hex棋
Hex棋,又叫六角棋,译作海克斯棋.据说这个游戏是约翰·纳什发明的.网上并没有太多介绍,第一次听说是在"中国大学生计算机博弈大赛"官网上. 棋盘为11×11的六边形小格子组成,它是 ...
- 【C++】const成员函数
形式: 在成员函数后面加上const限定词,表示不会修改对象内容. 例如Circle类: class Circle { double r; public: Circle(double newr) { ...
- Loading...加载图收集
收集来源:http://cs.fangjia.com/zoushi/
- Https自签名证书认证及数据请求的封装
在WWDC 2016开发者大会上,苹果宣布了一个最后期限:到2017年1月1日 App Store中的所有应用都必须启用 App Transport Security安全功能.App Transpor ...
- Hadoop分布式文件系统使用指南
原文地址:http://hadoop.apache.org/docs/r1.0.4/cn/hdfs_user_guide.html 目的 概述 先决条件 Web接口 Shell命令 DFSAdmin命 ...
- TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE
TransactionScope事务处理方法介绍及.NET Core中的注意事项 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...
- Ubuntu 10.04 安装Qt4.8.1 源码后字体模糊的问题
Ubuntu 10.04 安装QT4.8.1 源码后字体模糊的问题. 附加解决 QT SDK 4.8.1 链接失败的问题 Ubuntu 10.04 编译QT源码后,编译程序,运行后IPA字体无法正常显 ...
- RAC安装gird,第一个节点执行root.sh报"The ora.asm resource is not ONLINE"错误
RAC版本:11.2.0.4 OS版本:linux 6.4 RAC安装gird,第一个节点执行root.sh运行失败,报"The ora.asm resource is not ONLINE ...
- CFS调度器
一.前言 随着内核版本的演进,其源代码的膨胀速度也在递增,这让Linux的学习曲线变得越来越陡峭了.这对初识内核的同学而言当然不是什么好事情,满腔热情很容易被当头浇灭.我有一个循序渐进的方法,那就是先 ...