先日の記事の最後で、「前回の記事で作成したfirst_window.cのコンパイル結果を実行すると、PiTFT35が赤く染まる」と書いたが、具体的な手順について解説する。
まずはじめに環境を整える必要がある。
次にrpi-fbcpの環境をベースにSDKを作成する。
SDKの作成
bitbakeではLinuxイメージを作成するためにクロスコンパイルを行っているが、それとは別に作成されたLinuxの上で動作するアプリケーションを作成するためのクロスコンパイラ(ツールチェイン)を作成することができる。
次の手順で作成する。
$ cd ~/rpi3 $ source poky/oe-init-build-env build_pitft35 $ bitbake core-image-sato -c populate_sdk
SDKのインストーラ、poky-glibc-x86_64-core-image-sato-cortexa7hf-neon-vfpv4-toolchain-2.1.1.sh
がbuild_pitft35/tmp/deploy/sdk
にできあがる。
これを実行し、インストールする。
$ cd tmp/deploy/sdk $ ./poky-glibc-x86_64-core-image-sato-cortexa7hf-neon-vfpv4-toolchain-2.1.1.sh Poky (Yocto Project Reference Distro) SDK installer version 2.1.1 ================================================================= Enter target directory for SDK (default: /opt/poky/2.1.1): You are about to install the SDK to "/opt/poky/2.1.1". Proceed[Y/n]?
デフォルトの設定では/opt/poky/2.1.1
にSDKがインストールされる。
SDKの使用
bitbake実行したシェルとは別のシェルを開いて、次のコマンドを実行する。
$ source /opt/poky/2.1.1/environment-setup-cortexa7hf-neon-vfpv4-poky-linux-gnueabi
これでクロスコンパイルのために必要な設定が環境変数に設定される。たとえば、次のようにしてみると、クロスコンパイル用のコンパイラおよびビルドオプションが確認できる。
$ echo $CC arm-poky-linux-gnueabi-gcc -march=armv7ve -marm -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/poky/2.1.1/sysroots/cortexa7hf-neon-vfpv4-poky-linux-gnueabi
上記はC言語のためのコマンドで、C++の場合は次のようにする。
$ echo $CXX arm-poky-linux-gnueabi-g++ -march=armv7ve -marm -mfpu=neon-vfpv4 -mfloat-abi=hard -mcpu=cortex-a7 --sysroot=/opt/poky/2.1.1/sysroots/cortexa7hf-neon-vfpv4-poky-linux-gnueabi
sourceコマンドによる環境変数の読み込みは、すでに読み込まれているシェルの上で実行するとエラーになる。
hello world
例えば、hello world
のプログラムを作成し、コンパイルを実行してみる。
#include <stdio.h> int main(int argc, char *argv[]) { printf("hello world\n"); return 0; }
$ $CC ./hello.c -ohello
$CC
の環境変数が展開されarm-poky-linux-gnueabi-gcc
コマンドによりコンパイルが実行され、hello
というファイルがされる。
次のようにして、生成されたファイルを確認する。
$ file ./hello ./hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=add3753e8732c8cec29a4b0203819bdc78aed85c, not stripped
ARMのバイナリが生成されていることがわかる。
このhello
ファイルをラズベリーパイ上で実行すると、hello world
と文字が出力される。
コンパイル済みバイナリをラズベリーパイへコピー
方法はいくつかあるが、筆者がよく行うのは次の2つのうちどちらか。
- SDカードをPCにマウントし、
/home/root
などの適当な場所へコピーする。 - LAN環境へ接続し、scpコマンドで転送する。
環境が出来上がってしまえばscpのほうが手軽だと思う。
PiTFT3.5を赤く染める
PiTFTを赤く染める手順をSDKがインストールされた後の手順から示す。
ソースのダウンロード
先日のOpenGLESのソースコードをダウンロードする。
作業は~/fisrt_window
で行う。
$ mkdir ~/first_window $ cd ~/first_window $ git clone https://gist.github.com/1650444ca53d819474c9c69ed2604abb.git
ビルド
sourceでSDKの環境変数を読み込み、ビルドを実行する。
$ cd 1650444ca53d819474c9c69ed2604abb $ source /opt/poky/2.1.1/environment-setup-cortexa7hf-neon-vfpv4-poky-linux-gnueabi $ cmake . $ make
出来上がったfirst_window
ファイルをfbcpのLinuxイメージを書き込んだラズベリーパイの上で実行すると、PiTFT3.5が赤く染まる。