matlab-deploy-embedded-code について
MATLAB CoderとEmbedded Coderを設定し、組み込みターゲット向けのC/C++コードを生成して、SILまたはPILで検証するMATLABスキルです。ハードウェア設定、メモリ制約、ターゲット別オプションを扱います。
主な機能
- 01Embedded Coderターゲットの設定
- 02ハードウェアとメモリ制約の指定
- 03SIMD、OpenMP、コード置換の調整
- 04SILおよびPIL検証の実行
- 05CまたはC++コードの生成
活用シーン
- 01STM32またはRaspberry Pi向けコード生成
- 02ベアメタルターゲットで動的メモリ割り当てを無効化
- 03プロセッサボード上で生成コードをテスト
- 04組み込みAI推論のコード生成設定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ matlab/ matlab-agentic-toolkit --skill matlab-deploy-embedded-codeインストール後、Claude Code で/matlab-deploy-embedded-codeを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
manifest.yamlreferences/simulink-config.mdsupported-hardware.md詳細
Embedded Code のデプロイ
MATLAB Coder と Embedded Coder を設定し、組み込みハードウェアを対象とする本番品質のコードを生成して、プロセッサインザループ(PIL)テストで正しさを検証します。
使用する場合
- マイクロコントローラーまたは組み込み Linux ボード向けの C/C++ コードを生成する場合
- 生成コードの PIL または SIL 検証を設定する場合
- 動的メモリ割り当てなしでコード生成を設定する場合
matlab-deploy-embedded-aiで準備した AI モデルのエントリーポイント関数に対して Embedded Coder を設定する場合。AI の圧縮とモデル読み込みのワークフロー全体を実行するには、最初にmatlab-deploy-embedded-aiをトリガーしてください- ハードウェアのターゲットボード(STM32、Raspberry Pi)を選択する場合
使用しない場合
- MEX またはデスクトップライブラリを生成する場合 — 標準の
codegenワークフローを使用してください - Simulink ベースのデプロイの場合 — Simulink Coder/Embedded Coder のワークフローを直接使用してください
- GPU コード(CUDA)を生成する場合 — GPU Coder を使用してください
ワークフロー
1. ERT ベースの構成を作成する
cfg = coder.config("lib", "ecoder", true);
"ecoder", true フラグを指定すると、OS に依存しない本番品質のコードを生成する ERT(Embedded Real-Time)ベースの構成が作成されます。
2. ターゲットハードウェアを選択する
coder.hardware を使用します。
cfg.Hardware = coder.hardware("STM32F746G-Discovery");
サポートパッケージがない場合は、ハードウェアを手動で設定します。
cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM Cortex-M';
cfg.HardwareImplementation.ProdBitPerFloat = 32;
cfg.HardwareImplementation.ProdBitPerDouble = 64;
サポートされているボードとその制約の全一覧については、references/supported-hardware.md を参照してください。
3. ベアメタルターゲット用にメモリを設定する
cfg.EnableDynamicMemoryAllocation = false;
cfg.StackUsageMax = 512;
EnableDynamicMemoryAllocation = false— ヒープを使用できない、または非決定的なターゲット向けに、malloc/freeを無効にします。すべての配列はコンパイル時にサイズを確定できる必要があります。StackUsageMax— ターゲットの SRAM に基づいて設定します。コード生成レポートには、コンパイル後の実際の使用量が表示されます。
ディープラーニング推論(invoke、predict)を使用するエントリーポイントの場合:
cfg.DeepLearningConfig = coder.DeepLearningConfig('none');
cfg.LargeConstantGeneration = "KeepInSourceFiles";
DeepLearningConfig('none')— 外部 DL ライブラリ(MKL-DNN、cuDNN、TensorRT)に依存しない C コードを生成します。ベアメタルターゲットでは必須です。これを設定しないと、codegen が利用できないライブラリをリンクしようとして失敗することがあります。LargeConstantGeneration = "KeepInSourceFiles"— 重み定数を別個のデータファイルではなく、ソースファイルに保持します。外部データファイルのリンクがサポートされていないベアメタルターゲットで必要です。
4. パフォーマンスを設定する(SIMD と OpenMP)
組み込み ARM ターゲット向けの SIMD ベクトル化:
cfg.InstructionSetExtensions = 'Neon v7'; % ARM Cortex-A (128-bit, 4x float32)
| ターゲット | 値 | 備考 |
|---|---|---|
| ARM Cortex-A(Raspberry Pi) | 'Neon v7' | 128 ビット SIMD |
| ARM Cortex-M | 設定しないでください — 代わりに CodeReplacementLibrary を使用します | 仕組みが異なります |
組み込み以外のターゲット(Intel x86-64 および InstructionSetExtensions の全設定)、OptimizeReductions、OpenMP については、matlab-generate-code スキルを参照してください。MATLAB Coder と Simulink Coder のプロパティ名の違いについては、references/simulink-config.md を参照してください。
コード置換ライブラリ(CRL) — サポートされている演算を、ベンダー最適化済みの数値計算ライブラリ実装に振り分けます。
Cortex-A では、InstructionSetExtensions と非 SIMD の CodeReplacementLibrary の両方を設定してください。 これらは異なるレイヤーを対象とします。ISE は、生成コード内のベクトル化可能なループに対して NEON SIMD 組み込み関数をインラインで出力します。非 SIMD の CRL は、三角関数、フィルタリング、行列演算などの高レベルな数学演算を、生成せずに利用できるライブラリ実装に振り分けます。ARM Cortex-A CMSIS は ARM CMSIS-DSP ライブラリ(ARM が提供する、Cortex-A 向けに手作業で最適化されたカーネル)に対応しており、それ自体は NEON を出力しないため、InstructionSetExtensions = 'Neon v7' の明示的な設定と併用できます。ISE または CRL のどちらか一方だけを設定すると、性能を最大限に引き出せません。
cfg.HardwareImplementation.ProdHWDeviceType = 'ARM Compatible->ARM Cortex-A';
cfg.InstructionSetExtensions = 'Neon v7'; % SIMD intrinsics (also shown in §4 above)
cfg.CodeReplacementLibrary = 'ARM Cortex-A CMSIS'; % non-SIMD CRL — routes math ops to CMSIS-DSP
Cortex-M の場合は、コンパイラーに対応する CRL を選択してください(例:汎用の場合は 'ARM Cortex-M'。ベンダー固有の CRL は、対応するサポートパッケージに含まれています)。Cortex-M では InstructionSetExtensions を使用しません。
OpenMP — マルチコアターゲット(Cortex-A)では有効にし、シングルコア(Cortex-M — OS/スレッド機能をサポートしておらず、コンパイルに失敗します)では無効にします。
cfg.EnableOpenMP = true; % multi-core targets (Cortex-A)
cfg.EnableOpenMP = false; % single-core targets (Cortex-M)
5. PIL 検証を設定する
PIL は生成されたコードをコンパイルして物理ボードにデプロイし、テストベクトルを送信して、出力を MATLAB と比較します。これにより、SIL では検出できない精度の差異、スタックオーバーフロー、メモリの問題を検出できます。
Cortex-M(シリアルトランスポート):
cfg.VerificationMode = "PIL";
cfg.Hardware.PILInterface = "Serial";
cfg.Hardware.PILCOMPort = "COM4"; % adjust to your system
Cortex-A / Raspberry Pi(SSH トランスポート):
cfg.VerificationMode = "PIL";
cfg.Hardware = coder.hardware("Raspberry Pi");
cfg.Hardware.DeviceAddress = "192.168.1.10";
cfg.Hardware.Username = "<your-pi-username>";
cfg.Hardware.Password = "<your-pi-password>";
cfg.Hardware.BuildDir = "/home/pi/mymodel"; % optional: defaults to /home/pi/MATLAB_ws/<release>
Pi PIL はシリアルではなく SSH 経由で実行されます。サポートパッケージは DeviceAddress、Username、Password を使用して SSH 接続を確立します。BuildDir は、コンパイル済みバイナリをターゲット上のどこにデプロイするかを指定します。省略した場合、既定値は /home/pi/MATLAB_ws/<release>/ です。PILInterface や PILCOMPort は設定しないでください。これらはシリアル接続されたベアメタルボード専用です。
6. コードを生成する
cfg.TargetLang = "C";
codegen -config cfg -args {inputArgs} myEntryPoint
7. MEX → SIL → PIL の順に検証する
デプロイの信頼性を高めるため、次の手順に従ってください。
- MEX — ホスト上で検証し、すばやく反復します
- SIL(ソフトウェアインザループ)— ホスト上で生成コードを実行し、MATLAB と比較します
- PIL(プロセッサインザループ)— 実際のハードウェア上で実行し、MATLAB と比較します
cfgSil = coder.config("lib", "ecoder", true);
cfgSil.VerificationMode = "SIL";
codegen -config cfgSil -args {inputArgs} myEntryPoint
主なプロパティ
| プロパティ | 値 | 用途 |
|---|---|---|
VerificationMode | "PIL"、"SIL"、"None" | インザループ検証を有効にします |
Hardware | coder.hardware(boardName) | ターゲットボードを選択します |
Hardware.PILInterface | "Serial" | PIL の通信方式 |
Hardware.PILCOMPort | "COM4"、"/dev/ttyACM0" | シリアルポート |
EnableDynamicMemoryAllocation | true(既定値)、false | ヒープのマスタースイッチ |
DynamicMemoryAllocationThreshold | 数値(バイト)、既定値は 65536 | この値を超える配列はヒープを使用します |
LargeConstantGeneration | "KeepInSourceFiles"、"WriteOnlyDNNConstantsToDataFiles" | 大きな定数の配置先 |
StackUsageMax | 数値(バイト) | 生成コードのスタック上限(Simulink:MaxStackSize) |
EnableOpenMP | ブール値 | OpenMP マルチスレッド処理(Simulink:MultiThreadedLoops) |
CodeReplacementLibrary | "ARM Cortex-A CMSIS"、"GCC ARM Cortex-A"(SIMD)、"ARM Cortex-M"、… | ベンダー最適化済みの演算置換です。GCC ARM Cortex-A は SIMD CRL です。明示的な ISE と組み合わせないでください。MATLAB では推奨されない旨の警告が表示されます。代わりに "ARM Cortex-A CMSIS" を使用してください |
TargetLang | "C"、"C++" | 出力言語 |
Simulink Coder のパス(
slbuild): 上記の「Simulink:」列に記載されたプロパティは、モデル名に対してset_param(modelName, 'PropertyName', value)を直接実行して設定します。 Simulink Coder のプロパティ対応とコード例の全容については、references/simulink-config.mdを参照してください。
よくある間違い
| 間違い | 問題の理由 | 正しい方法 |
|---|---|---|
DynamicMemoryAllocation = "Off" | プロパティ名と型が間違っています | EnableDynamicMemoryAllocation = false(ブール値) |
| PIL の前に SIL を実行しない | ハードウェア上で発生する PIL の失敗はデバッグがより困難です | 必ず最初に SIL で検証してください |
StackUsageMax を設定しない | 既定値がターゲットの SRAM 容量を超える場合があります | ハードウェアの制約に基づいて明示的に設定してください |
"ecoder", true を指定せずに cfg = coder.config("lib") を使用する | ERT ベースではなく、汎用設定が作成されます | 組み込みターゲットでは必ず "ecoder", true を渡してください |
規約
- 必ず、組み込みターゲットには
coder.config("lib", "ecoder", true)を使用してください - 必ず、ベアメタル Cortex-M ターゲットでは動的メモリ割り当てを無効にしてください
- 必ず、MEX → SIL → PIL の検証順序に従ってください
- 使用禁止:
DynamicMemoryAllocation(プロパティ名が間違っています。正しくはEnableDynamicMemoryAllocationです) - 推奨:Cortex-M ターゲットでは
TargetLang = "C"を使用してください(コードサイズが小さくなります)
参考資料
references/supported-hardware.md— ボードの仕様、サポートパッケージ、PIL インターフェイスの詳細references/simulink-config.md— Simulink Coder のプロパティ名、set_paramのパターン、slbuildのコード例
関連項目
matlab-generate-code— 汎用コード生成の基盤:coder ディレクティブ、スクリーナー、MEX 生成、SIL、設定の調整、組み込み以外のターゲット向け SIMD/OpenMPmatlab-deploy-ai-model— AI モデルの完全なコード生成パイプライン(読み込み、検証、MEX/lib の生成)
Copyright 2026 The MathWorks, Inc.