linux驱动-定时器

linux驱动-定时器,第1张

linux驱动-定时器

1、系统节拍
内核的宏定义CONFIG_HZ表示系统节拍率,系统节拍率意味着每秒的节拍数,通常为100HZ。因为高节拍率虽然能够以更高的精度运行,时间测量也更加准确,但导致中断的产生更加频繁,频繁的中断会加剧系统的负担,所以为了追求平衡,通常设置为100HZ。
2、全局变量 jiffies
记录系统从启动以来的系统节拍数。
HZ 表示每秒的节拍数, jiffies 表示系统运行的 jiffies 节拍数,所以 jiffies/HZ 就是系统运行时间,单位为秒。
3、jiffies和时间ms、us、ns的转换

int jiffies_to_msecs(const unsigned long j)  //j 参数为jiffies类型,返回值为对应的ms
long msecs_to_jiffies(const unsigned int m) //m参数为ms,返回值为jiffies

4、定时器中断的例子
下面是一个定时器中断的例子,比较简单,0.5s产生一个定时器中断,在中断里将全局变量num加1,并打印num的值。

#include "linux/module.h"
#include "linux/timer.h"
#include "linux/jiffies.h"

//定义一个定时器结构体timer_list
struct timer_list demo_timer;

int num=0;

static void time_func(unsigned long data)
{
	
	printk("num=%dn",num);
	num++;
	mod_timer(&demo_timer,jiffies + msecs_to_jiffies(500)); //必须在中断里通过mod_timer重新指定超时时间,否则这个中断只会进来一次
}

static int __init mytimer_init(void)
{
	printk("mytimer_init!n");
	init_timer(&demo_timer);    //初始化定时器
	demo_timer.function = time_func;  //指定定时器中断函数,定时器超时后会执行time_func
	demo_timer.expires = jiffies + msecs_to_jiffies(500); //定义超时时间,这里定义的是0.5s超时时间
	//demo_timer.expires = jiffies + (0.5 * HZ);  (或者写成这种方式,HZ是每秒节拍数)
	add_timer(&demo_timer);  //添加定时器开始计时
	return 0;
}

static void __exit mytimer_exit(void)
{
	printk("mytimer_exit!n");
	del_timer(&demo_timer);
}

module_init(mytimer_init);
module_exit(mytimer_exit);

MODULE_LICENSE("Dual BSD/GPL");

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5611253.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存