1. 程式人生 > >嵌入式ARM平臺基於Linux配置應用程式開機自啟動

嵌入式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 的說明請參考

這裡,只是文章是基於 imx7 的,對於 imx6 GPIO的號碼需要修改。

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應用程式開機自啟動方法供參考。