1、系统定时器高频和低频的优缺点
a)高节拍率会提高系统时间精度,如果采用 100Hz的节拍率,时间精度就是 10ms,采用
1000Hz的话时间精度就是 1ms,精度提高了 10倍。高精度时钟的好处有很多,对于那些对时
间要求严格的函数来说,能够以更高的精度运行,时间测量也更加准确。
b)高节拍率会导致中断的产生更加频繁,频繁的中断会加剧系统的负担, 1000Hz和 100Hz的系统节拍率相比,系统要花费 10倍的“精力”去处理中断。中断服务函数占用处理器的时间
增加,但是现在的处理器性能都很强大,所以采用 1000Hz的系统节拍率并不会增加太大的负
载压力。根据自己的实际情况,选择合适的系统节拍率,本教程我们全部采用默认的
2、jiffies
Linux内核使用全局变量 jiffies来记 录系统从启动以来的系统节拍数,系统启动的时候会
将 jiffies初始化为 0
假如HZ 为最大值1000 的时候,32 位的jiffies 只需要49.7 天就发生了绕回,对于64 位的jiffies 来说大概需要5.8 亿年才能绕回,因此jiffies_64 的绕回忽略不计。
3、转换函数
4、定时器函数
a)初始化定时器
void init_timer(struct timer_list *timer)
b)函数用于向 Linux内核注册定时器,使用
void add_timer(struct timer_list *timer)
c)删除定时器
int del_timer(struct timer_list * timer)
d)函数的同步版,会等待其他处理器使用完定时器再删除,
int del_timer_sync(struct timer_list *timer)
e)函数用于修改定时值,如果定时器还没有激活的话,
int mod_timer(struct timer_list *timer, unsigned long expires) 函数
5、延时函数
6、源代码
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/ide.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <asm/mach/map.h>
#include <asm/uaccess.h>
#include <asm/io.h>
struct timer_list timer;
void timer_function( int arg )
{
printk( KERN_ALERT "arg = %d\n", arg);
//如果周期执行,则需要每次调用该函数
//mod_timer(&timer, jiffies + msecs_to_jiffies(2000));
}
static int __init timer_init(void)
{
int times = 5000;
init_timer(&timer);
timer.function = timer_function; //定时器中断响应函数
timer.data = times; //传递给timer_function的参数
timer.expires = jiffies + msecs_to_jiffies(2000); //定时周期
add_timer(&timer);
return 0;
}
static void __exit timer_exit(void)
{
del_timer_sync(&timer);
}
module_init(timer_init);
module_exit(timer_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("ddd");