本文轉載於 http://www.eefocus.com/toradex/blog/18-01/426601_a6317.html,特此感謝
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應用程序開機自啓動方法供參考。