问题描述
我已经用C语言编写了一个toggle.c应用程序,该应用程序用于打开和关闭BeagleBone Black板的GPIO。实际上,它会导致外部LED闪烁。
我希望准备一个Yocto映像,其中包含应用程序的可执行二进制文件,并且它在启动时会自动启动应用程序,从而导致LED闪烁。
我遵循了在网上找到的示例。我的Yocto映像在/ usr / bin中包含了应用程序的已编译二进制文件。我可以从命令行执行它,一切都很好。
但是我的Yocto 生成的图像不会自动启动二进制文件。启动Yocto生成的Linux映像时,LED不闪烁。
我的工作流程是:
- 创建新图层
- 新图层具有自动生成的“食谱示例”目录
- 在“示例示例”下有一个目录,我将其重命名为“切换”
- 在“切换”中有配方toggle_0.1.bb
- 我在“ toggle”中创建了一个名为“ files”的新目录,在其中存储了toggle.c和toggle.service文件
toggle.service文件
[Unit]
Description= A start script from a toggle.c program
[Service]
ExecStart=/usr/bin/toggle
[Install]
WantedBy=multi-user.target
toggle_0.1.bb
DESCRIPTION = "This is a program to toggle GPIO on/off at an interval of 1s"
PRIORITY = "optional"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://toggle.c"
S = "${workdir}"
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} toggle.c -o toggle
}
do_install() {
install -d ${D}${bindir}
install -m 0755 toggle ${D}${bindir}
}
inherit systemd
SYstemD_AUTO_ENABLE = "enable"
SYstemD_SERVICE_${PN} = "toggle.service"
SRC_URI_append = " file://toggle.service "
FILES_${PN} += "${systemd_unitdir}/system/toggle.service"
do_install_append() {
install -d ${D}/${systemd_unitdir}/system
install -m 064 ${workdir}/toggle.service ${D}/${systemd_unitdir}/system
}
我用不同种类的图像配方尝试了同样的事情:最小核心图像,核心图像库,核心图像全cmdline。全部都一样。它们不包含用于在启动时执行应用程序的常规Linux文件,例如/etc/init.d/rc.local。
解决方法
我终于找到了解决问题的方法,但是我使用了 update-rc.d类而不是 systemd 对其进行了整理。由于某些原因,即使我通过用systemd
修改conf/local.conf
将DISTRO_FEATURES_append = " systemd"
添加到图像中,也仍然无法访问systemctl
命令在Yocto Project图像中进行调试。
我的工作解决方案是:
DESCRIPTION = "This is a recipe to launch executable program out of toggle.c at start up."
PRIORITY = "optional"
SECTION = "examples"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://toggle.c"
S = "${WORKDIR}"
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} toggle.c -o toggle
}
do_install() {
install -d ${D}${bindir}
install -m 755 toggle ${D}${bindir}
install -d ${D}${sysconfdir}/init.d
install -m 755 toggle ${D}${sysconfdir}/init.d/toggle
}
inherit update-rc.d
INITSCRIPT_NAME="toggle"
INITSCRIPT_PARAMS= "defaults 10"
有关update-rc.d
和服务的更多信息,我建议选中https://www.jamescoyle.net/cheat-sheets/791-update-rc-d-cheat-sheet。