ブログ

Armadillo Base OS:ABOSDEでC++のアプリを作る方法

at_shinya.matsumoto
2025年10月3日 17時46分

Armadillo Base OSではVScodeでABOSDEエクステンションを使ってアプリケーションを開発します。
その中でC++は標準プロジェクトが無い為、C言語プロジェクトを使った方法を紹介します。

実施手順

ここではArmadillo-IoT A6EのDI1の論理を判定するアプリケーションをC++で作成します。
以下、製品マニュアルの通りにinitial_setupやネットワーク設定が完了した前提で進めます。

<本内容に含まれないもの> ※手順は同じ為、製品マニュアルを参照下さい。
・【必須】Armadilloとの接続設定
・【必須】initial_setup
・【任意】ネットワーク設定
・【任意】拡張ハードウェア設定
・【任意】ABOSDEのSSH設定(デバッグする際は必須)

1.プロジェクト作成

C New ProjectからC言語用プロジェクトを作成します。プロジェクト名や保存先は任意で構いません。
ここではA6Eを選択していますが、製品は適宜合わせてください。

2.コンテナ起動ファイルapp.confの変更

app.confを下記のように変更します。
A6EのDI1はgpiochip5 0の為、gpiochip5のアクセス権限を付けます。

set_image localhost/{{PROJECT}}:latest

add_volumes /var/app/rollback/volumes/{{PROJECT}}:/vol_app:ro
add_volumes /var/app/volumes/{{PROJECT}}:/vol_data
add_armadillo_env

add_volumes /sys:/sys
add_devices /dev/gpiochip5

set_command c_launch

3.Dockerfileを編集

こちらはデフォルトから変更はしておりません。
コンテナイメージに手を加えたい場合は必要に応じて編集ください。

ARG ARCH
FROM docker.io/${ARCH}/debian:bullseye-slim
LABEL version="2.0.0"

COPY resources/etc/apt /etc/apt/

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

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

RUN useradd -m -u 1000 atmark

RUN echo "/vol_app/lib" > /etc/ld.so.conf.d/atmark.conf
ENV LD_LIBRARY_PATH=/vol_app/lib


4.packages.txtを編集

packeges.txtにビルドおよび、アプリケーション実行環境に必要なパッケージをそれぞれ設定します。
g++やmakeなどはbuild-essentialに含まれている為、それ以外に必要なものを追記します。

ここでは以下のようにpackeges.txtにGPIOを操作する為のgpiodとlibgpiod-devを追加しています。

# --- always use ---
gpiod

# --- use only for build ---
[build]
build-essential
gpiod
libgpiod-dev

 

5.ソースファイルの書き換え/リネーム/削除

main.cをmain.cppにリネームし、各種ソースファイルを作成します。
不要なソースファイル、ヘッダーファイルは削除して問題ありません。

ここでは簡単な内容の為、main.cppとMakefileのみとします。

maion.cppは以下の様に書き換えます。
※あくまで参考例ですので適宜必要に応じて修正ください。

#include <gpiod.hpp>
#include <iostream>
#include <chrono>
#include <thread>
#include <fstream>

int main() {
    const std::string chipname = "gpiochip5";
    const unsigned int line_num = 0;

    try {
        gpiod::chip chip(chipname);
        gpiod::line line = chip.get_line(line_num);
        line.request({"gpio_read_cpp", gpiod::line_request::DIRECTION_INPUT, 0});

        while (true) {
            int val = line.get_value();
            std::cout << "DI1:" << val << std::endl;
            std::ofstream("/sys/class/leds/app/brightness") << (val == 1 ? 0 : 1);
            std::this_thread::sleep_for(std::chrono::milliseconds(500));
        }

    }
    catch (const std::exception &e) {
        std::cerr << "Error accessing GPIO: " << e.what() << std::endl;
        return 1;
    }
    return 0;
}


6.Makefileを編集

Makefileを下記の様に書き換えます。
※あくまで参考例ですので適宜必要に応じて修正ください。
 ビルドした実行ファイルは../build/mainとして保存します。(重要)

srcs := main.cpp
objdir := ../build
target := $(objdir)/main
objs := $(srcs:%.cpp=%.o)
deps := $(objs:.o=.d)

CXX := g++
CXXFLAGS += -Wall -Wextra -std=c++17 -MMD -MP
LDFLAGS += -lgpiodcxx

all: $(target)

$(target): $(objs)
	$(CXX) $(TARGET_ARCH) $^ -o $@ $(LDFLAGS)

%.o: %.cpp
	$(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $< -o $@

.PHONY: clean
clean:
	$(RM) $(objs) $(deps) $(target)

-include $(deps)

7.ビルドを実行

書き換えたファイルをすべて保存(Ctrl+S)したら、ビルド実行~アップデートファイルを作成します。
デバッグ有り:Generate development swuを実行
デバッグ無し:Generate release swuを実行

ビルドの最後に Enter pass phrase for /home/atmark/mkswu/swupdate.key: と聞かれるため、
initial_setupで決めた署名用パスワードを入力してビルドとアップデートファイル作成が完了となります。

8.Armadilloに書き込み

Armadillo.localのアイコンから作成したSWUファイルをインストールします。
※ABOS WebやUSBメモリ等からでも構いません。

8.動作確認

SWUファイルをインストールするとArmadilloは自動で再起動し、インストールしたコンテナ(アプリ)が
自動起動します。

DI1が1(=オープン)の場合はLEDが消灯、DI1が0(=ショート)して1になった場合はLEDが点灯している事を
確認出来たら完了です。

デバッグ実行する場合

コンテナが動いている場合は一度ABOSDEからApp stop on Armadilloを実行し、コンテナを止めます。
その際、初回のみ下記パスワードを求められる為、Setup environment 実行時に決めたSSH接続のパスワードを
入力します。


次に、App run on Armadilloを実行すると標準出力したものはVScodeのターミナルにデバッグログが
流れるようになります。

《デバッグ時のポイント》
 app/src以下の変更やapp.confの変更の場合は、App run on Armadilloを実行する事でビルド実行と
 ファイルコピーを行う為、デバッグを早く行うことができます。(コンテナはビルドされない)



以上となります。