osekとLinuxの機能をマージしたり、マルチコアで2つのOSを動かすのに、一つのソースから生成させる仕組みを作ろうとしています。
FreeOSEKから始める場合を想定し、構築方法を作成予定です。
CHatGPT
FreeOSEKをdocker上でコンパイル手順を示してください。
もちろんです。FreeOSEK(AUTOSAR OSの教育・実験用実装)をDocker上でコンパイルする手順を具体的に示します。ここでは、Linux環境を想定し、Dockerコンテナ内で必要なツールを揃えてビルドする例を示します。
- Dockerfile作成
まず、FreeOSEKをビルドするためのDockerイメージを作ります。一般的に必要なのは以下です:
gcc(Cコンパイラ)
make
git(FreeOSEKのソース取得用)
必要に応じて vim, nano など軽量エディタ
# ベースイメージ
FROM ubuntu:22.04
# 基本ツールのインストール
RUN apt-get update && apt-get install -y \
build-essential \
git \
wget \
curl \
vim \
python3 \
python3-pip \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリ
WORKDIR /freeosek
# FreeOSEKソースをクローン
RUN git clone https://github.com/FreeOSEK/FreeOSEK.git .
# ビルド用ディレクトリ作成
RUN mkdir build
# デフォルトコマンド
CMD ["/bin/bash"]
補足:FreeOSEKの公式GitHubはこちら
https://github.com/FreeOSEK/FreeOSEK
2. Dockerイメージ作成
ターミナルでDockerfileがあるディレクトリに移動して以下を実行します:
docker build -t freeosek:latest .
3. Dockerコンテナ起動
docker run -it --name freeosek_build freeosek:latest
コンテナ内で/freeosekディレクトリにFreeOSEKソースがあります。
4. FreeOSEKのコンパイル
FreeOSEKは基本的にMakefileでビルドできます。一般的な手順:
cd /freeosek
makeコマンドでビルド(ターゲットはポート/MCUに応じて選択)
make PORT=GCC_ME_16 TARGET=PC
PORT:コンパイラやアーキテクチャ
例: GCC_ME_16、GCC_ME_32、GCC(PC向け)
TARGET:ターゲット
例: PC、ARM、TMS570など
ビルドが成功すると、bin/ディレクトリに実行可能ファイルが生成されます。
- FreeOSEK動作確認
cd bin
./main
PC向けの場合、簡単なタスクスケジューリングのログが表示されます。- オプション:ホストとソース共有
ホスト側でソースを編集したい場合は、コンテナ起動時にボリュームマウントします:
docker run -it -v $(pwd)/FreeOSEK:/freeosek freeosek:latest
これでホスト側の変更が即座にコンテナ内に反映されます。
✅ まとめ
DockerfileでUbuntu + build-essential + git を用意
FreeOSEKをクローンして作業ディレクトリ作成
make PORT=GCC_ME_16 TARGET=PC でビルド
bin/main で実行確認
もし希望であれば、ARMやRenesas向けクロスコンパイル用にDocker上でビルド環境を整える手順も詳しく示せます。
作業はPC向けで十分ですか、それとも組み込み向けもカバーしますか?
組み込み向けもカバー
了解です。では、FreeOSEK を 組み込み向け MCU(ARM Cortex-M 等) 向けに Docker 上でクロスコンパイルする手順を詳しく示します。ここでは例として ARM Cortex-M(STM32 など) を想定します。
- Dockerfile の作成(組み込み向けクロスコンパイル環境)
# ベースイメージ
FROM ubuntu:22.04
# 基本ツールと ARM クロスコンパイラのインストール
RUN apt-get update && apt-get install -y \
build-essential \
git \
wget \
curl \
python3 \
python3-pip \
gcc-arm-none-eabi \
gdb-multiarch \
make \
vim \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリ
WORKDIR /freeosek
# FreeOSEK ソースをクローン
RUN git clone https://github.com/FreeOSEK/FreeOSEK.git .
# ビルド用ディレクトリ
RUN mkdir build
# デフォルトコマンド
CMD ["/bin/bash"]
ポイント:
gcc-arm-none-eabi で ARM Cortex-M 向けクロスコンパイル可能
gdb-multiarch で PC から ARM バイナリのデバッグも可能
2. Docker イメージ作成
docker build -t freeosek-arm:latest .
3. コンテナ起動(ソースをホストと共有する場合)
docker run -it -v $(pwd)/FreeOSEK:/freeosek freeosek-arm:latest
ホストの FreeOSEK フォルダが /freeosek にマウントされます。
4. FreeOSEK の組み込み向けビルド
FreeOSEK の Makefile はターゲットとポートを指定します。ARM Cortex-M の例:
cd /freeosekCortex-M 向け GCC ポートを指定してビルド
make PORT=GCC_ME_32 TARGET=ARM
PORT=GCC_ME_32 : 32bit Cortex-M 用 GCC
TARGET=ARM : 組み込みターゲット
FreeOSEK の各ポートは ports/ フォルダ内にあります。STM32 などの特定ボード向けには Makefile を修正する場合があります。
5. ARM バイナリの確認
ビルドが成功すると、bin/ フォルダに .elf バイナリが生成されます。
cd binバイナリの情報確認
arm-none-eabi-objdump -d main.elf | less
6. 実機書き込み(例: STM32)
Docker 内で openocd を使うか、ホスト側から書き込むことが可能です。OpenOCD を使って STM32 に書き込み
openocd -f interface/stlink.cfg -f target/stm32f4x.cfg
-c "program /freeosek/bin/main.elf verify reset exit"
注意:STM32 用に OpenOCD と ST-Link ドライバがホスト側に必要です。
7. オプション:デバッグGDB で Cortex-M ELF バイナリをデバッグ
arm-none-eabi-gdb main.elf
GDB 内でターゲット接続
target remote :3333 # OpenOCD 経由
✅ まとめ
Docker に ARM クロスコンパイラと FreeOSEK を用意
make PORT=GCC_ME_32 TARGET=ARM で組み込み向けビルド
bin/main.elf を生成、OpenOCD/GDB で実機書き込み・デバッグ
ホストとソースを共有すれば開発が容易
💡 ポイント:
ポートとターゲットを正しく指定すること
MCU ボードごとに Makefile のフラッシュ設定やリンカスクリプトを確認
実機書き込みには OpenOCD などの外部ツールが必要
希望があれば、STM32F4 用に Makefile を最適化して Docker 上で自動ビルド・実機書き込みできるサンプル構成 も示せます。
作りますか?
Raspberry PI向けをお願いします。
了解です。では Raspberry Pi 向け FreeOSEK の Docker クロスコンパイル手順 をまとめます。Raspberry Pi は ARM Cortex-A 系(64bit または 32bit)、Linux OS 上で動作するため、クロスコンパイルまたはネイティブビルドのどちらでも可能です。ここでは クロスコンパイル(x86_64 ホスト → ARM Raspberry Pi) の例を示します。
- Dockerfile の作成(Raspberry Pi 向け)
# ベースイメージ
FROM ubuntu:22.04
# 必要ツールのインストール
RUN apt-get update && apt-get install -y \
build-essential \
git \
wget \
curl \
python3 \
python3-pip \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
make \
vim \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリ
WORKDIR /freeosek
# FreeOSEK ソースをクローン
RUN git clone https://github.com/FreeOSEK/FreeOSEK.git .
# ビルド用ディレクトリ
RUN mkdir build
# デフォルトシェル
CMD ["/bin/bash"]
ポイント:
Raspberry Pi 4 などの 64bit OS を想定し gcc-aarch64-linux-gnu を使用
32bit RPi OS なら gcc-arm-linux-gnueabihf に変更
2. Docker イメージ作成
docker build -t freeosek-rpi:latest .
3. コンテナ起動(ホストのソース共有)
docker run -it -v $(pwd)/FreeOSEK:/freeosek freeosek-rpi:latest
4. Raspberry Pi 向けビルド
FreeOSEK の Makefile は PORT と TARGET を指定可能です。Raspberry Pi 用には 64bit ARM クロスコンパイルを指定:
cd /freeosek
make PORT=GCC_AARCH64 TARGET=RASPI
PORT=GCC_AARCH64 : ARM64 GCC クロスコンパイラ用
TARGET=RASPI : Raspberry Pi 用ターゲット
Makefile に Raspberry Pi 用の設定がない場合は ports/ フォルダをコピーして PORT=GCC_AARCH64 を定義します。
5. バイナリ確認
cd bin
file main出力例: ELF 64-bit LSB executable, ARM aarch64
- Raspberry Pi への転送
ビルド後、生成されたバイナリを Raspberry Pi にコピーして実行可能です。ホストから RPi にコピー
scp bin/main pi@raspberrypi.local:/home/pi/
Raspberry Pi 上で実行
ssh pi@raspberrypi.local
chmod +x main
./main
7. ポイント
32bit Raspberry Pi OS を使う場合は gcc-arm-linux-gnueabihf に変更
FreeOSEK の Makefile はポートやリンカスクリプトを適宜変更する必要あり
ネイティブビルド(Raspberry Pi 上で直接 make)でも動作可能
💡 補足
Raspberry Pi 上で ネイティブビルド する場合は Docker も不要で、普通に
sudo apt install build-essential git
git clone https://github.com/FreeOSEK/FreeOSEK.git
cd FreeOSEK
make PORT=GCC TARGET=RASPI
./bin/main
で十分です。
希望であれば、Docker 上で Raspberry Pi ネイティブ実行用に QEMU エミュレーションで直接動作確認できる構成 も示せます。
作りますか?
はい。
了解です。それでは Docker 上で QEMU を使って Raspberry Pi (ARM) ネイティブ環境をエミュレーションし、FreeOSEK をビルド・実行する構成 を示します。これにより x86_64 ホスト上でも Raspberry Pi 向けバイナリをビルドして実行できます。
- Dockerfile(QEMU + Raspberry Pi 環境)
# ベースイメージ
FROM ubuntu:22.04
# 必要パッケージのインストール
RUN apt-get update && apt-get install -y \
git \
build-essential \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
qemu-user-static \
qemu-system-arm \
binfmt-support \
make \
vim \
&& rm -rf /var/lib/apt/lists/*
# FreeOSEK 作業ディレクトリ
WORKDIR /freeosek
# FreeOSEK ソースをクローン
RUN git clone https://github.com/FreeOSEK/FreeOSEK.git .
# ビルド用ディレクトリ
RUN mkdir build
# QEMU のバイナリを登録(エミュレーション)
RUN update-binfmts --enable qemu-aarch64
# デフォルトシェル
CMD ["/bin/bash"]
ポイント:
qemu-user-static で ARM バイナリを x86_64 上で実行可能
gcc-aarch64-linux-gnu で ARM64 バイナリをクロスコンパイル可能
2. Docker イメージ作成
docker build -t freeosek-rpi-qemu:latest .
3. コンテナ起動(ホストのソースを共有)
docker run -it -v $(pwd)/FreeOSEK:/freeosek freeosek-rpi-qemu:latest
4. FreeOSEK の Raspberry Pi 向けビルド
cd /freeosek
make PORT=GCC_AARCH64 TARGET=RASPI
PORT=GCC_AARCH64 : ARM64 クロスコンパイル
TARGET=RASPI : Raspberry Pi 用ターゲット
Makefile に RASPI ターゲットがない場合は ports/ から適切な設定を作成してください。
5. QEMU で ARM バイナリを実行
cd bin
QEMU を使って ARM64 バイナリをエミュレーション実行
qemu-aarch64 ./main
これで x86_64 ホスト上でも Raspberry Pi 環境を模した FreeOSEK の実行が可能
- オプション:SSH で実機確認
ビルド後、バイナリを Raspberry Pi に転送して実機確認も可能:
scp bin/main pi@raspberrypi.local:/home/pi/
ssh pi@raspberrypi.local
chmod +x main
./main- ポイント
クロスコンパイル + QEMU エミュレーション でホスト上で即実行可能
実機向けには同じバイナリを転送するだけで動作確認できる
ARM 32bit OS の場合は gcc-arm-linux-gnueabihf と qemu-arm に変更
Makefile のポートやリンカ設定を Raspberry Pi に合わせて調整
💡 この構成のメリット:
x86_64 ホストだけで Raspberry Pi 向けの FreeOSEK 実行確認が可能
Docker で環境を隔離できるのでホストを汚さない
ネイティブビルド環境がなくても FreeOSEK のテストが可能
希望であれば、Raspberry Pi 向けに Docker 上で自動ビルド → QEMU で実行 → bin/ のログを自動取得するスクリプト付き構成 も作れます。
作りますか?
macOS(m2)上のdockerで作業する場合を示してください。
了解です。では macOS (M2, ARM64) 上で Docker を使い、FreeOSEK を Raspberry Pi 向けにビルド・QEMU で実行する手順 をまとめます。M2 は Apple Silicon で ARM64 なので、クロスコンパイル対象も ARM64 で合わせやすく、Docker 上でのエミュレーションも効率的です。
- 前提条件
macOS M2 (ARM64)
Docker Desktop for Mac(Apple Silicon 対応)
ホスト上に Git がインストール済み
M2 は ARM64 なので、Docker コンテナも linux/arm64 イメージを推奨
- Dockerfile(macOS M2 + FreeOSEK + QEMU)
# ARM64 用 Ubuntu 22.04 ベース
FROM --platform=linux/arm64 ubuntu:22.04
# 必要ツールのインストール
RUN apt-get update && apt-get install -y \
build-essential \
git \
wget \
curl \
python3 \
python3-pip \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
qemu-user-static \
binfmt-support \
make \
vim \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリ
WORKDIR /freeosek
# FreeOSEK ソースをクローン
RUN git clone https://github.com/FreeOSEK/FreeOSEK.git .
# ビルド用ディレクトリ
RUN mkdir build
# QEMU バイナリ登録(x86/ARM 混在環境でのエミュレーション)
RUN update-binfmts --enable qemu-aarch64
# デフォルトシェル
CMD ["/bin/bash"]
ポイント:
--platform=linux/arm64 で Apple Silicon 向けネイティブ ARM イメージを作成
M2 上では QEMU なしでも ARM64 バイナリが実行可能ですが、異なる ARM プラットフォーム(Raspberry Pi OS 32bit など)もテストしたい場合は qemu-user-static を利用
3. Docker イメージ作成
docker build -t freeosek-rpi-mac:latest .
4. コンテナ起動(ホストとソース共有)
docker run -it -v $(pwd)/FreeOSEK:/freeosek freeosek-rpi-mac:latest
ホストの FreeOSEK ディレクトリを /freeosek にマウント
編集したソースが即座にコンテナ内に反映されます
5. FreeOSEK の Raspberry Pi 向けビルド
macOS M2 では ARM64 ネイティブクロスコンパイルが可能:
cd /freeosek
make PORT=GCC_AARCH64 TARGET=RASPI
PORT=GCC_AARCH64 : ARM64 クロスコンパイラ
TARGET=RASPI : Raspberry Pi 向け
32bit Raspberry Pi OS 向けには gcc-arm-linux-gnueabihf と PORT=GCC_ARMHF に変更
6. ARM バイナリの確認
cd bin
file main
ELF 64-bit LSB executable, ARM aarch64
- QEMU でエミュレーション実行(必要な場合)
qemu-aarch64 ./main
macOS M2 自身が ARM64 なので、Raspberry Pi 64bit バイナリなら QEMU は不要
32bit Raspberry Pi OS バイナリを実行する場合は qemu-arm を利用
.8. Raspberry Pi への転送
scp bin/main pi@raspberrypi.local:/home/pi/
ssh pi@raspberrypi.local
chmod +x main
./main
.9. ポイントまとめ
M2 は ARM64 なので Raspberry Pi 64bit 向けはネイティブビルド可能
Docker イメージは --platform=linux/arm64 で作成
32bit Raspberry Pi 向けは gcc-arm-linux-gnueabihf + QEMU でエミュレーション
ホストとソース共有で開発効率アップ
実機テストは SCP + SSH で簡単に実行可能
💡 補足:
FreeOSEK の Makefile はポートやリンカ設定を Raspberry Pi OS に合わせて調整する
QEMU を使うと macOS M2 上で 32bit RPi バイナリの動作確認が可能
希望であれば、macOS M2 上で「Docker 内で FreeOSEK 自動ビルド → 32bit/64bit バイナリ実行 → ログ取得」まで一括で行えるシェルスクリプト付き構成 も作れます。
作りますか?
はい。
了解です。では macOS M2 上の Docker で FreeOSEK を自動ビルド → 32bit/64bit バイナリを QEMU で実行 → 実行ログを取得 する構成を示します。これにより、ホスト上で一括テストが可能です。
- Dockerfile(自動ビルド + QEMU 対応)
# ARM64 用 Ubuntu 22.04
FROM --platform=linux/arm64 ubuntu:22.04
# 必要ツールのインストール
RUN apt-get update && apt-get install -y \
build-essential \
git \
wget \
curl \
python3 \
python3-pip \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
gcc-arm-linux-gnueabihf \
g++-arm-linux-gnueabihf \
qemu-user-static \
binfmt-support \
make \
vim \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリ
WORKDIR /freeosek
# FreeOSEK ソースをクローン
RUN git clone https://github.com/FreeOSEK/FreeOSEK.git .
# ビルド用ディレクトリ
RUN mkdir build
# QEMU バイナリ登録
RUN update-binfmts --enable qemu-aarch64
RUN update-binfmts --enable qemu-arm
# ビルド+実行用スクリプトを追加
COPY run_build.sh /freeosek/run_build.sh
RUN chmod +x /freeosek/run_build.sh
CMD ["/bin/bash"]
2. 自動ビルド&実行スクリプト (run_build.sh)
#!/bin/bash
set -e
# 出力ログディレクトリ
LOG_DIR=/freeosek/logs
mkdir -p $LOG_DIR
# 64bit Raspberry Pi 向けビルド
echo "=== Building 64bit FreeOSEK ==="
make clean
make PORT=GCC_AARCH64 TARGET=RASPI
echo "Running 64bit binary via QEMU"
qemu-aarch64 ./bin/main > $LOG_DIR/log_rpi64.txt 2>&1
echo "64bit log saved to $LOG_DIR/log_rpi64.txt"
# 32bit Raspberry Pi 向けビルド
echo "=== Building 32bit FreeOSEK ==="
make clean
make PORT=GCC_ARMHF TARGET=RASPI
echo "Running 32bit binary via QEMU"
qemu-arm ./bin/main > $LOG_DIR/log_rpi32.txt 2>&1
echo "32bit log saved to $LOG_DIR/log_rpi32.txt"
echo "=== Build & run completed ==="
ポイント:
make clean で毎回クリーンビルド
PORT=GCC_AARCH64 → 64bit ARM、PORT=GCC_ARMHF → 32bit ARM
qemu-aarch64 / qemu-arm でそれぞれのバイナリを実行
実行ログを logs/ に保存
3. Docker イメージ作成
docker build -t freeosek-rpi-auto:latest .
4. コンテナ起動(ホストソースを共有)
docker run -it -v $(pwd)/FreeOSEK:/freeosek freeosek-rpi-auto:latest
5. 自動ビルド&実行
コンテナ内で:
./run_build.sh
64bit と 32bit バイナリを自動でビルド
QEMU でそれぞれ実行
ログは /freeosek/logs/log_rpi64.txt および /freeosek/logs/log_rpi32.txt に保存
6. macOS 側でログ確認
cat FreeOSEK/logs/log_rpi64.txt
cat FreeOSEK/logs/log_rpi32.txt
7. ポイント
M2 は ARM64 ネイティブなので 64bit バイナリは高速実行
32bit バイナリも qemu-arm で動作確認可能
ホストの FreeOSEK ソースをマウントしているので変更を即反映
logs/ に全ての実行結果が保存され、自動テストに便利
💡 オプション
実行結果をホストにコピーして CI/CD 連携可能
run_build.sh を cron や GitHub Actions から呼び出せば自動テストも可能
希望であれば、この構成に Raspberry Pi 実機への自動転送&実機ログ取得まで組み込んだ完全自動化スクリプト も作成できます。
作りますか?
はい。
了解です。では macOS M2 上の Docker で FreeOSEK を自動ビルド → QEMU で 32bit/64bit 実行 → 実機 Raspberry Pi に自動転送・実機ログ取得 まで行える完全自動化構成を作ります。
- Dockerfile(自動ビルド + QEMU + 実機転送対応)
# ARM64 用 Ubuntu 22.04
FROM --platform=linux/arm64 ubuntu:22.04
# 必要パッケージのインストール
RUN apt-get update && apt-get install -y \
build-essential \
git \
wget \
curl \
python3 \
python3-pip \
gcc-aarch64-linux-gnu \
g++-aarch64-linux-gnu \
gcc-arm-linux-gnueabihf \
g++-arm-linux-gnueabihf \
qemu-user-static \
binfmt-support \
sshpass \
make \
vim \
&& rm -rf /var/lib/apt/lists/*
# 作業ディレクトリ
WORKDIR /freeosek
# FreeOSEK ソースをクローン
RUN git clone https://github.com/FreeOSEK/FreeOSEK.git .
RUN mkdir build logs
# QEMU バイナリ登録
RUN update-binfmts --enable qemu-aarch64
RUN update-binfmts --enable qemu-arm
# 自動ビルド+実機転送スクリプトをコピー
COPY run_build_and_deploy.sh /freeosek/run_build_and_deploy.sh
RUN chmod +x /freeosek/run_build_and_deploy.sh
CMD ["/bin/bash"]
2. 自動ビルド&実機転送スクリプト (run_build_and_deploy.sh)
#!/bin/bash
set -e
# 実機 Raspberry Pi 設定
RPI_USER=pi
RPI_HOST=raspberrypi.local
RPI_PASS=raspberry
RPI_DIR=/home/pi/freeosek_test
mkdir -p logs
# 64bit ビルド
echo "=== Building 64bit FreeOSEK ==="
make clean
make PORT=GCC_AARCH64 TARGET=RASPI
echo "Running 64bit binary via QEMU"
qemu-aarch64 ./bin/main > logs/log_rpi64.txt 2>&1
echo "64bit log saved to logs/log_rpi64.txt"
# 32bit ビルド
echo "=== Building 32bit FreeOSEK ==="
make clean
make PORT=GCC_ARMHF TARGET=RASPI
echo "Running 32bit binary via QEMU"
qemu-arm ./bin/main > logs/log_rpi32.txt 2>&1
echo "32bit log saved to logs/log_rpi32.txt"
# 実機転送
echo "=== Deploying to Raspberry Pi ==="
sshpass -p $RPI_PASS ssh -o StrictHostKeyChecking=no $RPI_USER@$RPI_HOST "mkdir -p $RPI_DIR"
sshpass -p $RPI_PASS scp ./bin/main $RPI_USER@$RPI_HOST:$RPI_DIR/main
echo "Binary transferred to Raspberry Pi at $RPI_DIR"
# 実機で実行してログ取得
sshpass -p $RPI_PASS ssh $RPI_USER@$RPI_HOST "cd $RPI_DIR && chmod +x main && ./main" > logs/log_rpi_hw.txt 2>&1
echo "Raspberry Pi hardware log saved to logs/log_rpi_hw.txt"
echo "=== All done ==="
ポイント:
sshpass を使いパスワードで Raspberry Pi に自動接続
64bit / 32bit のバイナリを QEMU でローカル確認
実機にも転送して実行 → 実機ログを Docker 内の logs/ に保存
RPi の SSH ユーザ・パスワード・ホスト名は環境に応じて変更
3. Docker イメージ作成
docker build -t freeosek-rpi-auto-hw:latest .
4. コンテナ起動(ホストソース共有)
docker run -it -v $(pwd)/FreeOSEK:/freeosek freeosek-rpi-auto-hw:latest
5. 自動ビルド&実機転送
コンテナ内で:
./run_build_and_deploy.sh
QEMU で 32bit/64bit バイナリをローカル実行
実機 Raspberry Pi に転送して実行
ログは logs/log_rpi64.txt / logs/log_rpi32.txt / logs/log_rpi_hw.txt に保存
6. macOS 側でログ確認
cat FreeOSEK/logs/log_rpi64.txt
cat FreeOSEK/logs/log_rpi32.txt
cat FreeOSEK/logs/log_rpi_hw.txt
7. ポイントまとめ
M2 上の ARM64 Docker でネイティブクロスコンパイル
QEMU でローカルテスト → 実機転送 → 実機ログ取得まで自動化
sshpass とホストマウントで簡単に CI/CD 連携可能
32bit/64bit 両方対応、ホストに依存せずテスト環境を再現可能
💡 補足
実機転送や SSH 接続に秘密鍵を使う場合は sshpass 部分を ssh -i に置き換え可能
このスクリプトを CI/CD に組み込めば、Mac から Raspberry Pi 向け FreeOSEK の自動テスト環境を構築できます
必要であれば、Raspberry Pi 側で FreeOSEK の複数タスクテストを自動実行するサンプルタスク構成付き Docker 環境 まで拡張可能です。
作りますか?
はい。
了解です。では Raspberry Pi 側で FreeOSEK の複数タスクテストを自動実行できるサンプルタスク構成付き Docker 環境 を構築する手順を示します。これにより macOS M2 上で Docker を使い、FreeOSEK をビルド・ローカル実行・実機転送・実機テストまで自動化できます。
- Dockerfile(タスク自動実行対応)
ARM64 用 Ubuntu 22.04
FROM --platform=linux/arm64 ubuntu:22.04
必要パッケージのインストール
RUN apt-get update && apt-get install -y
build-essential
git
wget
curl
python3
python3-pip
gcc-aarch64-linux-gnu
g++-aarch64-linux-gnu
gcc-arm-linux-gnueabihf
g++-arm-linux-gnueabihf
qemu-user-static
binfmt-support
sshpass
make
vim
&& rm -rf /var/lib/apt/lists/*
作業ディレクトリ
WORKDIR /freeosek
FreeOSEK ソースをクローン
RUN git clone https://github.com/FreeOSEK/FreeOSEK.git .
RUN mkdir build logs tasks
QEMU バイナリ登録
RUN update-binfmts --enable qemu-aarch64
RUN update-binfmts --enable qemu-arm
タスク自動テストスクリプトをコピー
COPY run_tasks_and_deploy.sh /freeosek/run_tasks_and_deploy.sh
RUN chmod +x /freeosek/run_tasks_and_deploy.sh
CMD ["/bin/bash"]
2. サンプル FreeOSEK タスク(tasks/sample_tasks.c)
#include "FreeOSEK.h"
#include
TASK(Task1) {
printf("Task1: LED ON\n");
TerminateTask();
}
TASK(Task2) {
printf("Task2: LED OFF\n");
TerminateTask();
}
TASK(Task3) {
printf("Task3: Sensor Read\n");
TerminateTask();
}
3 つのタスクを作成:LED ON/OFF、センサー読み取り
実際の Raspberry Pi GPIO は別途ライブラリをリンク可能
3. 自動ビルド&タスク実行スクリプト (run_tasks_and_deploy.sh)
#!/bin/bash
set -e
実機 Raspberry Pi 設定
RPI_USER=pi
RPI_HOST=raspberrypi.local
RPI_PASS=raspberry
RPI_DIR=/home/pi/freeosek_test
mkdir -p logs
64bit ビルド
echo "=== Building 64bit FreeOSEK with tasks ==="
make clean
make PORT=GCC_AARCH64 TARGET=RASPI
echo "Running 64bit binary via QEMU"
qemu-aarch64 ./bin/main > logs/log_rpi64.txt 2>&1
echo "64bit log saved to logs/log_rpi64.txt"
32bit ビルド
echo "=== Building 32bit FreeOSEK with tasks ==="
make clean
make PORT=GCC_ARMHF TARGET=RASPI
echo "Running 32bit binary via QEMU"
qemu-arm ./bin/main > logs/log_rpi32.txt 2>&1
echo "32bit log saved to logs/log_rpi32.txt"
実機転送
echo "=== Deploying to Raspberry Pi ==="
sshpass -p $RPI_PASS ssh -o StrictHostKeyChecking=no $RPI_USER@$RPI_HOST "mkdir -p $RPI_DIR"
sshpass -p $RPI_PASS scp ./bin/main $RPI_USER@$RPI_HOST:$RPI_DIR/main
echo "Binary transferred to Raspberry Pi at $RPI_DIR"
実機でタスク自動実行してログ取得
sshpass -p $RPI_PASS ssh $RPI_USER@$RPI_HOST "cd $RPI_DIR && chmod +x main && ./main" > logs/log_rpi_hw.txt 2>&1
echo "Raspberry Pi hardware log saved to logs/log_rpi_hw.txt"
echo "=== All tasks completed ==="
ポイント:
64bit/32bit 両方を自動ビルド
QEMU でローカル実行 → ログ取得
実機 Raspberry Pi に転送 → 実機実行 → ログ取得
タスクの出力は logs/ に集約
4. Docker イメージ作成
docker build -t freeosek-rpi-tasks:latest .
5. コンテナ起動(ホストソース共有)
docker run -it -v $(pwd)/FreeOSEK:/freeosek freeosek-rpi-tasks:latest
6. 自動ビルド&タスク実行
./run_tasks_and_deploy.sh
3 つのサンプルタスクが QEMU と実機 Raspberry Pi 上で自動実行
ログは logs/log_rpi64.txt, logs/log_rpi32.txt, logs/log_rpi_hw.txt に保存
7. macOS 側でログ確認
cat FreeOSEK/logs/log_rpi64.txt
cat FreeOSEK/logs/log_rpi32.txt
cat FreeOSEK/logs/log_rpi_hw.txt
8. ポイント
FreeOSEK タスクを Docker 上でビルド・自動実行
QEMU で 32bit/64bit バイナリのローカル動作確認
実機 Raspberry Pi への転送・実行・ログ取得まで自動化
複数タスクのテストも一括で管理可能
CI/CD への組み込みが容易(ホストに依存せず再現可能)
💡 補足:
GPIO やセンサーアクセスを行う場合は、Raspberry Pi 側に必要なライブラリ(wiringPi 等)を事前にインストール
タスク構成は tasks/ 内の C ファイルを編集すれば自由に追加可能
必要であれば、この構成を GitHub Actions などの CI/CD で自動テスト → 実機ログ収集まで実行可能な完全ワークフロー に拡張することも可能です。
作りますか?
はい。
Ref
ISO IEC Artificial intelligence Standards
https://qiita.com/kaizen_nagoya/items/1d1ffe4ac8e1dc67501f
大規模言語モデル講座 基礎編 2025 Autumn 敗因を勝因に
https://qiita.com/kaizen_nagoya/items/34ffd2b0c47a5f3665d9
MCP入門 〜面倒なことはAIエージェントにやらせよう〜 by からあげ を聞きながら
https://qiita.com/kaizen_nagoya/items/54b648c838fae8d57e38
MCP入門 〜面倒なことはAIエージェントにやらせよう〜 by からあげ を聞きながら、補足と反論 by ChatGPT
https://qiita.com/kaizen_nagoya/items/0939d58d31666562090c
C言語を習得する3つの方法
https://qiita.com/kaizen_nagoya/items/84cab0888c193bba429b
Views上位64記事 20250617現在
https://qiita.com/kaizen_nagoya/items/26dbbd04cf18b7742972
C言語(C++)が必要な人、必要ない人 with ChatGPT
https://qiita.com/kaizen_nagoya/items/a074cb8cd292d8d94bd4
C言語を習得する3つの方法 with ChatGPT
https://qiita.com/kaizen_nagoya/items/4a3518a18fa49f46787f
<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>
This article is an individual impression based on my individual experience. It has nothing to do with the organization or business to which I currently belong.
Este artículo es una impresión personal basada en mi experiencia personal. No tiene nada que ver con la organización o empresa a la que pertenezco actualmente.
文書履歴(document history)
ver. 0.01 初稿 20251020
最後までおよみいただきありがとうございました。
いいね 💚、フォローをお願いします。
Thank you very much for reading to the last sentence.
Please press the like icon 💚 and follow me for your happy life.
Muchas gracias por leer hasta la última oración.
Por favor, haz clic en el ícono Me gusta 💚 y sígueme para tener una vida feliz.