内核模块和用户应用程序使用的库
Library used by kernel module and user application
我正在使用 yocto 并尝试在内核模块和用户应用程序中使用库。
- 内核模块处理一个UART接口
- 库(用 C 语言编写)定义了一个高级协议。因此,它提供了几个函数(例如中断回调)和一个包含各种信息(配置、接收和传输的消息……)的静态结构
- 用户应用程序 应在命令行中调用,如:
app param1 param2 ...
最好的方法是什么?我有我的内核模块和我的用户应用程序 运行,但每次我尝试实现共享库时,它变得非常混乱并且我得到错误(主要是因为包含文件)。
对于此类问题是否有很好的示例或一些关键字可以提供帮助?
由于图书馆在本地存储了一些信息,所以不适合将两个目录中的文件都拷贝过来。
提前致谢!
所以,这是更详细的情况:
UART
UART 文件夹结构:
- /食谱-我的食谱
- /串口
- uart_1.0.bb
- /uart-1.0
- 生成文件
- /src/altera_uart.c
- /公司/altera_uart.h
uart_1.0.bb
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-
2.0;md5=801f80980d171dd6425610833a22dbe6"
inherit module
SRC_URI = " \
file://inc/altera_uart.h \
file://src/altera_uart.c \
file://Makefile \
"
S = "${WORKDIR}"
COMPATIBLE_MACHINE = "cyclone5"
Makefile
obj-m:= uart.o
uart-objs := ./src/altera_uart.o
SRC := $(shell pwd)
all:
$(MAKE) -C $(KERNEL_SRC) M=$(SRC)
modules_install:
$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
clean:
rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
rm -f Module.markers Module.symvers modules.order
rm -rf .tmp_versions Modules.symvers
bitbake uart
工作正常。
用户申请
我的应用叫做 tbdriver。所以这是文件夹结构:
- /食谱-我的食谱
- tbdriver_1.0.bb
- /tbdriver-1.0
- tbdriver.c
- tbdriver.h
tbdriver_1.0.bb
LICENSE = "CLOSED"
SRC_URI = " \
file://tbdriver.c \
"
S = "${WORKDIR}"
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} ${WORKDIR}/tbdriver.c -o tbdriver
}
do_install() {
install -d ${D}${bindir}
install -m 0755 tbdriver ${D}${bindir}
}
bitbake tbdriver
工作正常。
我试过的
所以,我将库 (debug_protocol) 添加到内核模块文件夹,将它们添加到 Makefile 和 .bb 中。因此,bitbake uart
仍然可以正常工作。
- /食谱-我的食谱
- /串口
- uart_1.0.bb
- /uart-1.0
- 生成文件
- / 源
- altera_uart.c
- debug_protocol.c
- /公司
- altera_uart.h
- debug_protocol.h
然后我尝试将 debug_protocol.h 添加到 tbdriver 以访问其功能。 (顺便说一句,我尝试了很多不同的版本)
tbdriver_1.0.bb
...
SRC_URI = " \
file://../../uart/uart-1.0/src/debug_protocol.h \
file://../../uart/uart-1.0/src/debug_protocol.c \
file://tbdriver.c \
"
...
错误
WARNING: tbdriver-1.0-r0 do_fetch: Failed to fetch URL file://../../uart/uart-1.0/src/debug_protocol.h, attempting MIRRORS if available
ERROR: tbdriver-1.0-r0 do_fetch: Fetcher failure: Unable to find file file://../../uart/uart-1.0/src/debug_protocol.h anywhere. The paths that were searched were:
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/poky
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/poky
../meta-ines/recipes-myrecipes/tbdriver/files/poky
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/cyclone5
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/cyclone5
../meta-ines/recipes-myrecipes/tbdriver/files/cyclone5
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/armv7a
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/armv7a
../meta-ines/recipes-myrecipes/tbdriver/files/armv7a
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/arm
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/arm
../meta-ines/recipes-myrecipes/tbdriver/files/arm
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/
../meta-ines/recipes-myrecipes/tbdriver/files/
.../yocto/build/downloads
ERROR: tbdriver-1.0-r0 do_fetch: Fetcher failure for URL: 'file://../../uart/uart-1.0/src/debug_protocol.h'. Unable to fetch URL from any source.
ERROR: tbdriver-1.0-r0 do_fetch: Function failed: base_do_fetch
ERROR: Logfile of failure stored in: ../yocto/build/tmp/work/armv7a-neon-poky-linux-gnueabi/tbdriver/1.0-r0/temp/log.do_fetch.7039
ERROR: Task (/../meta-ines/recipes-myrecipes/tbdriver/tbdriver_1.0.bb:do_fetch) failed with exit code '1'
问题
是否有可能做我正在尝试的事情?
是吗? -> 你有 link 示例或提示吗?
没有?什么是替代方案?系统调用?似乎不适合我,因为我想从两侧(UART 和应用程序)使用函数指针注册函数。但如果我错了请告诉我。
提前致谢!
我相信你误解了如何使用库。根据描述,我了解到您想要在用户 space 应用程序和内核模块中使用一些 code/algo/data 。据我所知,您不能只创建一个库并在用户内核之间共享它们 space 以调用彼此的功能。
要从内核访问用户space,反之亦然,您可以使用系统调用、ioctl、设备驱动程序read/write等。
对于您的特定应用程序,您可以在驱动程序中注册 ioctl 并使用它们启动从用户到内核的消息传递 space。也可以在driver中注册一个字符驱动,对设备文件进行read/write操作,get/send一点大数据。
我正在使用 yocto 并尝试在内核模块和用户应用程序中使用库。
- 内核模块处理一个UART接口
- 库(用 C 语言编写)定义了一个高级协议。因此,它提供了几个函数(例如中断回调)和一个包含各种信息(配置、接收和传输的消息……)的静态结构
- 用户应用程序 应在命令行中调用,如:
app param1 param2 ...
最好的方法是什么?我有我的内核模块和我的用户应用程序 运行,但每次我尝试实现共享库时,它变得非常混乱并且我得到错误(主要是因为包含文件)。
对于此类问题是否有很好的示例或一些关键字可以提供帮助?
由于图书馆在本地存储了一些信息,所以不适合将两个目录中的文件都拷贝过来。
提前致谢!
所以,这是更详细的情况:
UART
UART 文件夹结构:
- /食谱-我的食谱
- /串口
- uart_1.0.bb
- /uart-1.0
- 生成文件
- /src/altera_uart.c
- /公司/altera_uart.h
- /串口
uart_1.0.bb
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/GPL-
2.0;md5=801f80980d171dd6425610833a22dbe6"
inherit module
SRC_URI = " \
file://inc/altera_uart.h \
file://src/altera_uart.c \
file://Makefile \
"
S = "${WORKDIR}"
COMPATIBLE_MACHINE = "cyclone5"
Makefile
obj-m:= uart.o
uart-objs := ./src/altera_uart.o
SRC := $(shell pwd)
all:
$(MAKE) -C $(KERNEL_SRC) M=$(SRC)
modules_install:
$(MAKE) -C $(KERNEL_SRC) M=$(SRC) modules_install
clean:
rm -f *.o *~ core .depend .*.cmd *.ko *.mod.c
rm -f Module.markers Module.symvers modules.order
rm -rf .tmp_versions Modules.symvers
bitbake uart
工作正常。
用户申请
我的应用叫做 tbdriver。所以这是文件夹结构:
- /食谱-我的食谱
- tbdriver_1.0.bb
- /tbdriver-1.0
- tbdriver.c
- tbdriver.h
tbdriver_1.0.bb
LICENSE = "CLOSED"
SRC_URI = " \
file://tbdriver.c \
"
S = "${WORKDIR}"
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} ${WORKDIR}/tbdriver.c -o tbdriver
}
do_install() {
install -d ${D}${bindir}
install -m 0755 tbdriver ${D}${bindir}
}
bitbake tbdriver
工作正常。
我试过的
所以,我将库 (debug_protocol) 添加到内核模块文件夹,将它们添加到 Makefile 和 .bb 中。因此,bitbake uart
仍然可以正常工作。
- /食谱-我的食谱
- /串口
- uart_1.0.bb
- /uart-1.0
- 生成文件
- / 源
- altera_uart.c
- debug_protocol.c
- /公司
- altera_uart.h
- debug_protocol.h
- /串口
然后我尝试将 debug_protocol.h 添加到 tbdriver 以访问其功能。 (顺便说一句,我尝试了很多不同的版本)
tbdriver_1.0.bb
...
SRC_URI = " \
file://../../uart/uart-1.0/src/debug_protocol.h \
file://../../uart/uart-1.0/src/debug_protocol.c \
file://tbdriver.c \
"
...
错误
WARNING: tbdriver-1.0-r0 do_fetch: Failed to fetch URL file://../../uart/uart-1.0/src/debug_protocol.h, attempting MIRRORS if available
ERROR: tbdriver-1.0-r0 do_fetch: Fetcher failure: Unable to find file file://../../uart/uart-1.0/src/debug_protocol.h anywhere. The paths that were searched were:
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/poky
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/poky
../meta-ines/recipes-myrecipes/tbdriver/files/poky
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/cyclone5
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/cyclone5
../meta-ines/recipes-myrecipes/tbdriver/files/cyclone5
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/armv7a
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/armv7a
../meta-ines/recipes-myrecipes/tbdriver/files/armv7a
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/arm
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/arm
../meta-ines/recipes-myrecipes/tbdriver/files/arm
../meta-ines/recipes-myrecipes/tbdriver/tbdriver-1.0/
../meta-ines/recipes-myrecipes/tbdriver/tbdriver/
../meta-ines/recipes-myrecipes/tbdriver/files/
.../yocto/build/downloads
ERROR: tbdriver-1.0-r0 do_fetch: Fetcher failure for URL: 'file://../../uart/uart-1.0/src/debug_protocol.h'. Unable to fetch URL from any source.
ERROR: tbdriver-1.0-r0 do_fetch: Function failed: base_do_fetch
ERROR: Logfile of failure stored in: ../yocto/build/tmp/work/armv7a-neon-poky-linux-gnueabi/tbdriver/1.0-r0/temp/log.do_fetch.7039
ERROR: Task (/../meta-ines/recipes-myrecipes/tbdriver/tbdriver_1.0.bb:do_fetch) failed with exit code '1'
问题
是否有可能做我正在尝试的事情?
是吗? -> 你有 link 示例或提示吗?
没有?什么是替代方案?系统调用?似乎不适合我,因为我想从两侧(UART 和应用程序)使用函数指针注册函数。但如果我错了请告诉我。
提前致谢!
我相信你误解了如何使用库。根据描述,我了解到您想要在用户 space 应用程序和内核模块中使用一些 code/algo/data 。据我所知,您不能只创建一个库并在用户内核之间共享它们 space 以调用彼此的功能。
要从内核访问用户space,反之亦然,您可以使用系统调用、ioctl、设备驱动程序read/write等。
对于您的特定应用程序,您可以在驱动程序中注册 ioctl 并使用它们启动从用户到内核的消息传递 space。也可以在driver中注册一个字符驱动,对设备文件进行read/write操作,get/send一点大数据。