linux 内核定时器

函数
void ndelay(unsigned long nsecs)纳秒时函数
void udelay(unsigned long usecs)微秒延时函数
void mdelay(unsigned long mseces)毫秒延时函数

1.Linux 内核提供的定时器 API 函数,通过这些定时器 API 函数我们可以完成很多要求定时的应用。 Linux内核也提供了短延时函数,比如微秒、纳秒、毫秒延时函数。

2.高节拍率和低节拍率的优缺点:
①、高节拍率会提高系统时间精度,如果采用 100Hz 的节拍率,时间精度就是 10ms,采用1000Hz 的话时间精度就是 1ms,精度提高了 10 倍。高精度时钟的好处有很多,对于那些对时
间要求严格的函数来说,能够以更高的精度运行,时间测量也更加准确。
②、高节拍率会导致中断的产生更加频繁,频繁的中断会加剧系统的负担, 1000Hz 和 100Hz
的系统节拍率相比,系统要花费 10 倍的“精力”去处理中断。中断服务函数占用处理器的时间
增加,但是现在的处理器性能都很强大,所以采用 1000Hz 的系统节拍率并不会增加太大的负
载压力。根据自己的实际情况,选择合适的系统节拍率。

3.Linux 内核使用全局变量 jiffies 来记录系统从启动以来的系统节拍数,系统启动的时候会将 jiffies 初始化为 0, jiffies 定义在文件 include/linux/jiffies.h 中。

4.Linux 内核提供了毫秒、微秒和纳秒延时函数

void ndelay(unsigned long nsecs);  //纳秒时函数
void udelay(unsigned long usecs);  //微秒延时函数
void mdelay(unsigned long mseces); //毫秒延时函数

5.定时器的使用:

1)添加头文件:

#include <linux/timer.h>
#include <linux/jiffies.h>

2)定义一个定时器设备:

struct timer_dev timerdev; 

3)在入口函数中初始化定时器

init_timer(&timerdev.timer);

timerdev.timeperiod = 500; //500ms
timerdev.timer.function = timer_func;  //定时器回调函数

timerdev.timer.expires = jiffies + msecs_to_jiffies(timerdev.timeperiod);/* 超时时间 500毫秒 */

timerdev.timer.data = (unsigned long)&timerdev;

add_timer(&timerdev.timer);   /* 启动定时器 */

4)定时器回调函数 timer_func函数 实现

//定时器处理函数
static void timer_func(unsigned long arg)
{
    struct timer_dev *dev = (struct timer_dev*)arg;
    static int sta = 1;

    sta = !sta;  /* 每次都取反,实现 LED 灯反转 */
    gpio_set_value(dev->led_gpio, sta);

	/* 如果需要定时器周期性运行的话就使用 mod_timer函数重新设置超时值并且启动定时器。*/
    mod_timer(&dev->timer, jiffies + msecs_to_jiffies(dev->timeperiod));
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值