ブログ

Armadillo Base OS:VScodeでC言語アプリを作成する方法(シェルプロジェクトを使用)

at_shinya.matsumoto
2023年11月27日 13時07分

Armadillo Base OS搭載製品でVScodeでC言語のプロジェクトを作成する方法を紹介します。

はじめに

本ブログはVScodeでのC言語プロジェクトが選択できる様になるまでの暫定的な手段となります。
この手順ではApp run on Armadilloでのソースの書き換え(デバッグ)が行えませんのでご注意下さい。

また、この手順はインストールするパッケージがほぼ定まっている方向けの実施方法になります。
Armadilloで適宜インストールして試したい場合にはこちらのブログの方法も参照下さい。
Armadilloで動作確認しながらVScodeでコンテナ開発を行う方法

実施手順

今回はこちらの「コンテナでC言語でGPIOを操作する方法」をVScodeで開発します。
以下の手順でC言語で作成したアプリケーションを動作させるコンテナを作成します。

手順
1.プロジェクト作成
2.コンテナのコンフィグファイル(app.conf)作成
3.Dockerfile作成
4.ソースファイルの配置
5.packages.txtの編集
6.コンテナをビルド~SWUインストール
7.動作確認

・以下、ATDE環境を構築済みかつ、VScodeにArmadillo Base OS Development Environmentを
 インストール済みとして説明します。未実施の方は製品マニュアルを参照下さい。
・また、Armadillo内に使用しないコンテナがある場合には事前にコンテナを削除しておきます。
 製品マニュアルのGenerate Container Clear Swuの説明を参照下さい。

1.プロジェクト作成

VScodeを立ち上げ、下記手順で新規にプロジェクトを作成します。
プロジェクト名は任意ですが、本ブログでは test_pj とします。
※製品(A600,A6E,G4/X2)は適宜使用する製品に合わせて選択下さい。

※プロジェクト名を決めると、右下に作成したプロジェクトを①別ウインドウで開くか、
 ②同じウインドウで開くかを聞かれますが、どちらでも問題ありません。
 元のプロジェクトを残しておく場合は①、そうでない場合は②を選ぶと良いと思います。

作成したプロジェクトファイルはこのような構成になっています。

2.コンテナのコンフィグファイル(app.conf)作成

まずコンフィグファイルapp.confを開きます。

app.confを下記の様に書き換えます。

set_image localhost/{{PROJECT}}:latest

add_volumes {{PROJECT}}:/vol_app
add_volumes /var/app/volumes/{{PROJECT}}:/vol_data

# gpiochip5を使用する為追加(DI/DOはgpiochip5)
add_devices /dev/gpiochip5

# gpio.exeをコンテナで実行する様に変更
set_command /root/app/gpio.exe

上記にapp.confを修正後、Ctrl+S で保存して閉じます。

3.Dockerfile作成

Dockerfileでコンテナイメージを作成しますが、ビルドツールなど本番環境では
不要なものをコンテナ内にインストールしない様に作成してみます。
まず、下記の様にDockerfileを開きます。

開いたら下記の様に修正します。

# ------------ビルド環境コンテナイメージの作成(tmp_image)------------
ARG ARCH
FROM docker.io/${ARCH}/debian:bullseye-slim As tmp_image

ARG PRODUCT
COPY resources [r]esources_${PRODUCT} /

ARG PACKAGES
RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y ${PACKAGES} \
    && apt-get clean

# ビルド環境でのみ実行するコマンドを記載
RUN apt install build-essential -y \
    && cd /root/app \
    && gcc gpio.c -o gpio.exe -lgpiod

# ------------本番環境のコンテナイメージの作成------------
ARG ARCH
FROM docker.io/${ARCH}/debian:bullseye-slim

ARG PRODUCT
COPY resources [r]esources_${PRODUCT} /

ARG PACKAGES
RUN apt-get update && apt-get upgrade -y \
    && apt-get install -y ${PACKAGES} \
    && apt-get clean

# tmp_image でビルドしたバイナリファイルを本番環境コンテナにコピー
COPY --from=tmp_image /root/app/gpio.exe /root/app/gpio.exe

4.ソースファイルの配置

Dockerfile内でコンテナ内のソースファイルの位置を /root/app/gpio.c と指定した為、
ソースファイルを resources/root/app/gpio.c に配置します。
手順はVScodeのresourcesディレクトリを右クリック⇒New Folder...を選択し、
resources/root/appとなる様にディレクトリを作成します。
appの下にgpio.cを作成します。(コンソールで作成頂いても問題有りません)

gpio.cのソースコードは下記とします。

#include <stdio.h>
#include <unistd.h>
#include <gpiod.h>
 
int main(void)
{
  const char *appname = "gpiotest";
  const char *chipname = "gpiochip5";     //gpiochip5を指定
  struct gpiod_chip *chip;
 
  struct gpiod_line *line_in, *line_out;
  int value,loop=0;
 
  chip = gpiod_chip_open_by_name(chipname);   //デバイスをオープン
 
  line_in=gpiod_chip_get_line(chip, 0);      //DI1のハンドラを取得(gpiochip5 0)
  gpiod_line_request_input(line_in, appname);   //DI1を入力モードに設定
 
  line_out=gpiod_chip_get_line(chip, 2);    //DO1のハンドラを取得(gpiochip5 2)
  gpiod_line_request_output(line_out, appname, 1);   //DO1を出力モードで初期値1(High)に設定
 
  while(loop<5){
     if(loop%2==0){
        gpiod_line_set_value(line_out, 1);     //DO1を1(High)に設定
     }
     else{
        gpiod_line_set_value(line_out, 0);     //DO1を0(Low)に設定
     }
 
     sleep(1);
 
     value=gpiod_line_get_value(line_in);   //DI1の値を取得
     printf("DI1: %d\n", value);
     loop++;
  }
 
  gpiod_line_release(line_in);      //ポート予約の解除
  gpiod_line_release(line_out);   //ポート予約の解除
  gpiod_chip_close(chip);         //デバイスをクローズ
 
  return 0;
}

5.packages.txtの編集

今回は libgpiod2 libgpiod-dev をビルド環境と本番環境の両方で使用する為、下記の様に
packages.txtに記載し、保存します。本ファイルに記載する事で一括でインストールします。
※packages.txtを使わずにDockerfileに直接書いても問題有りません

6.コンテナをビルド~SWUインストール

下記順に選択し、Generate release swu の右の△をクリックしてコンテナイメージをビルドし、
swuファイル(アップデート用ファイル)を作成します。

作成したSWUファイル(test_pj/release.swu)をインストールします。
実施方法は下記から選択します。実施方法は製品マニュアルを参照下さい。
1.ABOS Webを立ち上げて「SWUインストール」から test_pj/release.swu をインストール
2.USBメモリ/SDカードのTOP階層に release.swu を置いてArmadilloに挿入(自動インストール)

自動でArmadilloがリブートしたらインストールが完了です。

7.動作確認

本コンテナは5秒程で終了する為、ログイン後には既にコンテナが終了しています。
コンソールを接続して下記コマンドを実行すると標準出力を確認できます。

#標準出力を確認
[Armadillo]# podman logs test_pj
DI1: 1
DI1: 0
DI1: 1
DI1: 0
DI1: 1

#もう一度コンテナを動作させる場合
[Armadillo]# podman_start test_pj

以上で、動作確認が完了し、開発が完了となります。
もし、コンテナ内の修正が必要な場合は、各種ファイル修正後に Generate release swu を
再度作成し、インストールを行います。