Yocto Dunfell在启动时运行应用程序

问题描述

我已经用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.confDISTRO_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