Embedded Coder 综合教程
第一部分:什么是 Embedded Coder?为什么需要它?
核心概念 Embedded Coder 是 MathWorks 开发的一个专业代码生成工具箱,它位于 Simulink Coder 之上,它的核心功能是将 Simulink 模型、Stateflow 状态图、MATLAB Function 模块等,自动、高效、可靠地生成符合生产标准的、可部署在嵌入式处理器(如 ARM, Infineon, TI 等)上的 C 和 C++ 代码。

核心优势
- 自动代码生成: 将系统建模与底层代码实现分离,工程师可以专注于算法设计和系统验证,而无需手动编写繁琐、易错的底层代码。
- 高质量、高效率代码: 生成的代码具有高可读性、模块化和可维护性,并且经过高度优化,代码效率接近或优于手写代码。
- 硬件在环测试: 生成的代码可以脱离 MATLAB/Simulink 环境,作为独立的可执行文件在目标硬件(如微控制器、ECU)上运行,实现真实的硬件测试。
- 认证支持: 提供了符合汽车行业(如 MISRA C/C++、AUTOSAR)、工业安全(如 IEC 61508)等标准的功能和报告,极大地简化了认证流程。
- 完整的工具链: 与 MATLAB、Simulink、Stateflow 以及各种硬件工具箱(如 Support Package for ARM Processors)无缝集成,形成一个从模型到部署的完整工作流。
第二部分:核心工作流程
使用 Embedded Coder 开发嵌入式应用程序,通常遵循以下五个关键步骤:
步骤 1:建模
- 目标: 在 Simulink 中创建一个能够准确描述您系统动态行为的模型。
- 关键点:
- 使用合适的库(如 Simulink Library, DSP System Toolbox)搭建模型。
- 明确定义模型的输入、输出和内部状态。
- 确保模型是可综合的,即其功能可以被硬件执行。
步骤 2:配置参数

- 目标: 通过配置参数,告诉 Embedded Coder 如何生成代码。
- 关键配置项(位于
Model Configuration Parameters>Code Generation):- System target file: 选择
ert.tlc(Embedded Coder Target),这是最常用和最灵活的选项。 - Language: 选择 C 或 C++。
- Generate code only: 只生成代码,不进行编译,适合在生成代码前进行语法检查。
- Generate an example main program: 生成一个简单的
main.c文件,用于快速测试生成的代码。 - Customize function names: 可以自定义生成的函数名,以便于集成到现有代码库中。
- System target file: 选择
步骤 3:验证模型
- 目标: 确保模型的行为符合设计要求,并且在生成代码后,模型的行为与生成的代码行为一致。
- 验证方法:
- 仿真: 运行 Simulink 模型,检查仿真结果。
- 软件在环: 在宿主机(如PC)上编译并运行生成的代码,比较其输出与模型仿真结果是否一致。
- 处理器在环: 在目标硬件上运行生成的代码,比较其输出与模型仿真结果是否一致。
- 硬件在环: 将生成的代码部署到目标硬件,并连接到实际的物理环境进行测试。
步骤 4:生成代码
- 目标: 执行代码生成命令。
- 操作:
- 在 Simulink 界面,点击
Code选项卡,然后点击C/C++ Code>Build Code。 - Embedded Coder 会根据您在步骤 2 中设置的参数,自动分析模型、生成头文件、源文件以及构建脚本(如
makefile)。
- 在 Simulink 界面,点击
步骤 5:集成与部署
- 目标: 将生成的代码集成到您的嵌入式开发环境中,并烧录到目标硬件上运行。
- 操作:
- 打开生成的代码文件夹,您会看到清晰的目录结构(
src,include,docs等)。 - 使用您 IDE(如 Keil, IAR, Eclipse)中的编译器,根据生成的
makefile或项目文件进行编译和链接。 - 通过调试器将最终的可执行文件烧录到目标硬件中。
- 打开生成的代码文件夹,您会看到清晰的目录结构(
第三部分:入门实战 - 一个简单的 FIR 滤波器
让我们通过一个具体的例子来走一遍完整的工作流。

建模
- 打开 MATLAB,输入
simulink并创建一个新模型。 - 从 Simulink Library Browser 中拖拽以下模块到模型中:
- Sources Library:
Signal From Workspace(作为输入信号) - DSP System Toolbox / Filtering / Filters:
FIR Filter Design(设计滤波器) - DSP System Toolbox / Filtering / Filters:
FIR Filter(应用滤波器) - Sinks Library:
Scope(查看结果)
- Sources Library:
- 连接模块:
Signal From Workspace->FIR Filter->Scope。 - 双击
Signal From Workspace,设置Signal为sin(0.2*pi*(0:100))' + 0.5*randn(101,1)',设置Sample time为1。 - 双击
FIR Filter Design,选择Design method为Lowpass,设置Cutoff frequency (Hz)为1(归一化频率),点击Design Filter,然后将该模块的输出连接到FIR Filter的Numerator端口。
配置参数
- 在模型窗口中,点击
Model Settings(齿轮图标)。 - 在弹出的对话框中,选择左侧的
Code Generation。 - 在
System target file下拉菜单中,选择ert.tlc。 - 在
Language中选择C。 - 确保
Generate an example main program被勾选,这样会生成一个简单的main.c用于测试。 - 点击
OK保存。
验证模型
- 点击
Run按钮运行仿真。 - 双击
Scope查看滤波前后的信号波形,确认滤波效果符合预期。
生成代码
- 点击
Code选项卡。 - 点击
C/C++ Code>Build Code。 - MATLAB 会在当前工作目录下创建一个名为
slprj的文件夹,并在其中生成代码,您可以打开slprj/ert_rtw/fir_filter_grt_rtw目录查看生成的fir_filter.c和fir_filter.h等文件。
集成与部署(概念演示)
- 打开生成的
main.c文件,您会发现它已经包含了调用step()函数(Simulink 生成的函数)来运行滤波器的main函数。 - 在实际项目中,您需要将生成的
src文件夹下的.c文件和include文件夹下的.h文件添加到您的嵌入式工程中,并使用相应的编译器进行编译。
第四部分:高级主题与最佳实践
数据类型与定点化
- 问题: 浮点运算在许多嵌入式处理器上很慢且占用资源多。
- 解决方案: 使用 Simulink 的 Fixed-Point Designer 工具箱。
- 实践:
- 在模型中,将
Signal From Workspace和Scope的数据类型设置为fixdt(1, 16, 15)(16位定点数,1位符号位,15位小数)。 - 双击
FIR Filter模块,在Main选项卡中,将Output数据类型也设置为fixdt(1, 16, 15)。 - 运行仿真,确保定点化后的结果与浮点结果在可接受的误差范围内。
- 重新生成代码,此时生成的代码将使用高效的定点整数运算。
- 在模型中,将
代码可读性与可维护性
- 使用注释: 在 Simulink 模块中添加注释(
Ctrl+I),这些注释会自动生成到代码中。 - 使用数据字典: 使用 Simulink Data Dictionary (
.sldd文件) 来集中管理模型中所有参数、信号和状态的数据类型、单位、范围等信息,这极大地提高了模型的可维护性。 - 使用
coder.target和coder.inline:coder.target('Rtw'): 用于判断代码是否正在被生成,可以在 MATLAB Function 模块中用它来编写仅在代码生成时执行的逻辑。coder.inline('never'): 强制 Embedded Coder 不要将某个函数内联,以保持函数的独立性,便于调试。
符合编码标准(如 MISRA C)
- 启用检查: 在
Model Configuration Parameters>Code Generation>Diagnostics中,可以启用MISRA C:2004或MISRA C:2012的检查规则。 - 查看报告: 代码生成后,Embedded Coder 会生成一个详细的 HTML 报告,标出所有不符合标准的代码位置和原因,方便您进行修复。
自定义代码生成
- 编写 TLC 文件: 对于非常特殊的需求,您可以编写 TLC (Target Language Compiler) 模板文件,直接控制代码生成的最终形式,这是最高级的定制方法。
- 使用
makefile模板: 您可以提供一个自定义的makefile模板,让 Embedded Coder 使用您指定的编译器、链接器和编译选项。
第五部分:学习资源
-
官方文档 (最权威):
-
视频教程:
- 在 MathWorks 官方 YouTube 频道搜索 "Embedded Coder Tutorial",有大量入门和进阶视频。
- 搜索 "MATLAB EXPO" 相关演讲,通常有来自各大厂商(如 Bosch, Tesla)的 Embedded Coder 最佳实践分享。
-
示例模型:
- 在 MATLAB 命令窗口输入
ecoderex*并按 Tab 键,可以查看所有 Embedded Coder 自带的示例模型。ecoderex_fir_fixpt就是一个很好的定点滤波器示例。
- 在 MATLAB 命令窗口输入
-
社区与支持:
- MATLAB Central - File Exchange: 搜索并下载由社区贡献的示例和工具。
- MATLAB Answers: 提问和寻找解决方案的社区。
希望这份详细的教程能帮助你顺利掌握 Embedded Coder!祝你学习愉快!
