内核计时器代码例子

2021-01-24, updated 2021-09-12

Makefile编写

obj-m+=timer_test.o
#SRC="/lib/modules/$(shell uname -r)/build/"

CROSS_COMPILE="/home/bmduser10/develop/realtek/R810/rtl819x/toolchain/msdk-4.4.7-mips-EL-3.10-u0.9.33-m32t-140827/bin/mips-linux"
SRC="/home/bmduser10/develop/realtek/R810/rtl819x/linux-3.10"

all:
    make -C $(SRC) M=$(PWD) modules
clean:
    make -C $(SRC) M=$(PWD) clean

计时器相关结构体

struct timer_list {
    /*
     * All fields that change during normal runtime grouped to the
     * same cacheline
     */
    struct list_head entry;   
    unsigned long expires;
    struct tvec_base *base;
    
    void (*function)(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
};

相关api

初始化定时器:

void init_timer(struct timer_list * timer);

增加定时器,重复调用会挂掉:

void add_timer(struct timer_list * timer);

删除定时器:

int del_timer(struct timer_list * timer);

修改定时器的expire:

int mod_timer(struct timer_list *timer, unsigned long expires);

计时器使用

  1. 创建timer、编写超时定时器处理函数function;
  2. 为timer的expires、data、function赋值;
  3. 调用add_timer将timer加入列表—-添加一个定时器;
  4. 在定时器到期时,function被执行;
  5. 在程序中涉及timer控制的地方适当地调用del_timer、mod_timer删除timer或修改timer的expires。

示例

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>//jiffies在此头文件中定义
#include <linux/init.h>
#include <linux/timer.h>
struct timer_list mytimer;//定义一个定时器
void  mytimer_ok(unsigned long arg)
{
    printk("Mytimer is ok\n");
    printk("receive data from timer: %d\n",arg);

    // 修改定时器
    mytimer.expires = jiffies+1*HZ;//设定超时时间,100代表1秒
    mytimer.data = 250;    //传递给定时器超时函数的值
    mytimer.function = mytimer_ok;//设置定时器超时函数
    mod_timer(&mytimer); //添加定时器,定时器开始生效
}

static int __init hello_init (void)
{
    printk("hello,world\n");
    init_timer(&mytimer);     //初始化定时器
    mytimer.expires = jiffies+1*HZ;//设定超时时间,100代表1秒
    mytimer.data = 250;    //传递给定时器超时函数的值
    mytimer.function = mytimer_ok;//设置定时器超时函数
    add_timer(&mytimer); //添加定时器,定时器开始生效
    return 0;
}

static void __exit hello_exit (void)

{
    del_timer(&mytimer);//卸载模块时,删除定时器
    printk("Hello module exit\n");
}

module_init(hello_init);
module_exit(hello_exit);
MODULE_AUTHOR("CXF");
MODULE_LICENSE("Dual BSD/GPL");
words: 679 tags: