嵌入式ARM平台基于Linux配置应用程序开机自启动

2019-07-12 15:35发布

By Toradex秦海 1). 简介 嵌入式ARM平台设备采用Embedded Linux操作系统进行开发已经越来越成为主流,本文就着重说明在EmbeddedLinux下配置应用程序开机自启动的方法,并就基于Qt的应用程序卡机自启动脚本的配置进一步说明。   本文所演示的平台来自于ToradexColibri iMX6嵌入式平台,基于NXP iMX6系列核心为Cotrex-A9 的ARM处理器。     2. 准备 a). Toradex Colibri iMX6 模块 Embedded Linux 开发上手指南请参考这里。 b). 本文使用的启动应用程序为如下两个,分别为一个console application 和 Qt Application,功能都是简单的GPIO控制。 ./ Console application – https://github.com/simonqin09/gpiointtest ./ Qt Application - https://github.com/simonqin09/QtGPIOProject     3). 使用Systemd 方式配置开机自启动 a). systemd 是当前 Linux 主流用于系统和服务管理的组件,同时也取代了过去的SysV init 系统,关于systemd的介绍请见这里。 b). System 使用以 ”.service” 结尾的unit 配置文件来管控一个进程,Service 文件一般存放于“/etc/systemd/system/” 或者 “/lib/systemd/system/” 目录下,并可以通过systemctl 命令来启动,使能或者关闭等操作,比如: ---------------------------------------- # 重新加载 systemd unit 配置文件 $ systemctl --system daemon-reload # 查看一个service 的状态,启动和停止这个service(本次启动有效) # systemctl status xxx.service # systemctl start xxx.service # systemctl stop xxx.service # 使能或关闭一个service(下次启动有效) # systemctl enable xxx.service # systemctl disable xxx.service ---------------------------------------- c). 以systemd方式开机启动本文第二章节的 console application 的 service 示例文件如下,关于console application 的说明请参考这里,只是文章是基于 imx7 的,对于 imx6 GPIO的号码需要修改。 https://github.com/simonqin09/gpiointtest/blob/master/gpioint_demo.service   d). 部署测试 ---------------------------------------- # 首先将编译好的 gpiointtest 二进制程序复制到 imx6 模块对应目录 $ cp gpiointtest /usr/bin # 然后将service 文件复制的imx6 模块对应目录,并使能service $ cp gpioint_demo.service /etc/systemd/system $ systemctl --system daemon-reload $ systemctl enable gpioint_demo.service # 最后重新启动后,在串口打印log信息中可以看到 service已经启动的信息 …… [  OK  ] Started gpiointtest service, GPIO interrupt and output control. …… # 此时在载板上面配合按键和LED,可以发现程序已经在后台正常工作了 ----------------------------------------   e). 因为通过systemd启动的进程都是以daemon状态运行,即在后台运行,没有终端或界面显示,因此如果要启动一个有GUI的程序,就要通过一个启动脚本,这个在后面针对Qt程序开机启动章节有进一步介绍。     4). Qt 应用开机启动配置 a). 本章节介绍Qt Application基于上述systemd 开机自启动方法,因为service进程都是后台进程,因此启动如Qt应用这样的GUI应用程序,除了service文件,还需要一个启动脚本来配合。 b). 以systemd方式开机启动本文第二章节的 Qt application 的 service 示例文件如下,关于此 Qt application的说明请参考这里。 qtdemo_launch.service - https://github.com/simonqin09/QtGPIOProject/blob/master/qtdemo_launch.service   c). 配合使用的脚本程序根据调用的显示模块不同而不同,下面分别示例基于framebuffer和X11显示: ./ 基于framebuffer(此处使用linuxfb,也可以换为eglfs)和tslib的启动脚本 “qtdemo.sh”请参考如下: qtdemo.sh - https://github.com/simonqin09/QtGPIOProject/blob/master/qtdemo.sh ./ 目前Qt5的主要版本已经支持直接基于X11显示,因此也可以基于X11配置脚本,下面基于X11启动上述Qt应用的启动脚本示例如下: qtdemo_x11.sh - https://github.com/simonqin09/QtGPIOProject/blob/master/qtdemo_x11.sh   不过为了配合这个脚本,要略微改动下service文件如下: ---------------------------------------- …… [Service] Type=forking ExecStart=/usr/bin/qtdemo_x11.sh start ExecStop=/usr/bin/qtdemo_x11.sh stop …… ----------------------------------------   另外,如果配合使用电阻式触摸屏,发现校准不对,在Qt程序启动后,可以在调试串口下进行如下操作理由xinput来校准并保存校准数据: ---------------------------------------- # 首先运行下面校准程序,通过点击在屏幕上的校准点进行校准 $ xinput_calibrator   # 校准结束后,将打印信息中 Section "InputClass" 开始到 EndSection部分复制出来,类似如下 Section "InputClass"         Identifier      "calibration"         MatchProduct    "stmpe-ts"         Option  "Calibration"  "3724 183 3686 323"         Option  "SwapAxes"      "0" EndSection   # 创建如下文件,然后将上面的信息复制到"99-calibration.conf"文件里面并保存 $ mkdir /etc/X11/xorg.conf.d $ cd /etc/X11/xorg.conf.d $ vi 99-calibration.conf   # 重启后,校准数据会自动生效了,此时自动启动的Qt程序触摸应该可以正常使用了 ----------------------------------------     5). 其他应用开机自启动方法 除了使用systemd ,也有一些其他方法创建应用开机自启动下面逐一介绍 a). Shells 当通过串口,SSH或者图形界面进行login操作的时候,/etc/profile 文件以及 /etc/profile.d 目录下的所有脚本文件都会被执行,因此也可以在此目录下创建基于login的一些开机自启动操作,不过此方法不太适合启动大型应用,更适合做一些环境变量配置等小任务。 b). 图形化界面方式 当登录图形化界面时候,lxsession 会话管理器可以通过下面两种方式自动启动应用程序: ./ LXDE lxsession专用方法,位于 /etc/xdg/lxsession/LXDE/autostart 文件和~/.config/lxsession/LXDE/autostart文件里面的条目会被解析。 ---------------------------------------- # 如下示例添加lxterminal 启动项到autostart文件 @lxpanel --profile LXDE @pcmanfm --desktop --profile LXDE @xscreensaver -no-splash @lxterminal ---------------------------------------- ./ 较通用方法,适用于多数会话管理器,位于 /etc/xdg/autostart/ 目录以及 ~/.config/autostart/ 目录以 .desktop 结尾的文件会被解析执行,关于 .desktop 文件的详细说明可以参考这里。 ---------------------------------------- # 一个同样配置 lxterminal 开机启动的 .desktop 文件示例如下 [Desktop Entry] Name=LXTerminal Type=Application Exec=lxterminal Terminal=false   # 如需取消开机自启动,可将上述文件删除或者添加如下内容即可 NotShowIn=LXDE ----------------------------------------     6). 总结 本文演示了基于ARM平台 Embedded Linux 下普通应用和Qt应用程序开机自启动方法供参考。