本初心者講座は、ルネサスエレクトロニクス社(以降、ルネサス)のArm® Cortex®-Aプロセッサ内蔵マイコン RZ/Gシリーズを初めて使うエンジニア向けの「ルネサスRZ/Gシリーズ入門講座」です。
本初心者講座のゴールは次の3つです。
- マイクロプロセッサ・RZ/Gシリーズの製品仕様、開発環境、アプリケーションを理解する。
- マイクロプロセッサ・RZ/Gシリーズの基本的な使い方を理解する。
- マイクロプロセッサ・RZ/Gシリーズの応用的な使い方を理解する。
*本講座では、マイクロプロセッサをプロセッサと称して説明いたします。
本講座は次の5回シリーズの連載で構成されます。
第1回:RZ/Gシリーズの紹介
第2回:開発環境の整備
第3回:組込みLinuxを動かしてみる
第4回:ユーザーアプリケーションを追加してみる
第5回:サブコアを使ってみる
今回は、第4回の「ユーザーアプリケーションを追加してみる」です。第3回で、「RZ/G Verified Linux Package」を使って、組込みLinuxを動作させましたので、そこにユーザーアプリケーションを追加してみます。
【課題】
1.ユーザーアプリケーション用組み込みLinuxの作成手順を理解する。
ユーザーアプリケーションを追加するための組み込みLinuxの作成手順を学習し、理解します。
2.ユーザーアプリケーションの作り方を理解する。
ユーザーアプリケーションのファイル(main.c)をUbuntu上で、どのように作り、どのディレクトリに配置し、ビルドの際にどのように処理するかを学習し、理解します。
3.ユーザーアプリケーションを含む組み込みLinuxの実行方法を理解する。
組み込みLinuxとユーザーアプリケーションを合体させて、実行する手順を学習し、理解します。
今回は、RZ/G2Lで動作するユーザーアプリケーションの「Hello APS」を作ってみます。Windows PCのTera Term上に「Hello APS」を表示するプログラムです。中身は非常に簡単なプログラムですが、main.cを作るので、応用としてユーザーはその中にアプリケーションプログラムを作れば、実用化できます。
最初に、ソフトウェア開発キット (Software Development Kit :以降、SDK)を作成します。SDKはgccでLinuxアプリを開発するための環境です。SDKを使って、「Hello APS」を作ります。
今回も、「RZ/G Verified Linux Package」(以降、VLP)に含まれている。r01us0616ej0105-rz-g(Linux Start-up Guide RZG2L,LC,UL)(以降、スタートアップガイド)に沿って進めます。
(注意)「第2回:開発環境の整備」と「第3回:組込みLinuxを動かしてみる」を実施して、基本的知識を勉強しておいてください。また、マイクロSDカード(以降、SDカード)は「第3回:組込みLinuxを動かしてみる」で使用したものを使います。
目次
事前準備
機材は「第3回:組込みLinuxを動かしてみる」で使用した評価キット「RZG2L Evaluation Board Kit」を使用します。使用機材と環境については 「第2回:開発環境の整備」と 「第3回:組込みLinuxを動かしてみる」を参照してください。
実際の作業に入る前に、Virtual BoxとUbuntu 20.04をインストールして、VLPをダウンロードしておいてください。
ホストパッケージのインストールからパッチの適用まで
最初の作業手順は「第3回:組込みLinuxを動かしてみる」で行った「7.パッチの適用」までと同じです。簡単に復習しながら進めます。詳しくは「第3回:組込みLinuxを動かしてみる」を参照してください。
①sudoersというグループにapsを登録
最初に、ホストパッケージのインストールを行いますが、何よりも最初は管理者としてコマンドを実行するためのsudoコマンドを使えるように、sudoersというグループにapsを登録します。
$ su root@aps:/home/aps# sudo vi /etc/sudoers.d/aps
apsというファイルが開くので、aps ALL=(ALL) ALLと書き込んで保存して閉じます。exitと入力して、rootから抜けます。
root@aps:/home/aps# exit $ sudo apt-get update
②ホストパッケージをインストール
ビルドホストに必須のホストパッケージをインストールするコマンドを入れます。次のコマンドで、Ubuntuディストリビューションに基づいてホストパッケージをインストールします。
$sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib build-essential chrpath socat cpio python python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping libsdl1.2-dev xterm p7zip-full libyaml-dev libssl-dev bmap-tools
③ユーザー名とメールアドレスの設定
ユーザー名とメールアドレスを設定します。
$ git config --global user.email "you@inscape.co.jp" $ git config --global user.name "Your Name"
④作業ディレクトリの作成
ホームディレクトリに作業ディレクトリを作成し、Yoctoレシピパッケージを展開します。
$ mkdir ~/rzg_vlp_v3.0.6
⑤TK0EF0045Z0021AZJ-v3.0.6-update3.zipのコピー
rzg_vlp_v3.0.6にVLPパッケージの中のTK0EF0045Z0021AZJ-v3.0.6-update3.zipをコピーします。フォルダツールを使うと簡単です。
⑥RTK0EF0045Z0021AZJ-v3.0.6-update3.zipの展開
RTK0EF0045Z0021AZJ-v3.0.6-update3.zipを展開するので、ディレクトリrzg_vlp_v3.0.6に移ります。
$ cd ~/rzg_vlp_v3.0.6
そして、RTK0EF0045Z0021AZJ-v3.0.6-update3.zipを展開します。
$ unzip ./RTK0EF0045Z0021AZJ-v3.0.6-update3.zip
次にrzg_vlp_v3.0.6.tar.gzを展開します
$ tar zxvf ./RTK0EF0045Z0021AZJ-v3.0.6-update3/rzg_vlp_v3.0.6.tar.gz
⑦パッチの作成
rzg_vlp_ v3.0.6ディレクトリで VLP/G v3.0.6-update3 のパッチを作成します。
$ cd ~/rzg_vlp_v3.0.6 $ patch -p1 < ./RTK0EF0045Z0021AZJ-v3.0.6-update3/vlpg306-to vlpg306update3.patch
⑧パッチの適用
まず、glibcをアップグレードするパッチです。
$ cd ~/rzg_vlp_v3.0.6/meta-renesas $ patch -p1 < ../extra/0001-rz-common-recipes-debian-buster-glibc-update-to-v2.2.Patch
次は、48Khz rate audio soundのパッチです。
$ patch -p1 < ../extra/0001-rz-common-linux-update-linux-kernel-to-the-latest-re.patch
最後のパッチはupdating the gstreamer recipeです。
$ patch -p1 < ../extra/0001-rz-common-gst-plugins-bad-Depending-bayer2raw-if-lay.patch
組み込みLinuxのビルド
それでは、bitbakeを使ってビルドをします。
まず、ビルド環境の設定を行います。具体的には、TEMPLATECONFやMACHINEの環境変数を設定して、その値をコマンドに渡しています。
Pokyの'oe-init-build-env'スクリプトを使用してビルドを初期化し、TEMPLATECONFをプラットフォームのconfパスにポイントします。rzg_vlp_v3.0.6ディレクトリに戻ります。そして、TEMPLATECONF…を入力します。
$ cd ~/rzg_vlp_v3.0.6 $ TEMPLATECONF=$PWD/meta-renesas/meta-rzg2l/docs/template/conf/ source poky/oe-init-build-env build
SDKをビルドするには、以下のコマンドを実行します。SDKのビルドの結果は、SDK をインストールするために使用する「インストーラー」です。
bitbakeを使用してターゲットファイルシステムイメージをビルドするコマンドのフォーマットは次のような構成です。
$ MACHINE=bitbake core-image-
ここで、<board>は評価キットの種類です。今回は、RZ/G2L評価キットなのでsmarc-rzg2lです。イメージ名のcore-image-<target>は次の中から選択します。
図1:ビルト時のイメージ
今回は、一般的なアプリケーションをビルドしますので、core-image-westonを使います。以上から、次のコマンドを入力します。
$ MACHINE=smarc-rzg2l bitbake core-image-weston -c populate_sdk
ビルド時間はインターネットとPCの能力に依存しますが、ビルドの完了まで筆者(自宅)の環境で数時間かかりました。
図2:組み込みLinuxのビルド結果
「NOTE: Tasks Summary: Attempted 5575 tasks of which 0 didn't need to be rerun and all succeeded.
Summary: There were 87 WARNING messages shown.」ということで、これでビルドは完了です。
注)スタートアップガイドには、次のようなNoteが書かれています。
The SDK build may fail depending on the build environment. At that time, please run the build again after a period of time.
(ビルド環境によってはSDKのビルドに失敗する場合があります。その場合は、しばらくしてから再度ビルドを実行してください。)
これによると、手順を間違えなくても、実施環境によってはエラーが出るみたいです。本連載の執筆時は、一回目でパスしたので手順は間違っていないと確信できたのですが、全く同じ手順で別の日にビルドしたらエラーが発生しました。また、同じ日でも別の時間ではパスしました。何度かやってみましたが、エラーになる回数が多かったと思います。
これでは、エラー発生時に何が原因かわかりません。特に、一回目からエラーが出てしまった場合はエラーの原因解析に時間がかかってしまいます。
対策として、次のコメントも書かれています。Or build it again from scratch with the below commands.(または、以下のコマンドで最初から再度ビルドしてください。)何度か試してもエラーが取れない時は、次のコマンドを試してみてください。
$ cd ~/rzg_vlp_/build $ MACHINE= bitbake core-image-weston -c cleanall $ MACHINE= bitbake core-image-weston For building general applications: $ MACHINE= bitbake core-image-weston -c populate_sdk For building Qt applications: $ MACHINE= bitbake core-image-qt -c populate_sdk
ただ、筆者もこれを試しましたが、同じエラーが出て解決しませんでした。お勧めとしては、エラーが出たら、手順を見直しながら何度か試してみると良いと思います。
SDKの抽出
ビルドが完了すると、次のファイル(SDKインストーラー)ができます。
poky-glibc-x86_64-core-image--weston -aarch64-smarc-rzg2l-toolchain-3.1.31.sh
これは、/rzg_vlp_v3.0.6/build/tmp/deploy/sdkに配置されます。 SDKインストーラーの拡張子は.shです。インストーラーを実行するには、次のコマンドを実行します。
$ sudo sh ~/rzg_vlp_v3.0.6/build/tmp/deploy/sdk/poky-glibc-x86_64-core-image-weston-aarch64-smarc-rzg2l-toolchain-3.1.31.sh
次のメッセージが出たら何も入力せずに「Enter」します。
Enter target directory for SDK (default: /opt/poky/3.1.31): [ENTER]
次は「y」を入力します。
You are about to install the SDK to "/opt/poky/3.1.21". Proceed [Y/n]? y
図3:SDKインストーラーの実行結果
実行結果の最後に「Each time you wish to use the SDK in a new shell session, you need to source the environment setup script(新しいシェルセッションでSDKを使用する時は、環境セットアップスクリプトをソースする必要があります)」 と書かれて、さらに使い方の例、
$ . /opt/poky/3.1.31/environment-setup-aarch64-poky-linux
が書かれています。一方、スタートアップガイドで、クロスコンパイル環境をセットアップするコマンドはsourceコマンドを使用していて、次のように書かれています。
$ source //environment-setup-aarch64-poky-linux
注)ユーザーはログイン セッションごとに上記のコマンドを 1 回実行する必要があります。
基本的にドットコマンド(.)とsourceコマンドは、同等のコマンドですので、今回はUbuntuの画面に表示されたドットコマンドをコピー&ペーストして使います。
$ . /opt/poky/3.1.31/environment-setup-aarch64-poky-linux
ユーザーアプリケーションの作成とビルド
次に、ユーザーアプリケーションを作ります。
組み込みLinux上でユーザーアプリケーションを実行するには、アプリケーションのソースファイル、Makefile、configureファイルの3つのファイルが必要です。
基本的な手順は、アプリケーションのソースファイルを作って、ビルドすればいいのですが、ビルドする時に、様々なオプションを指定して実行しなければなりません。すると、オプションラインが長々となって、入力が大変なのと、間違いを起こしやすくなります。
そこで、makeコマンドとMakefileを使います。コマンドラインをMakefileというファイルに記述しておき、makeコマンドを実行すると、Makefileに書かれたコマンドをオプション付きで実行してくれます。これだと、コマンドとオプションコマンドをいちいち入力しなくても、ビルドできます。すなわち、makeコマンドを使うと、実際のコマンドラインの内容はどんなに長くて複雑でも、makeの4文字のみの入力で操作が完了してとても便利です。
スタートアップガイドではMikefileを使った方法が、ステップ毎に説明されていますので、スタートアップガイドのステップに沿って、実行していきましょう。
ステップ1
まず、LinuxホストPC上にアプリケーション用の作業ディレクトリを作成します。
今回は「hello_aps」にします。
$ mkdir ~/hello_aps
フォルダツールで、hello_apsフォルダができていることを確認します。
図4:アプリケーション用の作業ディレクトリを作成
ステップ2
アプリケーションのディレクトリに、アプリケーションファイルmain.cとMakefileを作ります。
configureファイルは自動的に作られるようにします。ファイルを作るのはtouchコマンドを使います。ターミナルに戻って、hello_apsフォルダ内に移ります。
$ cd ~/hello_aps
そして、
$ touch main.c
と、入力します。すると、main.cという空のファイルができます。
図5:main.c(まだ空)を作成
フォルダツールで、main.cをダブルクリックして、開けます。次のコードを記入します。単純に「Hello APS」を出力するだけのコードです。記入が終わったら、保存して、ファイルを閉じます。
#includeint main(int argc, char** argv) { printf("\nHello APS\n"); return 0; }
図6:main.cにソースコードを記述する
同じようにして、Makefileも作ります。ソースコードは次のようになります。
1行目に生成したいターゲットファイル名(linux-aps)、2行目はソースファイル名(main.c)
3行目以降に生成するための実行コマンドを記載します。実行コマンドの先頭にはTabを入力します。Tabではなくspaceを入れてしまうと「Makefile:8: *** 分離記号を欠いています. 中止.」と言うエラーが出ますので注意してください。
今回は、次のコマンドの前にTabを入れます。
$(CC) -o $(APP) $(SRC) $(CFLAGS) install -D -m755 $(APP) $(DESTDIR)/home/root/$(APP) rm -rf $(APP)
ソースコードの全体は次のようになります。
APP = linux-aps SRC = main.c all: $(APP) CC ?= gcc # Options for development CFLAGS = -g -O0 -Wall -DDEBUG_LOG $(APP): 【Tab】 $(CC) -o $(APP) $(SRC) $(CFLAGS) install: 【Tab】 install -D -m755 $(APP) $(DESTDIR)/home/root/$(APP) clean: 【Tab】 rm -rf $(APP)
図7:Makefileのソースコード
ステップ3
Makefile を使用してアプリケーションを作成します。
$ make
図8:make結果
作成後、hello_apsフォルダに実行アプリケーション(ファイル名は「linux-aps」)が生成されていることを確認します。
図9:linux-apsの確認
ステップ4
ビルドしたバイナリをSDカードに書き込んで、RZ/G2Lの評価キットで動作を確認します。
今回も、USBのカードリーダーを使用しました。SDカードをPCに差すと、Windowsがデバイスを認識しますが無視して、仮想環境側のLinuxで認識させます。
VirtualBoxで[デバイス]メニューの[USB][Generic Mass Storage device[0100]を選択します。
このSDカードは「第3回:組込みLinuxを動かしてみる」で使用したものをそのまま使います。SDカードをWindowsなどで初期化しないでください。初期化すると、次に示す「cd /media/usr/bin」でエラーになります。
SDカードの準備ができたら、サンプルアプリケーションを次の手順で作成します。
$ sudo mount /dev/sdb2/media/ $ cd /media/usr/bin $ sudo cp ~/hello_aps/linux-aps . $ sudo chmod +x linux-aps
図10:アプリケーションのバイナリをSDカードに書き込む
注) 「sdb2」は、使用しているシステムによって異なります。確認するには、lsblkコマンドでSDカードの中身を確認します。/media/aps/rootが指定されているところです。
ユーザーアプリケーションの実行
RZ/G2L 評価ボードキットの電源を入れ、システムを起動します。起動の手順は「第3回:組込みLinuxを動かしてみる」で行った「電源接続」から「フラッシュライタをRAMにダウンロード」→「ブートローダを書き込む」→「ノーマルブートモード」までを参考にしてください。
リセットボタンを押して、プログラムを実行させるとloginラインが出てきます。そこにrootと入力します。すると、プロンプトがroot@smarc-rzg2l:~#となりますので、/usr/bin/linux-apsと入力します。すぐ下の行に「Hello APS」と表示されれば、プログラムは正常に実行されました。
smarc-rzg2l login: root root@smarc-rzg2l:~# /usr/bin/linux-aps Hello APS
図11:アプリケーションの実行結果
Renesas RZ/G HMI SDK
最後に、HMI SDK(RenesasRZ/G HMI SDK)を紹介します。HMI SDKは、Linux HMI(Human Machin Interface)アプリケーションの開発に必要なソフトウェアが含まれたオールインワンパッケージで、RZ/G評価キット用のLinux HMIアプリケーション開発環境を提供しています。
非常に使いやすいため、Linuxの初心者がLinuxプロセッサを使用するハードルを下げ、迅速かつ簡単な開発環境を提供します。ユーザーは、すべてのソフトウェア(HMIに最適のGUIフレームワークとライブラリなどを含む)を無償で使うことができます。
図12:HMI SDKの概要
HMI SDKの詳細については、 HMI SDK「ワンストップ」ウェブサイトを参照してください。ボードの準備からソフトウェア開発までを、ワンストップで説明するウェブサイトです。ボードの入手、Linux環境の準備、HMI SDKのインストール、HMIサンプルアプリケーションの実行までのすべてを説明しています。
図13:HMI SDK「ワンストップ」ウェブサイト
使い方は、いたって簡単です。 「Getting Started」が準備されています。これは、HMIアプリケーションの実行方法を習得するためのガイドです。開発環境のセットアップ、HMIアプリケーションのコンパイル、ボードのセットアップ、そしてHMIアプリケーションの実行手順について説明していますので、これに従って操作すれば簡単です。
使い方を説明した YouTubeも用意されています。英語の動画ですが、簡単な英語なので、英語が得意でなくても理解できます。
図14:使い方を説明したYouTube
以上で、「第4回:ユーザーアプリケーションを追加してみる」は終わりです。次回は、最終回の「第5回:サブコアを使ってみる」です。メインコアCortex-A55の使い方が分かったので、次にRZ/G2Lにサブコアとして搭載されているCortex-M33を使ってみます。