workqueue:__WORK_INITIALIZER编译器警告

时间:2015-02-25 14:13:21

标签: linux-kernel linux-device-driver

只是为了学习,我尝试在Ubuntu 14上编译一个旧的设备驱动程序示例,然后我收到警告。

我猜这个警告是因为__WORK_INITIALIZER返回的类型与work_struct结构之间存在一些不一致而触发的。我不明白的是如何发生这种情况。 :)

这发生在我的文件shortprint.c的第19行,在包含module.h的include行中,根据下面显示的调用堆栈。所以我猜我的代码是无关紧要的,这似乎是在linux包含文件中。我是对的吗?

我正在运行Ubuntu 14.04。

fredrik@fredrik-VirtualBox:~/Documents/lab8_3/shortprint$ make
make -C /lib/modules/3.13.0-45-generic/build M=/home/fredrik/Documents/lab8_3/shortprint modules
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-45-generic'
  CC [M]  /home/fredrik/Documents/lab8_3/shortprint/shortprint.o
  In file included from include/linux/srcu.h:34:0,
             from include/linux/notifier.h:15,
             from include/linux/memory_hotplug.h:6,
             from include/linux/mmzone.h:801,
             from include/linux/gfp.h:4,
             from include/linux/kmod.h:22,
             from include/linux/module.h:13,
             from /home/fredrik/Documents/lab8_3/shortprint/shortprint.c:19:
include/linux/workqueue.h:172:9: warning: initialization from incompatible pointer type [enabled by default]
  struct work_struct n = __WORK_INITIALIZER(n, f)

FWIW我还包括我的makefile:

# Comment/uncomment the following line to disable/enable debugging
#DEBUG = y

EXTRA_CFLAGS += -O2 -I..

ifneq ($(KERNELRELEASE),)
# call from kernel build system

obj-m   := shortprint.o

else

KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD       := $(shell pwd)

default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules

endif


clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

depend .depend dep:
    $(CC) $(CFLAGS) -M *.c > .depend


ifeq (.depend,$(wildcard .depend))
include .depend
endif

更正的代码。该函数在更正之前为void short_do_work(void *):

static void shortp_do_work(struct work_struct *work);
static DECLARE_WORK(shortp_work, shortp_do_work);

1 个答案:

答案 0 :(得分:0)

您的代码肯定是相关的。整个内核使用这些宏并以某种方式工作,所以我怀疑问题是你调用它们的方式。

我最好的猜测是传递给__WORK_INITIALIZER()的不兼容函数指针类型(顺便说一句,请尽可能使用DECLARE_WORK或INIT_WORK)。

工人的职能原型是 typedef void(* work_func_t)(struct work_struct * work);
(定义@ include / linux / workqueue.h)