Skip to content

Latest commit

 

History

History
49 lines (42 loc) · 3.37 KB

内核定时器.md

File metadata and controls

49 lines (42 loc) · 3.37 KB

设置系统节拍频率

  • make menuconfig -> Kernel Features -> -> Timer frequency ( [=y])

  • 内核是使用全局变量 jiffies 来记录系统的节拍数 ,文件路径 kernel_code/include/linux/jiffies.h

  • API 函数

    • 比较函数:
      1. time_after(unkown, known) ,宏函数, unkown > known ===> , 返回1, else 返回0
      2. time_before(unkown, known), 宏函数, unkown < known ===> , 返回1, else 返回0
      3. time_after_eq(unkown, known), 宏函数, unkown >= known ===> , 返回1, else 返回0
      4. time_before_eq(unkown, known), 宏函数, unkown <= known ===> , 返回1, else 返回0
    • 转换API:
      1. int jiffies_to_msecs(const unsigned long j)
      2. int jiffies_to_usecs(const unsigned long j)
      3. u64 jiffies_to_nsecs(const unsigned long j)
      4. long msecs_to_jiffies(const unsigned int m)
      5. long usecs_to_jiffies(const unsigned int u)
      6. unsigned long nsecs_to_jiffies(u64 n)

内核定时器

  • 数据结构 , 路径: kernel_code/include/linux/timer.h

        struct timer_list{
                            struct list_head entry;
                            unsigned long expires;              /* 定时器超时时间,单位是节拍数 */
                            struct tvec_base *base;
                            void (*function)(unsigned long);    /* 定时处理函数, 回调函数 */
                            unsigned long data;                 /* 要传递给 function 函数的参数 */
                            int slack;
                        };
  • 使用注意:内核定时器并不是周期性运行的,超时以后就会自动关闭,因此如果想要实现周期性定时,那么就需要在定时处理函数中重新开启定时器。

  • API

    1. void init_timer(struct timer_list *timer),初始化 timer_list 类型变量,当我们定义了一个 timer_list 变量以后一定要先用 init_timer 初始化一下,相当于在链表定时器中申请一个节点要用的空间。节点先初始化,再向节点成员赋值。
    2. void add_timer(struct timer_list *timer),向 Linux 内核注册定时器,使用 add_timer 函数向内核注册定时器以后,定时器就会启动,即激活
    3. int del_timer(struct timer_list * timer),用于删除一个定时器,不管定时器有没有被激活,都可以使用此函数删除。在多处理器系统上,定时器可能会在其他的处理器上运行,因此在调用 del_timer 函数删除定时器之前要先等待其他处理器的定时处理器函数退出 返回值: 0,定时器还没被激活; 1,定时器已经激活
    4. int del_timer_sync(struct timer_list *timer),是 del_timer 函数的同步版,会等待其他处理器使用完定时器再删除,del_timer_sync 不能使用在中断上下文中 返回值: 0,定时器还没被激活; 1,定时器已经激活
    5. int mod_timer(struct timer_list *timer, unsigned long expires),修改定时值,如果定时器还没有激活的话, mod_timer 函数会激活定时器! 返回值: 0,调用 mod_timer 函数前定时器未被激活; 1,调用 mod_timer 函数前定时器已被激活。
  • 内核其他短延时

    1. void ndelay(unsigned long nsecs)
    2. void udelay(unsigned long usecs)
    3. void mdelay(unsigned long mseces)