mcpField
M
matlab-deploy-embedded-code

matlab-deploy-embedded-code

github.com/matlab开发1.2k45 次安装1 天前更新
代码仓库

关于 matlab-deploy-embedded-code

这是一个用于配置 MATLAB Coder 和 Embedded Coder 的 MATLAB 技能,可为嵌入式目标生成 C/C++,并通过 SIL 或 PIL 验证。内容涵盖硬件设置、内存限制和目标专用选项。

主要功能

  1. 01配置 Embedded Coder 目标
  2. 02设置硬件与内存限制
  3. 03调整 SIMD、OpenMP 和代码替换
  4. 04运行 SIL 与 PIL 验证
  5. 05生成 C 或 C++ 代码

适用场景

  1. 01为 STM32 或 Raspberry Pi 生成代码
  2. 02在裸机目标上禁用动态内存分配
  3. 03在处理器板上测试生成代码
  4. 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.yaml
references/
simulink-config.md
supported-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 的顺序进行验证

为确保部署可靠,请按以下顺序操作:

  1. MEX — 在主机上验证,快速迭代
  2. SIL(软件在环)— 在主机上运行生成的代码,并与 MATLAB 进行比较
  3. PIL(处理器在环)— 在实际硬件上运行,并与 MATLAB 进行比较
cfgSil = coder.config("lib", "ecoder", true);
cfgSil.VerificationMode = "SIL";
codegen -config cfgSil -args {inputArgs} myEntryPoint

关键属性

属性值用途
VerificationMode"PIL"、"SIL"、"None"启用环路内验证
Hardwarecoder.hardware(boardName)选择目标开发板
Hardware.PILInterface"Serial"PIL 通信类型
Hardware.PILCOMPort"COM4"、"/dev/ttyACM0"串行端口
EnableDynamicMemoryAllocationtrue(默认)、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/OpenMP
  • matlab-deploy-ai-model — 完整的 AI 模型代码生成流水线(加载、验证、生成 MEX/lib)

版权所有 2026 The MathWorks, Inc.


评论

支持 Markdown