当前位置:嗨网首页>书籍在线阅读

16-长延迟

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

10.6.2 长延迟

内核中进行延迟的一个很直观的方法是比较当前的jiffies和目标jiffies(设置为当前jiffies加上时间间隔的jiffies),直到未来的jiffies达到目标jiffies。代码清单10.14给出了使用忙等待先延迟100个jiffies再延迟2s的实例。

代码清单10.14 忙等待时延实例

1 /延迟100个jiffies/

2 unsigned long delay = jiffies + 100;

3 while (time_before(jiffies, delay));

4

5 /再延迟2s/

6 unsigned long delay = jiffies + 2*Hz;

7 while (time_before(jiffies, delay));

与time_before()对应的还有一个time_after(),它们在内核中定义为(实际上只是将传入的未来时间jiffies和被调用时的jiffies进行一个简单的比较):

define time_after(a,b) \

(typecheck(unsigned long, a) && \

typecheck(unsigned long, b) && \

((long)(b) - (long)(a) < 0))

define time_before(a,b) time_after(b,a)

为了防止time_before()和time_after()的比较过程中编译器对jiffies的优化,内核将其定义为volatile变量,这将保证它每次都被重新读取。