Linux下延时与内核定时器

1、简介

1.1 linux的时间概念

Linux系统定时器是可编程的频率中断处理器,此频率为每秒的定时器节拍数,对应内核变量HZ
HZ是一个与体系结构相关的常数Linux为大多数平台提供HZ值范围为50-1200 x86 PC平台默认为1000
内核中有一个非常重要的全局变量: jiffies它是一个无符号32位整数,用来记录自内核启动以来的时钟滴答总数( 即每隔1/HZ秒加1)

1.2 时间延时

在驱动编程中经常会用到一些延时的情况根据延迟时间的长短分为长延迟和短延迟
短延迟-不依赖于时钟滴答,与具体的CPU类型相关

#include 
void ndelay(unsigned long nsecs); //纳秒级延时
void udelay(unsigned long usecs); //微秒级延时
void mdelay(unsigned long msecs); //毫秒级延时
这三个延时函数使任务进入忙等待,一般不太长的时间可以用它

1.3 睡眠延时

此方法不涉及忙等待,会导致进程睡眠

void msleep(unsigned int millisecs);//毫秒
unsigned long msleep_interruptible(unsigned int millisecs);//毫秒
void ssleep(unsigned int seconds);//秒

带interruptible为可提前唤醒

2、定时器

linux操作系统提供了一个内核定时器
内核定时器可在未来的某个特定时间点调度执行某个函数,完成指定任务
linux内核定时器提供了一种异步处理的机制
用户通过设置将来某一时刻的滴答值来实现定时功能
假设HZ的值为200,Linux定时器最短定时时间为5ms,小于该时间的定时可直接通过硬件定时器完成

2.1 使用流程

1.定义一个定时器
2.初始化定时器
3.编写定时器处理函数
4.填充定时器结构体
5.启动定时器
6.更新定时器
7.删除定时器

2.2 主要方法

#include 
定时器结构体类型
struct timer_list
{
    struct list_head entry;//链表节点,由内核管理
    //定时器到期时间(指定一个时刻)
    unsigned long expires;
    // 定时器处理函数
    void (*function)(unsigned long);
    // 作为参数被传入定时器处理函数
    unsigned long data;
};
//初始化定时器
void init_timer(struct timer_list *timer);
//添加定时器。定时器开始计时
void add_timer(struct timer_list * timer);
//删除定时器,在定时器到前删除一个已注册定时器
int del_timer(struct timer_list * timer);
//如果定时器函数正在执行则在函数执行完后返回(SMP)
int del_timer_sync(struct timer_list *timer);
//更新定时器到期时间,并开启定时器
int mod_timer(struct timer_list *timer,unsigned long expires);
//查看定时器是否正在等待被调度运行
int timer_pending(const struct timer_list *timer);
返回值为true表示正在等待被调度运行

你可能感兴趣的:(linux驱动)