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变量,这将保证它每次都被重新读取。