概述
定时器
内核中的struct timer_list定时器常常被使用,其结构体如下。
struct timer_list{
struct list_head entry; //定时器链表入口
unsigned ling expires; // 以jiffies为单位的定时值
void (*function) (unsigned ling);//定时器处理函数
unsigned long data; // 传给处理函数的长整型
struct tvec_t_base_s *base; //定时器内部值,用户不需要
}
具体使用步骤如下:
step1:在模块初始化函数中定义定时器结构体
struct timer_list my_timer;
step2:然后初始化定时器结构
init_timer(&my_timer);
step3:接着给定时器结构中的成员赋值
my_timer.expires = jiffies + delay;
my_timer.data = 0;
my_timer.function = my_function;
step4:自定义定时器处理函数
void my_function(unsigned long data);
step4:最后激活定时器
add_timer(&my_timer);
当节拍数大于等于指定的额超时时,内核就开始执行定时器处理函数。虽然内核可以保证在超时时间到达之前不会执行处理函数,但是会有延误。一般来说,定时器在超时后会马上执行,但也有可能推迟到下次节拍再运行。
有时候需要更改已经激活的定时器时间,可以通过内核函数mod_timer来实现
mod_timer(&my_timer, jiffies + new_delay);
mod_timer()函数也可以操作那些已经初始化,但还没有激活的定时器。若还没有激活,mod_timer()就会激活该函数。一旦从mod_timer()函数返回,定时器将被激活,并设置新的定时时间。
若需要在定时器超时之前停止计时器可通过del_timer()来实现
del_timer(&my_timer);
被激活的或未被激活的定时器都可以使用该函数,若未被激活则返回0;否则返回1.
当删除定时器时,必须注意一个潜在的竞争条件,当del_timer()返回后,可以保证的只是,定时器将来不会再被激活,但是在多处理器机器上定时器中断可能已经在其他处理器上运行了。所以删除定时器时需要等待可能在其他处理器上运行的定时器处理程序都结束,这时就要用del_timer_sync()
del_timer_sync(&my_timer);
内核模块源码实例:
/* 内核定时器测试模块 */
#include <linux/kernel.h> //内核
#include <linux/module.h> //内核模块
#include <linux/init.h> //模块初始化和注销
#include <linux/slab.h> //屋里内存分配管理
#include <linux/list.h> //内核链表
#include <linux/timer.h> //内核定时器
//内核模块声明
MODULE_LICENSE("GPL");
MODULE_AUTHOR("EDISON REN");
MODULE_DESCRIPTION("KERNEL TIMER TEST");
MODULE_ALIAS("KERNEL TIMER TEST");
struct timer_list timer; //内核定时器
static void timer_function(unsigned long para)
{
printk("Timer Expired and para is:%ld,jiffies is %ldn",para,jiffies);
mod_timer(&timer, jiffies + 1 * HZ);
}
static int __init timer_init(void)
{
init_timer(&timer); //初始化内核定时器
timer.data=10; //参数
timer.expires=jiffies+ (3*HZ); //延时3秒
timer.function=timer_function; //定时器的执行函数
add_timer(&timer); //将定时器加入到系统定时器链表中
printk("Create Timer Success!n");
return 0;
}
static void __exit timer_exit(void)
{
del_timer(&timer); //删除该定时器
printk("Delete Timer!n");
}
module_init(timer_init);
module_exit(timer_exit);
Makefile脚本
obj-m := timer.o
IDIR= /lib/modules/$(shell uname -r)/kernel/net/ipv4/
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C /home/insslab/Desktop/CaaS3.0/caas_install_kernel_packet/caas_linux-4.13.10 M=$(PWD) modules
install:
sudo insmod default_cubic.ko
sudo insmod CC_Plugin_BBR.ko
sudo insmod CC_Plugin_westwood.ko
sudo insmod CC_Plugin_vegas.ko
un_install:
sudo rmmod timer.ko
clean:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean
最后
以上就是平常水池为你收集整理的struct timer_list定时器使用内核模块源码实例:Makefile脚本的全部内容,希望文章能够帮你解决struct timer_list定时器使用内核模块源码实例:Makefile脚本所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复