关于 matlab-deploy-embedded-code
这是一个用于配置 MATLAB Coder 和 Embedded Coder 的 MATLAB 技能,可为嵌入式目标生成 C/C++,并通过 SIL 或 PIL 验证。内容涵盖硬件设置、内存限制和目标专用选项。
主要功能
- 01配置 Embedded Coder 目标
- 02设置硬件与内存限制
- 03调整 SIMD、OpenMP 和代码替换
- 04运行 SIL 与 PIL 验证
- 05生成 C 或 C++ 代码
适用场景
- 01为 STM32 或 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详细介绍
部署嵌入式代码
配置 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 标志会创建基于 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 intrinsic。非 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——不支持操作系统/线程,启用后会导致编译失败)上禁用:
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 容量 | 根据硬件限制显式设置 |
使用 cfg = coder.config("lib"),但未指定 "ecoder", true | 这会创建通用配置,而非基于 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)
版权所有 2026 The MathWorks, Inc.