Linux的内核延迟函数

当内核需要等待一个比较短的时间间隔时,比方说:有时候设备驱动器会等待预先定义的若干个微妙的时间直到硬件完成某些操作。由于动态定时器通常有很大的设置开销和一个相当大的最小等待时间(1ms),所以设备驱动器使用它会很不方便。

在这些情况下,内核使用udelay()和ndelay()函数:前者接收一个微妙级的时间间隔作为它的参数,并在指定的延迟结束后返回;而后者所接收的指定延迟的参数是纳秒级的,同样在指定的延迟结束后返回。

udelay()和ndelay()这两个函数定义如下:

void udelay(unsigned long usecs)

{

    unsigned long loops;

    loops = (usecs*HZ*current_cpu_data.loops_per_jiffy)/1000000;

    cur_timer->delay(loops);

}

void ndelay(unsigned long nsecs)

{

    unsigned long loops;

    loops = (nsecs*HZ*current_cpu_data.loops_per_jiffy)/1000000000;

    cur_timer->delay(loops);

}

    这两个函数都是依赖与cur_timer定时器对象的delay方法,它接收“loops”中的时间间隔作为参数。每一次“loop”精确的持续时间取决于cur_timer涉及的定时器对象。

【如果cur_timer指向time_hpettime_pmtmrtimer_tsc对象,那么一次“loop”时间对应一个CPU循环——也就是两个连续CPU时钟信号间的时间间隔。】

【如果cur_timer指向timer_nonetimer_pit对象,那么一次“loop”时间对应一条紧凑指令循环在一次单独的循环中所花费的时间。】

     始化阶段,select_timer()设置好cur_timer后,内核通过执行calibrate_delay()函数来决定一个节拍里有多少次“loop”。这个值被保存在current_cpu_data.loops_per_jiffy变量中,这样udelay()ndelay()就能根据它来把微妙和纳秒转换成“loops”。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值