首页 > 其他分享 >内核定时器以及应用

内核定时器以及应用

时间:2022-10-22 15:36:38浏览次数:133  
标签:key 定时器 struct list timer dev 应用 内核

1. 内核定时器的作用

当中断触发时,修改定时器时间间隔,进入定时器回调函数,待完成回调则恢复。

 

2. 定时器嵌入其他数据结构

 

 

 struct timer_list timer, 这个结构体作为定时器的数据结构,通过jiffies进行时间间隔的配置:

mod_timer(&timer,jiffies + msecs_to_jiffies(40));

 

旧版本的定时器数据结构:

struct timer_list{
    /* OTHERS */
    unsigned long expires;
    void (*function)(unsigned long);
    unsigned long data;
    /* OTHERS */
};

 新版本的定时器数据结构:

struct timer_list {
    /*
     * All fields that change during normal runtime grouped to the
     * same cacheline
     */
    struct hlist_node   entry;
    unsigned long       expires;
    void            (*function)(struct timer_list *);
    u32         flags;

#ifdef CONFIG_LOCKDEP
    struct lockdep_map  lockdep_map;
#endif
};

 此时的struct timer_list * 作为一个结构体指针传进去,这时候有一个神秘的接口可以把该结构体找到并且正确传递到函数中。

参考这个博客就知道这个数据结构怎么用:

https://lwn.net/Articles/735892/

 

3. 怎么用timer_list接口

1. timer_setup(&timer,current_key_timer_func,0); 初始化
2. mod_timer(&timer,jiffies + msecs_to_jiffies(40));其他地方调用启动定时器
3. 回调接口
static void current_key_timer_func(struct timer_list *tm)
{
    struct key_table_list *dev = from_timer(dev,tm,timer);
}

 把tm 传递给timer然后赋给dev,dev 存在一个timer。

 

4. 一个中断的驱动demo可以融入io中断、原子锁、tasklet以及定时器。

/* tasklet func */
static void keys_tasklet_func(unsigned long data)
{
    /* fetch which gpio's */
    struct key_table_list *dev = ( struct key_table_list * ) data;
    ev_press   = 1;

    /* mod_timer set */
    mod_timer(&dev->timer,jiffies + msecs_to_jiffies(40));
}

/* interrupt API */
static irqreturn_t buttons_interrupt(int irq, void *dev_id)
{
    struct key_table_list *dev = ( struct key_table_list * ) dev_id;
    int tmp_value = -1;
    tmp_value = gpio_get_value(dev->gpio);
    printk("button interrupt at [%d] key [No.%d]......key_status [%s]\n",
            dev->gpio,
            dev->key,
            (tmp_value > 0) ? "pulled-up" : "pressed-down");

    tasklet_schedule(&dev->tasklet);

    return IRQ_RETVAL(IRQ_HANDLED);
}

/* current key function */
static void current_key_timer_func(struct timer_list *tm)
{
    struct key_table_list *dev = from_timer(dev,tm,timer);

    int level = -1;
    level = gpio_get_value(dev->gpio);

    atomic_set(&dev->status,level);
    wake_up_interruptible(&button_waitq);

}

 只提供关键代码。

 

4. 中断机制

1. 底半部机制: tasklet、工作队列、软中断和线程化irq。

tasklet:软中断执行上下文,顶半步返回,利用tasklet处理。

工作队列: 内核线程执行上下文,调度和睡眠。

软中断: 软中断执行上下文,不允许睡眠。

线程化irq: request_threaded_irq 和 devm_request_threaded_irq 申请中断。

 

标签:key,定时器,struct,list,timer,dev,应用,内核
From: https://www.cnblogs.com/real-watson/p/16816153.html

相关文章

  • 云安全攻防体系实践-应用安全
    微服务架构下的应用安全1、认证服务2、授权服务3、数据安全防护4、与API网关/WAF结合进行深度防护认证服务1、基于JWT的认证2、基于Istio的认证3、传输认证4、请求级认证5、......
  • 微波感应的应用场景
    微波感应微波感应器又称微波雷达,是利用电磁波的多普勒原理制作的仪器。微波感应是通过反射波的变化知道有运动物体逼近或远离的。感应灯常用于楼道、走廊、车库等场景,微......
  • 原型、原型链、优点////作用域、作用域链////闭包、应用场景、优点、存在的问题
    一、原型、原型链、优点1、原型:在javascript中,函数可以有属性。每个函数都有一个特殊的属性叫做原型(prototype)2、原型链:JavaScript常被描述为一种基于原型的语言(prototy......
  • 定时器、外部中断0,以及查询和中断的模板
    这里拿一个0-60秒表做案例://sbit定义四个数码管unsignedcharcount,miao;voidmain(){  TMOD=0X01;  //设置T0为工作方式1  TH0=0XEE;    TL0=0X00......
  • 驱动开发:内核枚举进程与线程ObCall回调
    在笔者上一篇文章《驱动开发:内核枚举Registry注册表回调》中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调......
  • 驱动开发:内核枚举进程与线程ObCall回调
    在笔者上一篇文章《驱动开发:内核枚举Registry注册表回调》中我们通过特征码定位实现了对注册表回调的枚举,本篇文章LyShark将教大家如何枚举系统中的ProcessObCall进程回调以......
  • 关于sleep和定时器
    平时使用sleep多一些,如缓冲满了,等一会再送。while(缓冲满了){sleep(MS)};某个任务,20毫秒执行一次, while(TRUE){ 做任务(用了1毫秒),sleep(18,19毫秒)};几乎很少使用定时器;也感觉不出......
  • 数据结构—线性表的应用
    一、线性表的合并例1  求解一般集合的并集问题【问题描述】已知两个集合A和B,现要求一个新的集合A=AUB。例如,设            A=(7,5,3,11)      ......
  • Android 增加一个应用启动界面
    为了让app的逼格更高 为了让app的界面更人性化,并且让app在刚刚启动数据还没加载出来时不至于一片白屏太难看以至于吓跑用户,尝试增加一个启动页面。 首先建立一个新的......
  • istio部署后端单版本应用示例
    环境说明frontend(proxy):前端应用,会请求后端的demoappservice:proxydemoapp:后端应用service:demoappv10访问流程clientpod--->(EgressListener......