相关代码

#include <linux/delay.h>

……

udelay(4000);

错误提示:

  CC [M]  drivers/g200wo/fpga_config.o

  Building modules, stage 2.

  MODPOST 10 modules

ERROR: "__bad_udelay" [drivers/g200wo/fpga_config.ko] undefined!

make[1]: *** [__modpost] 错误 1

make: *** [modules] 错误 2

错误分析,找到 udelay 的来源为头文件 include/linux/delay.h ,该头文件未定义 udelay ,而是通过 include 文件 include/asm/delay.h 来获取 udelay 的定义。打开 include/asm/delay.h 可以看到 udelay 定义如下:

#define udelay(n)                                                       

         (__builtin_constant_p(n) ?                                      

           ((n) > (MAX_UDELAY_MS * 1000) ? __bad_udelay() :              

                         __const_udelay((n) * ((2199023U*HZ)>>11))) :    

           __udelay(n))

MAX_UDELAY_MS 定义在 include/linux/delay.h 中,值为 3

由此可知,源代码中 udelay 的参数为 4000,大于 3*1000 ,所以 udelay 实际上调用的是 __bad_udelay() 。此函数不存在。

这里其实是在检测参数的有效性。