組込み製品開発に不可欠なクロスプラットフォーム開発とは


組込み製品をセルフプラットフォーム開発することの難しさ

汎用PC上で動作するソフトウェアは、開発から実行までを同じアーキテクチャ上で行うセルフプラットフォーム開発(セルフ開発:下図)で実装されます。汎用PC上で動作するエディタや開発ツール、統合開発環境(IDE)などを利用してプログラムを実装し、ビルドして、テストします。一連の開発は、実行環境と同じ汎用PCのCPU、メモリ、ストレージなどのリソースを利用し、アーキテクチャをまたぐことなくソースコードからバイナリイメージを生成します。近年注目を集めているVisual Studio Code等の開発ツールを簡単に利用できることも、セルフ開発のメリットです。

hypervisor

汎用PC(エンタープライズLinux)は十分なリソースを持つため、セルフ開発手法が一般的


一方、組込み機器上で動作するソフトウェアを同じ組込み機器上で開発することはほぼ不可能です。組込み機器は、その用途に必要で十分な最低限のハードウェアリソースのみを有し、これらのリソースを最大限活用し、最良のパフォーマンスを達成するように設計されています。そのため、開発ツールや統合開発環境を実行するために必要な余剰なリソースは一切ありません(下図)。GUIの無い組込み機器も珍しくないでしょう。そのため、Visual Studio Code等のモダンなツールを活用したセルフ開発は不可能です。さらには、組込み機器のCPU、メモリ、ストレージといったコンピューティングリソースはビルドのワークロードに適した設計でないため、バイナリイメージを生成する作業には多大な時間を浪費してしまいます。こうした理由から、組込み機器の開発では基本的にセルフ開発を採用しません。

hypervisor

組込みシステムは実行に必要なリソースのみを持ち、開発に必要なリソースを搭載しない




クロスプラットフォーム開発(クロス開発)

こうした理由から、組込みLinuxのソフトウェア開発では、開発時と実行時でアーキテクチャが切り替わる「クロスプラットフォーム開発」が主流となっています。クロスプラットフォーム開発では、ソースコードを汎用PCアーキテクチャ上で、プログラムをエディタや統合開発環境(IDE)により実装し、クロスコンパイラを使用して組込み製品のアーキテクチャに対応したバイナリイメージを生成し、プラットフォームをまたいで、ターゲットデバイスのアーキテクチャ上でバイナリイメージを実行します(下図)。

hypervisor

ホストPCによりターゲットデバイス用のソフトウェアを実行できるクロスプラットフォーム開発


クロス開発により生成できるバイナリイメージは、組込みLinuxに組み込まれるアプリケーション、ミドルウェア、デバイスドライバ、カーネルなど多岐に渡ります。いずれもターゲットデバイスのCPUに対応した命令(ISA:命令セットアーキテクチャ)で構成され、ターゲットデバイス上にインストールされている組込みLinuxのミドルウェア、ライブラリ、カーネルと連携して動作可能です。また、クロス開発により汎用PCを開発に利用できることから、Wind River Linux Distro のminimal imageをはじめとするGUIを備えていないターゲットに対しても、Visual Studio Code等のモダンなツールで開発することができます(右図)。

Why Wind River Linux

ホストPC上のVisual Studio Codeを使って開発できる



クロスプラットフォーム開発に欠かせないQEMU

クロス開発により汎用PC上でターゲットデバイスのソフトウェアを開発することはできますが、組込み製品開発では、肝心なターゲットデバイスを入手出来ないことが多々あります。その背景には、ソフトウェアとハードウェアを並行して開発するプロジェクトである場合や、世界的な半導体の供給不足の影響によるもの、ターゲットデバイス1基が非常に高価であり開発者全員分のターゲットデバイスを準備する予算を確保できないことなど様々な理由があります。

こうした状況を打破できる開発ツールがQEMUです。仮想的なハードウェアプラットフォームを生成できるQEMUは、リードタイムゼロ、コストゼロであらゆるターゲットデバイスを汎用PC上に生成することができます。CPUの種別(Intel x86 64-bit、Arm、PowerPC、etc.)や、CPUの構成(シングルコア/マルチコア)、メモリの搭載量、ストレージの搭載量、仮想ネットワークデバイスなどをはじめとする周辺装置(ペリフェラル)の構成など様々なコンフィグレーションが可能です。ただし、QEMUは汎用PC上で、ターゲットデバイス向けのアセンブラコード(例:Arm 64-bit)をすべてソフトウェアにより解読し、エミュレートすることから、実機と比べると動作が非常に遅くなります。特にGUIなど、リッチな機能をテストするためには多くの時間が必要となることを覚えておきましょう。

QEMUを使うことにより、お客様の組込み製品に採用予定のターゲットデバイスと同等の仮想ハードウェアを汎用PC上に生成し、クロス開発で生成したバイナリイメージを手元で直ぐに実行して評価することができます。これによりターゲットデバイスのない状況であってもソフトウェアの開発を推進できる、ターゲットレスな組込み製品開発を実現可能です(下図)。

hypervisor

ターゲットレスな開発を実現できるクロスコンパイラとQEMU



Wind River LinuxのSDKは、クロスプラットフォーム開発環境を提供します。クロスコンパイラをはじめとするターゲットデバイス向けの開発ツールをはじめ、ターゲットデバイスのISAをエミュレートできるQEMUを同梱しています。さらに詳しいWind River Linuxの特徴は、下記の「Wind River Linuxが選ばれる理由」をご参照ください。

Wind River Linuxが選ばれる理由
「基礎からわかるWind River Linux -商用組込みLinux製品のメリットとは」




はじめてのクロスプラットフォーム開発で組込みLinuxアプリケーションを開発しよう

それでは実際に、汎用PCと異なるアーキテクチャ(プラットフォーム)上で動作するWind River Linux Distro向けの組込みLinuxアプリケーションを開発する方法についてご説明します。Wind River Linux Distro向けのアプリケーション開発では、Wind River Linux Distroと同時に入手出来るDevelopment SDKを利用します。開発は下記の手順で行います。

  • 開発/実行環境の準備
  • Development SDKの入手とインストール
  • QEMU上でWind River Linuxを起動
  • アプリケーションの開発
  • アプリケーションのデプロイと実行


hypervisor


開発/実行環境の準備

Wind River Linux Distroを実行するには、LinuxをインストールしたホストPCが必要です。推奨されるホストPCの要件は「Wind River Linux Release Notes:Host System Recommendations and Requirements」をご確認ください。また、「Necessary Linux Host System Libraries and Executables」に掲載されているパッケージも事前にインストールしてください。今回の動画ではホストPCにUbuntu Desktop 20.04(x86 64bit)を選択しています。



Development SDKの入手とインストール

Development SDKはWind River Linux Distroに対応したSDKです。入手方法とインストール方法は「ビルド無し!バイナリ配布で簡単にはじめるYoctoベースの組込みLinuxディストリビューション」をご参照ください。



QEMU上でWind River Linuxを起動

Wind River Linux Distroのminimal imageをQEMU上で起動します。minimal imageの起動方法の詳細は「ビルド無し!バイナリ配布で簡単にはじめるYoctoベースの組込みLinuxディストリビューション」をご参照ください。このQEMUがターゲットデバイスとなります。今回は、このQEMU上のOS内で実行できるアプリケーションを開発します。

QEMUと、ホストPC、それぞれの上で「uname -a」コマンドを実行すると、アーキテクチャを確認できます。QEMUでは「aarch64(Arm 64-bit)」と出力され、ホストPCでは「x86 64-bit」と出力されます。これより、ターゲットデバイスのアプリケーションをホストPCにより開発するには、プラットフォームをまたぐクロスプラットフォーム開発が必要となります。クロスプラットフォーム開発による開発効率向上の例をひとつ挙げると、minimal imageにはGUIがないことから、セルフ開発ではVisual Studio CodeなどのリッチなGUIインタフェースの開発ツールを使うことができませんが、クロス開発により、ホストPCのリソースを活用してVisual Studio Codeなどの先進的な開発ツールを駆使してアプリケーションを実装、開発することができることです。

Why Wind River Linux

ターゲットデバイスのアーキテクチャとホストPCのアーキテクチャ



アプリケーションの開発

それでは実際にアプリケーションを実装してみましょう。今回は「Wind River Linux Distro Quick Start, LTS 21:Creating a Sample Hello World Application」に例として挙げられているHello, World!アプリケーションを実装して、ビルドします(Wind River Linux Distro クイックスタートガイドをご利用の場合、「5.2. Hello Worldアプリケーションの作成」をご参照ください)。まず、ホームディレクトリ内に開発用のディレクトリを作成します(例:mkaddsample)。作成後、ディレクトリ内に「hello.c」と「Makefile」の2個のファイルを作成します。Vimなどのエディタを使っても良いですし、Visual Studio Codeなどのモダンな開発環境を使ってもよいでしょう。

実装後、「. /home/USERNAME/wrlinux-sdk/21.20/environment-setup-cortex72-wrs-linux」を実行します。本コマンドは環境変数に作用し、通常の「make」コマンドから呼び出されるコンパイラやリンカーをx86 64-bit用のものからArm 64-bit用のものへと切り替えます。これにより、本コマンド以降の「make」コマンドは、内部でクロスプラットフォームコンパイラ(クロスコンパイラ)が実行され、Arm 64-bitのバイナリイメージを生成できるようになります。最後に「make」コマンドを実行し、ビルドに成功すると「hello_Linux」が生成されます(下図)。

                        
cd mkappsample/
~/mkappsample$ ls
hello.c  hello_Linux  hello.o  img  install  Makefile  runqemu
~/mkappsample$ file hello_Linux
hello_Linux: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=998a05430142b456e9359564302c02020c8a5b8f, for GNU/Linux 3.14.0, with debug_info, not stripped
                        
                    

Why Wind River Linux

環境変数の切り替えのみで、ビルドをセルフビルドにするかクロスビルドにするか切り替えが可能



アプリケーションのデプロイと実行

最後に、ビルドしたアプリケーションをQEMU上にデプロイし、実行してみましょう。QEMUへのデプロイには「scp」コマンドを使います。ホストPCのIPアドレスを「ip addr」コマンドで確認し、デプロイするファイルのフルパスを確認します(例:/home/USERNAME/ mkappsample/hello_Linux)以上を基に、QEMU上で下記の「scp」コマンドを実行してください。

                        
### QEMU上
# scp USERNAME@ホストのIPアドレス: /home/USERNAME/ mkappsample/hello_Linux ./                            
                        
                    

QEMU上で「scp」コマンドが完了すれば、プログラムの準備は完了です。まず「file」コマンドを実行し、aarch64向けの実行ファイルであることを確認した後、「./hello_Linux」を実行してください。

                        
### QEMU上
# file ./hello_Linux
hello_Linux: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1 Build ID[shar1]=… , for GNU/Linux 3.14.0, with debug_info, not stripped
# ./hello_Linux
Hello World with Wind River Linux!                                                              
                        
                    




ソースコード配布のWind River Linuxに対応したSDK

ソースコード配布のWind River Linuxの場合、ソースコードからLinuxディストリビューションを作成する「bitbake」コマンドのオプションに「-c popurate_sdk_ext」を付与することで、作成したLinuxディストリビューションに対応したSDKを入手することができます。作成したSDKを利用することにより、ターゲットデバイス用のアプリケーションやミドルウェアを汎用PC上で開発することができます。また、QEMUも同梱されており、ターゲットデバイス無しで作成したLinuxディストリビューションの実行が可能です。

右図はWind River LinuxにGUI(XFCE)したLinuxディストリビューションに対応するSDKが生成された様子を示します。SDKの名前は「wrlinux-graphics-10.21.20.11-glibc-x86_64-qemuarm64-wrlinux-image-std-sato-sdk-ext.sh」です。

Why Wind River Linux

ソースコード配布のWind River Linuxに対応するSDK



以上が、Wind River Linux向けの組込みLinuxアプリケーションをクロスコンパイル技術によりビルドする手順です。x86アーキテクチャのボード上でWind River Linux Distro用のアプリケーションを開発する手順については「5.2. Hello Worldアプリケーションの作成」をご参照ください。次回の記事では、Wind River LinuxをカスタマイズするためのLinux Assembly Tool(LAT)についてご紹介します。



リソース