ARMLinux 内核定时器驱动手记
// kernel-3.15-内核版本
// 本程序演示循环定时功能
#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>
static struct timer_list mytimer;
// 超时函数
static void timer_fun(unsigned long data)
{
printk("---------- %s ----------\n", (char *)data);
// 实现循环定时功能
// mod_timer(&mytimer, jiffies + 5*HZ); //重新修改定时器并且启动它
// 或以下两行
mytimer.expires = jiffies + 5 * HZ; // 5S后执行超时函数
add_timer(&mytimer);
}
// 模块安装成功返回 0,负数失败
static int __init mydev_init(void)
{
// 1.
setup_timer(&mytimer, timer_fun, (unsigned long)"Hello timer\r\n");
// 2.
mytimer.expires = jiffies + 5 * HZ; // 5S后执行超时函数
printk("---------- start timer ----------\n");
// 3.
add_timer(&mytimer);
return 0;
}
static void __exit mydev_exit(void)
{
// 循环定时需要删除定时器
del_timer_sync(&mytimer);
}
module_init(mydev_init);
module_exit(mydev_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Shaohuawlw Co., Ltd");
MODULE_DESCRIPTION("timer_list ");
// kernel-5.15-内核版本
// 本程序演示循环定时功能
#include <linux/module.h>
#include <linux/init.h>
#include <linux/timer.h>
static struct timer_list mytimer;
// 超时函数
static void timer_fun(unsigned long data)
{
printk("---------- %s ----------\n", (char *)data);
// 实现循环定时功能
// mod_timer(&mytimer, jiffies + 5*HZ); //重新修改定时器并且启动它
// 或以下两行
mytimer.expires = jiffies + 5 * HZ; // 5S后执行超时函数
add_timer(&mytimer);
}
// 模块安装成功返回 0,负数失败
static int __init mydev_init(void)
{
// 1.
timer_setup(&mytimer, timer_fun, 0);
// 2.
mytimer.expires = jiffies + (HZ * 5);
printk("---------- start timer ----------\n");
// 3.
add_timer(&mytimer);
return 0;
}
static void __exit mydev_exit(void)
{
// 循环定时需要删除定时器
del_timer_sync(&mytimer);
}
module_init(mydev_init);
module_exit(mydev_exit);
MODULE_LICENSE("Dual BSD/GPL");
MODULE_AUTHOR("Shaohuawlw Co., Ltd");
MODULE_DESCRIPTION("timer_list ");
不同内核版本操作主要差异在于初始化方法不一样,3.15版本的是setup_timer(x, x,x),5.15的是timer_setup(x, x,x),后面2个都是一样的。