只是为了学习,我尝试在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);
答案 0 :(得分:0)
您的代码肯定是相关的。整个内核使用这些宏并以某种方式工作,所以我怀疑问题是你调用它们的方式。
我最好的猜测是传递给__WORK_INITIALIZER()的不兼容函数指针类型(顺便说一句,请尽可能使用DECLARE_WORK或INIT_WORK)。
工人的职能原型是
typedef void(* work_func_t)(struct work_struct * work);
(定义@ include / linux / workqueue.h)