相关代码
#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()
。此函数不存在。
这里其实是在检测参数的有效性。