工控網首頁
>

應用設計

>

導入C_C++應用到Torizon

導入C_C++應用到Torizon

1). 簡介

對于初次使用Torizon的客戶,可能會需要將現有的項目工程導入到Torizon開發環境,本文就基于一個中等規模的開源項目來演示如何借助Torizon Virtual Studio Code Extension來將其導入到Torizon,并進行編譯和部署。

 

本文所選擇的是一個基于autotools編譯框架的中等規模的項目,基本上符合大多數嵌入式應用的規模,通過整個流程演示來提供相關的思路和解決導入中遇到問題的線索,當然由于實際應用的不同以及所采用比如Makefiles、Cmake等其他編譯框架,不能完全保證所有的導入都是按照文章所演示的流程,甚至是否一定能夠導入成功也肯定不是完全確定,但是大的思路是可以參考借鑒的。

 

 

2)準備

a). Apalis iMX8 ARM核心版配合Ixora載板,連接調試串口UART1(載板X22)到開發主機方便調試,連接HDMI顯示器用于顯示。

 

b). Ubuntu 18.04 64bit開發主機,參考這里說明配置好Docker環境。請注意在每次重啟電腦后,都要執行一次下面命令來提供ARM emulation環境。

----------------------------------------------------------------------------

$ docker run --rm -it --privileged torizon/binfmt

----------------------------------------------------------------------------

 

c). 參考這里的說明配置好Virtual Studio Code并安裝好Torizon Extension。

 

d). 參考這里的說明使用VS Code配合Torizon Extension,編譯測試一個Hello world C/C++應用來驗證整個開發和部署環境工作正常。

 

 

3)導入C/C++項目

a). 本次測試所使用的開源項目Fuse從如下github地址下載,項目是一個跨平臺的針對1980年代流行的Sinclair ZX Spectrum 8bit 個人鍵盤式電腦的模擬器。項目于基于C語言開發并擁有一個基于Gtk開發的用戶界面,雖然Debian已經提供了現成的Fuse安裝包,但是本文主要演示導入項目源碼并進行編譯和部署的流程。

----------------------------------------------------------------------------

### download fuse-emulator-fuse source code

$ git clone https://git.code.sf.net/p/fuse-emulator/fuse fuse-emulator-fuse

### download libspectrum library source code

$ cd fuse-emulator-fuse

$ git clone https://git.code.sf.net/p/fuse-emulator/libspectrum fuse-emulator-libspectrum

----------------------------------------------------------------------------

 

b). 通過VS Code Torizon Extension將上面下載的 fuse-emulator-fuse項目導入

./ VS Code執行 Torizon: Import an existing C/C++ application”命令

----------------------------------------------------------------------------

Open the fuse base source folder (fuse-emulator-fuse)

Define the application name (fuse)

Select autotools-based project as the project type

Select “Wayland arm64v8-vivante bullseye platform (as we use apalis imx8 which is 64-bit)

Select user as torizon (default)

Select debug configuration

Provide the relative path (bin/fuse) where main executable binary will be installed into.

----------------------------------------------------------------------------

 

c). 然后Torizon extension會根據上面配置信息自動創建一個編譯容器,重新加載VS Code并通過Microsoft Remote-containers extension來在創建的編譯容器中運行導入的項目

 

d). 創建完成后Output輸出會給出如下Error,這個在當前這個階段是正常的,后面修改配置文件會解決。

----------------------------------------------------------------------------

checking for LIBSPECTRUM... no

configure: error: in `/workspaces/fuse-emulator-fuse':

configure: error: The pkg-config script could not be found or is too old.  Make sure it

is in your PATH or set the PKG_CONFIG environment variable to the full

path to pkg-config.

 

Alternatively, you may set the environment variables LIBSPECTRUM_CFLAGS

and LIBSPECTRUM_LIBS to avoid the need to call pkg-config.

See the pkg-config man page for more details.

 

To get pkg-config, see.

See `config.log' for more details

The terminal process terminated with exit code: 1

----------------------------------------------------------------------------

 

 

4). 添加編譯依賴庫

a). 通常你可以通過查詢項目源碼提供的READMEINSTALL等文件查詢到項目編譯所需要的依賴庫,但有時候也可能不那么明確,就需要直接查詢源碼文件,或者只能通過 測試-失敗-修改-測試 的循環來找出所需要的依賴庫。

 

b). 然后,添加的依賴庫要對應所需要編譯的平臺和版本,比如本文測試的平臺是arm64環境,版本是Debian bullseye。通??梢酝ㄟ^在Package.debian.org 上面查詢相關的庫,也可以參考這里說明直接在模塊上面交互模式運行一個基礎Debian bullseye容器,并在容器內通過”apt-cache search” 命令查詢所需要的庫。

 

c). fuse項目所需要的依賴庫參考如下添加,添加完成后VS Code會自動彈出窗口詢問是否重新編譯SDK并添加新的庫,選擇是進行重新編譯。

----------------------------------------------------------------------------

Select Torizon icon in the Visual Studio Code activity bar.

Go to the CONFIGURATION panel.

Set the property “devpackages” to:

libglib2.0-dev:arm64 libaudiofile-dev:arm64 libgtk-3-dev:arm64 bison flex

----------------------------------------------------------------------------

 

 

5). 修改項目Build Tasks

a). 項目Build TasksVS Code 項目文件管理器中的 “.vscode/tasks.json” 文件中定義,包含configure/build等任務的定義,并通過autotools生成真正的makefile用于編譯。

 

b). 由于fuse項目編譯所需要的libspectrum庫需要先于fuse項目本身進行編譯并生成binary庫文件被調用,因此這里需要對應修改tasks.json文件以適配,而如果你的項目不包含這樣的庫,則無需這個步驟。

 

c). 首先添加如下內容到tasks.json文件增加libspectrum庫的configurebuild 子任務

----------------------------------------------------------------------------

{

            "label": "autoreconf_libspectrum",

            "command": "autoreconf",

            "type": "shell",

            "args": [

                "--install",

                "--force"

            ],

            "options": {

                "cwd": "${workspaceFolder}/fuse-emulator-libspectrum"

            },

            "problemMatcher": [],

            "group": "none"

        },

        {

            "label": "configure_libspectrum",

            "command": "./configure",

            "type": "shell",

            "args": [

                "--prefix",

                "${workspaceFolder}",

                "--host",

                "${command:torizon.ccpp.getHostTriplet}"

            ],

            "options": {

                "cwd": "${workspaceFolder}/fuse-emulator-libspectrum"

            },

            "problemMatcher": [],

            "group": "none",

            "dependsOn": [

                "autoreconf_libspectrum"

            ]

        },

        {

            "label": "build_libspectrum",

            "command": "make",

            "type": "shell",

            "args": [

                "install-strip"

            ],

            "problemMatcher": {

                "base": "$gcc"

            },

            "options": {

                "cwd": "${workspaceFolder}/fuse-emulator-libspectrum",

                "env": {

                    "CFLAGS": "-g",

                    "CXXFLAGS": "-g"

                }

            },

            "group": "build",

            "dependsOn": [

                "configure_libspectrum"

            ]

        },

----------------------------------------------------------------------------

 

d). 然后修改tasks.json文件中fuse主應用本身configure/build配置增加libspectrum庫的編譯任務,同時還需要配置pkgconfig環境變量以便于從libspectrum編譯目錄找到對應的 .pc 描述文件。

----------------------------------------------------------------------------

{

            "label": "configure_debug",

            "command": "./configure",

            "type": "shell",

            "args": [

                "--prefix",

                "/${command:torizon.getAppName}",

                "--host",

                "${command:torizon.ccpp.getHostTriplet}",

                "CFLAGS=-g",

                "CXXFLAGS=-g",

                "LDFLAGS=-g"

            ],

            "problemMatcher": [],

            "options": {

                "env": {

                    "PKG_CONFIG_PATH": "${env:PKG_CONFIG_PATH}:${workspaceFolder}/lib/pkgconfig"

                }

            },

            "group": "none",

            "dependsOn": [

                "autoreconf",

                "build_libspectrum"

            ]

        },

        {

            "label": "configure_release",

            "command": "./configure",

            "type": "shell",

            "args": [

                "--prefix",

                "/${command:torizon.getAppName}",

                "--host",

                "${command:torizon.ccpp.getHostTriplet}"

            ],

            "problemMatcher": [],

            "group": "none",

            "dependsOn": [

                "autoreconf",

                "build_libspectrum"

            ]

        },

----------------------------------------------------------------------------

 

e). 最后修改tasks.json文件的deploy任務,新增libspectrum庫的deploy子任務,以及fuse主應用deploy任務中增加libspectrum庫。

----------------------------------------------------------------------------

{

            "detail": "deploy application to work folder",

            "label": "deploy",

            "command": "make",

            "args": [

                "install"

            ],

            "type": "shell",

            "options": {

                "env": {

                    "DESTDIR": "${workspaceFolder}/${config:torizon.appfolder}/work"

                }

            },

            "group": "none",

            "dependsOn": [

                "deploy_libspectrum"

            ]

        },

        {

            "detail": "deploy libspectrum to work folder",

            "label": "deploy_libspectrum",

            "command": "install",

            "args": [

                "-D",

                "-t",

                "${workspaceFolder}/${config:torizon.appfolder}/work/${command:torizon.getAppName}/lib",

                "lib/libspectrum.so.*"

            ],

            "type": "shell",

            "group": "none"

        }

----------------------------------------------------------------------------

 

f).最終完整的tasks.json文件可以參考這里,保存所有修改后,執行””命令重新加載,然后執行Tasks:Run Build Task任務,此時就可以將fuse項目完整編譯成功。

 

6). 增加Runtime庫支持

a). 如下增加runtime庫支持,使得應用部署后可以正常運行

----------------------------------------------------------------------------

Select Torizon icon in the Visual Studio Code activity bar.

Go to the CONFIGURATION panel.

Set the property “extrapackages” to:

glib2.0 libaudiofile1 libgtk-3-0

----------------------------------------------------------------------------

 

7). 增加應用Wayland SocketAudio設備的訪問權限

a). 為了顯示應用界面,一個Wayland compositor也會在設備上同步下載啟動,為了和Wayland compositor交互,需要增加位于/tmpWayland socket訪問權限,更多關于添加volumesbind-mount的說明可以參考這里。

----------------------------------------------------------------------------

Select Torizon icon in the Visual Studio Code activity bar.

Go to the CONFIGURATION panel.

- Press the + button near “volumes”

- Insert “/tmp” as the key value, press Enter to confirm

- Insert “/tmp” also as value, press enter to confirm

----------------------------------------------------------------------------

 

b). 應用需要訪問設備OSS音頻設備來運行,如下在應用container中增加所需音頻設備的訪問權限

----------------------------------------------------------------------------

Select Torizon icon in the Visual Studio Code activity bar.

Go to the CONFIGURATION panel.

- Press the + button near [ ] devices

- Insert the device path /dev/dsp”, press Enter to confirm

----------------------------------------------------------------------------

 

 

8). 設置 Shared Libraries Path 環境變量

a). libspectrum 庫會被部署到fuse應用目錄的 /lib 子目錄,因此需要增加如下環境變量指定相關路徑。更多關于環境變量的說明請參考這里。

 

b). 參考這里說明修改config文件添加開機畫面圖片

----------------------------------------------------------------------------

Select Torizon icon in the Visual Studio Code activity bar.

Go to the CONFIGURATION panel.

Set the property “env” to:

ENV LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/#%application.appname%#/lib"      

----------------------------------------------------------------------------

 

 

9). Update MIME Database

a). 由于一個Gtk相關的問題,在Debug應用時候,需要運行update-mime-database 工具來加載應用圖標,因此我們可以通過如下設置在配置好的container環境中運行相關命令

----------------------------------------------------------------------------

Select Torizon icon in the Visual Studio Code activity bar.

Go to the CONFIGURATION panel.

Set the property “buildcommands” to:

RUN update-mime-database /usr/share/mime

----------------------------------------------------------------------------

 

 

10). 通過Ycoto定制TorizonCore鏡像

a). 由于默認的TorizonCore系統只有Alsa音頻的支持,并未提供OSS音頻的支持,因此我們需要通過Ycoto重新編譯TorizonCore鏡像來增加OSS音頻支持,以便fuse應用在設備上面運行

 

b). 首先參考這里的說明下載適用于Apalis iMX8 TorizonCore v5.4.0版本對應的Linux Kernel源代碼,參考這里進行編譯配置。

 

c). 如下修改Kernel configuration,增加Alsa OSS Emulation驅動。修改后重新編譯生成.config配置文件,并重命名為defconfig文件以備后續使用。

----------------------------------------------------------------------------

Device Drivers > Sound card support > Advanced Linux Sound Architecture

[*]   Enable OSS Emulation

    OSS Mixer API

    OSS PCM (digital audio) API

[*]       OSS PCM (digital audio) API - Include plugin system

----------------------------------------------------------------------------

 

d). 參考這里配置Torizon Ycoto編譯環境,增加如下文件以適配修改的Kernel configuration。

./ 創建 “linux-toradex_5.4-2.3.x.bbappend” 文件,指定修改的defconfig Kernel configuration文件

----------------------------------------------------------------------------

$ cd/layers/meta-toradex-torizon/recipes-kernel/linux

$ vi linux-toradex_5.4-2.3.x.bbappend

FILESEXTRAPATHS_prepend := "${THISDIR}/files:"

 

SRC_URI_append = " \

    file://defconfig \

"

----------------------------------------------------------------------------

 

./ 創建files目錄,將上一步生成好的defconfig文件復制到這里

----------------------------------------------------------------------------

$ mkdir files

$ cp .../defconfig files

----------------------------------------------------------------------------

 

e). 重新編譯生成TorizonCore 鏡像,然后參考這里的說明安裝到Apalis iMX8模塊上面。

----------------------------------------------------------------------------

$ bitbake torizon-core-docker

----------------------------------------------------------------------------

 

 

11). 在設備上面部署運行Fuse應用

a). 參考這里說明在VS Code中連接更新好TorizonCore 鏡像的Apalis iMX8模塊。系統啟動后,通過調試串口執行下面命令加載PCM_OSS驅動

----------------------------------------------------------------------------

$ sudo modprobe snd-pcm-oss

$ ls /dev/dsp*

/dev/dsp  /dev/dsp1  /dev/dsp2

----------------------------------------------------------------------------

 

b). 此時基于上述步驟5以及編譯好的Fuse項目,接下來就可以進行Debug或者Deploy

 

c). 輸入F5即可以開始Debug,Torizon Extension會自動完整生成debug container并部署到模塊運行進入Debug模式狀態,按需要設置斷點既可以進一步調試了。

導入C_C++應用到Torizon_web14474.png 

 

d). 調試完成后,也可以通過下面命令將Fuse應用Deploy到設備上面并運行應用

----------------------------------------------------------------------------

### compile release container ###

- Command  Torizon: Build release container for the application

### deploy release container ###

- Command  Torizon: Deploy release container

### run release container ###

- Command  Torizon: Run/restart release container

----------------------------------------------------------------------------

 

運行效果

導入C_C++應用到Torizon_web14942.png 

 

 

12)總結

本文演示了基于NXP iMX8 ARM處理器將現有C/C++導入到Torizon的一個示例供參考,具體不同項目所需要的流程和遇到的問題可能會不同,但解決問題的思路可以參考借鑒。

 

 

參考文檔

https://developer.toradex.cn/knowledge-base/torizon-cc-application-importing-example


審核編輯(
王靜
)
投訴建議

提交

查看更多評論
其他資訊

查看更多

UBI只讀文件系統

通過Ycoto Project定制嵌入式Ycoto Linux鏡像

在嵌入式 Linux 設備上使用 Flutter 開發圖形界面

TorizonQt容器中文顯示

IoT 安全系列博文第三篇 軟件更新安全:常見的錯誤