zoukankan      html  css  js  c++  java
  • Linux内核定时器

    参考:linux内核定时器 

         Linux内核时钟系统和定时器实现

         linux内核定时器使用及原理 

         Linux内核学习笔记八——定时器和时间管理

    软件意义上的定时器最终依赖硬件定时器来实现,内核在时钟中断发生后检测各定时器是否到期到期后的定时器处理函数将作为软中断在底半部执行。实质上,时钟中断处理程序会换起TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。 

    总结起来还是软中断的流程

    a.注册软中断处理函数

    /*/linux/kernel.timer.c*/
    void __init init_timers(void)
        -->open_softirq(TIMER_SOFTIRQ, run_timer_softirq, NULL);

    b.添加timer_list到某个链表

    void add_timer (struct timer_list *timer);

    c.触发软中断处理函数

    void irq_exit(void)
        -->tick_nohz_stop_sched_tick();
            -->raise_softirq_irqoff(TIMER_SOFTIRQ);

    d.调用软中断处理函数

    static void run_timer_softirq(struct softirq_action *h)
        -->__run_timers(base);
            -->遍历执行时间到达的timer_list中的定时器处理函数

    在Linux设备驱动编程中,可以利用Linux内核中提供的一组函数和数据结构来完成定时触发工作或者完成某种周期性的事务。这组函数和数据结构使得驱动程序师在多数情况下不用关心具体的软件定时器究竟对应着怎样的内核和硬件行为。 

    1) 一个timer_list 结构体的实例对应一个定时器,其定义如下:

    struct timer_list {
    
       struct list_head entry, /*定时器列表*/
       unsigned long expires, /*定时器到期时间*/
       void (*function) (unsigned long), /*定时器处理函数*/
       unsigned long data,/*作为参数被传入定时器处理函数*/
       struct timer_base_s *base,
       ...
    
    };

    实例化 struct timer_list my_timer;

    2) 初始化定时器

    void init_timer (struct timer_list *timer);
    
    TIMER_INITIALIZER (_function, _expires, _data)
    
    DEFINE_TIMER (_name, _function, _expires, _data)
    
    setup_timer ();

    3) 增加定时器

    void add_timer (struct timer_list *timer);

    4) 删除定时器

    int del_timer (struct timer_list *timer);

    5) 修改定时器的expire

    int mod_timer (struct timer_list *timer, unsigned long expires);
  • 相关阅读:
    UPD通信
    异常处理
    网络编程-套接字(socket)
    数据分析(一)
    爬虫存储库之mongodb数据库(四)
    爬虫请求库selenium(三)
    爬虫解析库beautifulsoup(二)
    爬虫简介与request库(一)
    flask框架数据库之SQLAlchemy
    flask框架(四)
  • 原文地址:https://www.cnblogs.com/yangjiguang/p/7643034.html
Copyright © 2011-2022 走看看