1、內核的ndelay是由udelay實現的,精度是1us
無法實現納秒級延時,要想實現有2個方法
2、第一種調用系統的底層延時函數,計算延時的clock
cpu_relax(); 是cpu忙等待
static void __timer_delay(unsigned long cycles) { cycles_t start = get_cycles(); while ((get_cycles() - start) < cycles) cpu_relax(); } static void __timer_const_udelay(unsigned long xloops) { unsigned long long loops = xloops; loops *= arm_delay_ops.ticks_per_jiffy; __timer_delay(loops >> UDELAY_SHIFT); }
3、time和jiffs比較
可以用下面的方法實現忙等待: while(time_before(jiffies, j1)) cpu_relax() 其中,j1是要延遲中止時的jiffies值 cpu_relax()不推薦使用 讓出處理器 while(time_before(jiffies, j2)) schedule() 但是如果當前cpu只有一個進程,那么swapper也就是idle進程運行的機會也是0.