ARMターゲット向けクロスコンパイル
ARMマイクロコントローラーを対象とするクロスコンパイルツールチェーンを設定します。
「ARMターゲット向けクロスコンパイル」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
クロスコンパイルとは
あるプラットフォーム(ホスト)で、別のプラットフォーム(ターゲット)で実行するためのコンパイルを行います。組み込み開発では不可欠です。ノートパソコンでコードを書き、マイクロコントローラで実行します。
クロスコンパイラツールチェーン
ツールチェーンには、特定のターゲット向けのクロスコンパイラ、リンカー、デバッガ、標準ライブラリがまとめられています。
# GCC ARM Embedded for Cortex-M
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -O2 main.c
arm-none-eabi-objcopy -O ihex a.out a.hexツールチェーンのインストール
一般的な選択肢は次のとおりです。
- GCC ARM Embedded — 公式ツールチェーンで、無料です
- Clang/LLVM — 多くのターゲットを標準でサポートします
- ベンダーのツールチェーン — IDEに同梱されています(Keil、IAR)
ターゲットトリプル
トリプルはターゲットを識別します。CPU-Vendor-OS-ABIという形式です。例を示します。
arm-none-eabi— ベアメタルARMaarch64-linux-gnu— 64ビットARM Linuxx86_64-pc-windows-msvc— MSVC ABIを使用するWindows x64
リンカースクリプト
組み込みターゲットでは、メモリレイアウトを記述するリンカースクリプトが必要です。FlashとRAMの位置や、スタックの開始位置などを指定します。ツールチェーンにはデフォルトのスクリプトが付属しており、上書きできます。
/* Simplified linker script */
MEMORY {
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 256K
RAM (rw) : ORIGIN = 0x20000000, LENGTH = 64K
}スタートアップとベクタテーブル
スタートアップファイルは、スタックポインタを設定し、初期化済みデータをFlashからRAMへコピーし、BSSをゼロ初期化してからmainへジャンプします。通常はベンダーから提供されます。
ARM向けコンパイラフラグ
一般的なフラグは次のとおりです。
-mcpu=cortex-m4— 特定のCPUを指定します-mthumb— Thumb命令セットを指定します-mfloat-abi=hard -mfpu=fpv4-sp-d16— ハードウェアFPUを指定します-Os— サイズを優先して最適化します
NewlibとNewlib-Nano
組み込み向けGCCの標準Cライブラリです。Newlib-Nanoは、コードサイズを小さくした簡略版です。
libcとのリンク
多くの組み込みプロジェクトでは、最小限のlibcとリンクするか、必要な機能だけを実装します(printfの代替やmallocのスタブなど)。
クロスコンパイル向けCMake
CMakeを呼び出すときに、ツールチェーンファイルを指定します。
# arm-none-eabi.cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_C_COMPILER arm-none-eabi-gcc)
set(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)
# Usage
cmake -B build -DCMAKE_TOOLCHAIN_FILE=arm-none-eabi.cmakeGDBによるデバッグ
ターゲット専用のGDB(arm-none-eabi-gdb)を、OpenOCD、ST-Link、J-Link、またはpyOCD経由でハードウェアプローブに接続して使用します。
バイナリの書き込み
ELFをhexファイルまたはバイナリファイルに変換し、ベンダーのツールまたはOpenOCDを使ってFlashに書き込みます。
arm-none-eabi-objcopy -O binary firmware.elf firmware.bin
st-flash write firmware.bin 0x08000000まずホストでテストする
完全なデバッグ環境があるホスト上でロジックを開発します。ハードウェアに触れる層だけをターゲットへ移します。単体テストでは周辺機器をモック化してください。
クイックチェック
ターゲットトリプルarm-none-eabiは何を示していますか。
まとめ
クロスコンパイルを使うと、開発マシンからARM(またはその他のターゲット)向けにビルドできます。ターゲット向けツールチェーン(arm-none-eabi-gcc)を使用し、リンカースクリプトを設定し、適切なCPUフラグを選択して、OpenOCDとGDBでデバッグします。CMakeのツールチェーンファイルによって設定を自動化できます。
よくある質問
「ARMターゲット向けクロスコンパイル」レッスンは無料ですか?
はい。「ARMターゲット向けクロスコンパイル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「ARMターゲット向けクロスコンパイル」で何を学びますか?
ARMマイクロコントローラーを対象とするクロスコンパイルツールチェーンを設定します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「ARMターゲット向けクロスコンパイル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 組み込み環境の制約:RTTIなし、例外なし
- メモリマップドI/Oとvolatile
- リアルタイムにおける考慮事項とレイテンシー
- ARMターゲット向けクロスコンパイル