Armadilloフォーラム

C言語クロスコンパラ環境

m.yoshida

2023年10月6日 13時24分

お世話になっております。

Armadillo A6EをC言語をつかって開発していきたい思っております。
できればクロスコンパラをATDE9に構築し、行いたいです。
参考になるサイトもしくは手順教えてきたいただきたく。
下記サイトはAlpine Linux だったのですが、
https://armadillo.atmark-techno.com/forum/armadillo/14009
下記でdebianを使ってましたのでそちらの方法をご教示ねがいます。
https://armadillo.atmark-techno.com/blog/15349/17313
以上よろしくお願いいたします。

コメント

アットマークテクノの古賀です。

m.yoshidaさん:
>Armadillo A6EをC言語をつかって開発していきたい思っております。
>できればクロスコンパラをATDE9に構築し、行いたいです。
>参考になるサイトもしくは手順教えてきたいただきたく。
>下記サイトはAlpine Linux だったのですが、
>https://armadillo.atmark-techno.com/forum/armadillo/14009
>下記でdebianを使ってましたのでそちらの方法をご教示ねがいます。
>https://armadillo.atmark-techno.com/blog/15349/17313

ATDE9 の最新版には、Armadillo-ioT A6E の CPU/SoC 用のクロスコンパイラがインストール済みですので、そちらを使えます。

$ ls /usr/bin/arm-linux-gnueabihf-gcc

を実行すれば、Armadillo-IoT A6E の CPU/SoC 用のクロスコンパイラがインストール済みかどうかが分かります。もし存在しない場合は、ATDE9 の最新版を
 https://armadillo.atmark-techno.com/resources/software/atde/atde-v9
からダウンロードしてください(※ATDE9 の最初の版には、arm-linux-gnueabihf-gcc がインストールされていなかったのです)。

arm-linux-gnueabihf-gcc が ATDE9 にインストール済みの場合は、次のコマンドを実行することで、
 https://armadillo.atmark-techno.com/blog/15349/17313
に記載しているサンプルコードをビルドできます:

$ sudo apt-get install --no-install-recommends -y libgpiod2:armhf libgpiod-dev:armhf
$ arm-linux-gnueabihf-gcc gpio.c -o gpio -lgpiod

なお、ATDE9 で armhtf のクロスコンパイラ(arm-linux-gnueabihf-gcc)を直接実行する代わりに、armhf の Debian コンテナを作り、そのコンテナ上でセルフビルドすることで間接的にクロスビルドする(※QEMU による armhf エミュレーション動作する Debian コンテナで、セルフビルドして armhf の実行ファイルを生成する)という方策も可能です。これは、

>下記サイトはAlpine Linux だったのですが、
>https://armadillo.atmark-techno.com/forum/armadillo/14009

の Alpine Linux を Debian で行う方策です。この方策を使う場合は、次の手順で、armhf の Debian コンテナを作ればよいです。
まず、フォーラムの上のスレッドのコメントに書いたのと同じく、build-rootfs の build.sh を実行して下さい:
 https://armadillo.atmark-techno.com/forum/armadillo/14009#comment-12363

その後、以下のコマンドで Debian コンテナを作成してください:

$ wget https://armadillo.atmark-techno.com/files/downloads/armadillo-iot-a6e/container/at-debian-image-armv7-v1.0.0.tar
$ sudo docker load -i at-debian-image-armv7-v1.0.0.tar
$ sudo docker run --name debian-armv7 -v /usr/bin/qemu-arm-static:/usr/bin/qemu-arm-static --platform arm --mount type=bind,src="$PWD",target=/work -it at-debian-image-armv7:latest /bin/bash

作成した Debian コンテナの bash が対話モードで起動しますので、以後は、
 https://armadillo.atmark-techno.com/blog/15349/17313
と同じ手順でサンプルコードをビルドできます。docker run を実行した時のワーキングディレクトリを、コンテナの /work にマウントしていますので、ビルドしてできたバイナリを /work へコピーすれば、exit でコンテナを終了した時に、コンテナ内でビルドしてできた armhf の実行ファイルが存在しているはずです。

いかがでしょうか?

古賀様
お世話になっております。

少し整理させてください。
>arm-linux-gnueabihf-gcc が ATDE9 にインストール済みの場合は、次のコマンドを実行することで、
> https://armadillo.atmark-techno.com/blog/15349/17313
>に記載しているサンプルコードをビルドできます:

>$ sudo apt-get install --no-install-recommends -y libgpiod2:armhf libgpiod-dev:armhf
>$ arm-linux-gnueabihf-gcc gpio.c -o gpio -lgpiod

上記のコマンドで生成されたファイルをA6Eに適応する方法と
Debian コンテナでやる方法がある認識でよろしいでしょうか?

その場合違いとしてはなんでしょか?(各メリットなどご教示していただきたく)

アットマークテクノの古賀です。

m.yoshidaさん:
>少し整理させてください。
>
>>arm-linux-gnueabihf-gcc が ATDE9 にインストール済みの場合は、次のコマンドを実行することで、
>> https://armadillo.atmark-techno.com/blog/15349/17313
>>に記載しているサンプルコードをビルドできます:

$ sudo apt-get install --no-install-recommends -y libgpiod2:armhf libgpiod-dev:armhf
$ arm-linux-gnueabihf-gcc gpio.c -o gpio -lgpiod

>上記のコマンドで生成されたファイルをA6Eに適応する方法と
>Debian コンテナでやる方法がある認識でよろしいでしょうか?

はい。そうです。

>その場合違いとしてはなんでしょか?(各メリットなどご教示していただきたく)

それぞれの長短は、次のところでしょうか:

・ATDE 9 上でクロスコンパイラを使ってクロスビルド
 - 長所:QEMU + Docker コンテナでビルドするよりも、(おそらく)少し速い。
 - 短所:クロスビルドに必要なパッケージをインストール済みの環境を持ち運ぶためには、仮想マシンのディスクイメージごとコピーしなければならない。

・QEMU + Docker コンテナを使って間接的にクロスビルド
 - 長所:クロスビルドに必要なパッケージをインストール済みの環境を、他の仮想マシンや Linux PC に、コンテナイメージのコピーだけで持ち運びできる。
    (※ただし、持ち運び先には QEMU がインストールされていなければならない。)
 - 長所:元のご質問にあったブログのサンプルコードをビルドする手順を、ブログと同じにできる。
 - 短所:ATDE 9 上でクロスコンパイラを使ってクロスビルドするよりも、(おそらく)少し遅い。

二つの方策の違いは、仮想マシン(ATDE 9)単位でビルド環境が仮想化されているか、コンテナイメージ単位でビルド環境が仮想化されているかです。
ATDE 9 でのクロスビルドに慣れた方であれば、クロスコンパイラを使う方策の方が便利かと思います。

いかがでしょうか?

古賀様
ご説明ありがとうございます。
初歩的な質問になるのですが、
ATDE 9 上でクロスコンパイラを使ってクロスビルド行ったあと、A6Eに書き込む方法はどのようにすればよいでしょうか?
コンパイルした結果下記のような感じ

atmark@atde9:~/gpio_test$ ls
gpio  gpio.c

ご教示ねがいます。
もし参考になるサイト・資料などあれば合わせてお願いいたします。
(下記URLとかですかね?)
https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2…

古賀様

お世話になっております。

五月雨に質問して申し訳ございません。
Debian コンテナの方法もですが下記手順
https://armadillo.atmark-techno.com/blog/15349/17313
5.コンテナイメージ保存~コンフィグファイル修正(自動起動用)
以降は同のようにすればA6Eで動作させることができますか?

アットマークテクノの古賀です。

m.yoshidaさん:
>五月雨に質問して申し訳ございません。
>Debian コンテナの方法もですが下記手順
>https://armadillo.atmark-techno.com/blog/15349/17313
>5.コンテナイメージ保存~コンフィグファイル修正(自動起動用)
>以降は同のようにすればA6Eで動作させることができますか?

Debian コンテナの場合も同じで、ADTDE 9 上の Debian コンテナ内でビルドしてできた armhf バイナリを、USB メモリ経由で Armadillo 上の Debian コンテナへコピーすれば動かせます。

あるいは、ATDE 9 上の armhf な Debian コンテナのイメージを保存して、そのイメージファイルを Armadillo へコピーして、Armadillo (Base OS) のコンテナエンジンである podman でコンテナイメージをロードすれば、ビルド環境ごと実機に持ち運んで動かせます。

以下、余談です。
ちなみに、マニュアルの「CUI アプリケーションを開発する」などの説明で使っている VSCode 開発用エクステンション (Armadillo Base OS Development Environment) での開発手順では、VSCode を使って ATDE 上でアプリケーション入りのコンテナイメージを生成し、生成したコンテナイメージを収録したアップデータイメージ(SWU イメージ)を生成したのち、SWU イメージを Armadillo に ssh で転送してインストール・コンテナを実行、という流れになっています:
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

Armadillo Base OS Development Environment では、現状 C/C++ での開発用のプロジェクトテンプレートを提供していませんが、今後、提供することを検討しています。

アットマークテクノの古賀です。

m.yoshidaさん:
>ご説明ありがとうございます。
>初歩的な質問になるのですが、
>ATDE 9 上でクロスコンパイラを使ってクロスビルド行ったあと、A6Eに書き込む方法はどのようにすればよいでしょうか?

>ご教示ねがいます。
>もし参考になるサイト・資料などあれば合わせてお願いいたします。
>(下記URLとかですかね?)
>https://manual.atmark-techno.com/armadillo-guide/armadillo-guide-1_ja-2…

マニュアルの、「インターフェースの使用方法とデバイスの接続方法」にある「USB ストレージを使用する」の、「ソフトウェア仕様」の節にある「使用方法」の項で、「USB メモリを扱う」をご覧ください:
 https://manual.atmark-techno.com/armadillo-iot-a6e/armadillo-iotg-a6e_p…

ホスト OS 側でマウントした USB メモリをコンテナから扱う場合の手順と、USB メモリをコンテナ内からマウントする場合の手順を説明しています。
ATDE 9 でクロスビルドしてできたバイナリを、USB メモリ経由で Armadillo 上のコンテナ内にコピーする、というのが解になるかと思います。
いかがでしょうか?