博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
内核定时器timer_list
阅读量:6005 次
发布时间:2019-06-20

本文共 2447 字,大约阅读时间需要 8 分钟。

内核在时钟中断发生后执行检测各个定时器是否到期,到期后的定时器处理函数将作为软中断在底半部执行。实质上,时钟中断处理程序会唤起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[16];#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    100     /* 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);#elsestatic 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 
#include
#include
#include
#inlcude
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 * 5); return;}static int __init akae_init(void){ int local = 0; 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 * 5; mytimer.function = timer_handler; mytimer.data = 100; add_timer(&mytimer); return 0;}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);

转载地址:http://xmsmx.baihongyu.com/

你可能感兴趣的文章
css3中变形与动画(一)
查看>>
[XMove-自主设计的体感解决方案] 系统综述
查看>>
【LINUX学习】磁盘分割之建立primary和logical 分区
查看>>
【YUM】第三方yum源rpmforge
查看>>
IOS(CGGeometry)几何类方法总结
查看>>
才知道系列之GroupOn
查看>>
⑲云上场景:超级减肥王,基于OSS的高效存储实践
查看>>
linux kswapd浅析
查看>>
变更 Linux、Ubuntu 时区、时间
查看>>
mac的git的21个客户端
查看>>
Spring Cloud自定义引导属性源
查看>>
[共通]手机端网页开发问题及解决方法整理
查看>>
我的友情链接
查看>>
${basePath}
查看>>
linux命令之uniq简单用法
查看>>
使用Eclipse调试Java程序的10个技巧
查看>>
Hive分桶表
查看>>
oracle10g 启动时报错:ORA-32004 ORA-19905
查看>>
思科分发列表过滤路由(RIP)动态路由协议篇
查看>>
可登录的用户数量是1.6万个,软件的性能得到充分的考验
查看>>