嵌入式ARM平臺基於Linux配置應用程式開機自啟動
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控制。
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 的說明請參考
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的說明請參考這裡。
c). 配合使用的指令碼程式根據呼叫的顯示模組不同而不同,下面分別示例基於framebuffer和X11顯示:
./ 基於framebuffer(此處使用linuxfb,也可以換為eglfs)和tslib的啟動指令碼 “qtdemo.sh”請參考如下:
./ 目前Qt5的主要版本已經支援直接基於X11顯示,因此也可以基於X11配置指令碼,下面基於X11啟動上述Qt應用的啟動指令碼示例如下:
不過為了配合這個指令碼,要略微改動下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應用程式開機自啟動方法供參考。