我做了一个这样的函数
trace_printk("111111");
udelay(4000);
trace_printk("222222");
日志显示它是 4.01 毫秒,没问题
但当我这样打电话时
trace_printk("111111");
ndelay(10000);
ndelay(10000);
ndelay(10000);
ndelay(10000);
....
....//totally 400 ndelay calls
trace_printk("222222");
日志将显示 4.7 毫秒。这是不可接受的。
为什么ndelay的误差这么大呢?
深入内核代码我发现了这两个函数的实现
void __udelay(unsigned long usecs)
{
__const_udelay(usecs * 0x10C7UL); /* 2**32 / 1000000 (rounded up) */
}
void __ndelay(unsigned long nsecs)
{
__const_udelay(nsecs * 0x5UL); /* 2**32 / 1000000000 (rounded up) */
}
我以为udelay会是ndelay的1000倍,但事实并非如此,为什么呢?
正如您已经注意到的,与毫秒延迟相比,纳秒延迟实现是相当粗略的近似,因为0x5
使用常数因子。0x10c7 / 0x5
约为 859。使用0x4
将接近 1000(大约 1073)。
然而,使用 0x4 会导致ndelay
to be 少于请求的纳秒数。一般来说,延迟函数的目的是提供延迟at least只要用户要求(参见此处:http://practicepeople.blogspot.jp/2013/08/kernel-programming-busy-waiting-delay.html).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)