Ядро Linux в комментариях

       

Arch/i386/lib/delay.c


6845 /* 6846 * Precise Delay Loops for i386 6847 * 6848 * Copyright (C) 1993 Linus Torvalds 6849 * Copyright (C) 1997 Martin Mares 6850 * <mj@atrey.karlin.mff.cuni.cz> 6851 * 6852 * The __delay function must _NOT_ be inlined as its 6853 * execution time depends wildly on alignment on many x86 6854 * processors. The additional jump magic is needed to get 6855 * the timing stable on all the CPU's we have to worry 6856 * about. 6857 */ 6858 6859 #include <linux/sched.h> 6860 #include <linux/delay.h> 6861 6862 #ifdef __SMP__ 6863 #include <asm/smp.h> 6864 #endif 6865 6866 void __delay(unsigned long loops) 6867 { 6868 int d0; 6869 __asm__ __volatile__( 6870 "\tjmp 1f\n" 6871 ".align 16\n" 6872 "1:\tjmp 2f\n" 6873 ".align 16\n" 6874 "2:\tdecl %0\n\tjns 2b" 6875 :"=&a" (d0) 6876 :"0" (loops)); 6877 } 6878 6879 inline void __const_udelay(unsigned long xloops) 6880 { 6881 int d0; 6882 __asm__("mull %0" 6883 :"=d" (xloops), "=&a" (d0) 6884 :"1" (xloops),"0" (current_cpu_data.loops_per_sec)); 6885 __delay(xloops); 6886 } 6887 6888 void __udelay(unsigned long usecs) 6889 { 6890 __const_udelay(usecs * 0x000010c6); /* 2**32/1000000 */ 6891 }



Содержание раздела