Simulink代码生成(一) Embedded Coder配置

生成代码是基于模型设计的重要环节。在工作中经常需要手动生成一下代码来验证一些简单的问题,譬如想知道某种配置或者某种模型会生成什么形式的代码。

本文会结合一个简单的模型,描述生成嵌入式代码的最简配置流程。同时简要分析在Simulink默认配置下所生成的代码。不同版本的Matlab生成的代码可能有少许区别,本文基于Matlab2018a环境。

创建模型

首先打开Simulink,随意创建一个简单的模型,如下图。
Simulink代码生成(一) Embedded Coder配置
一般控制策略的模型都会包括输入输出端口和内部的控制逻辑。这里建立的控制逻辑比较简单,只是放大两倍,在C代码中对应的就是简单的乘以2。

除此以外先不用对模块进行配置,观察在默认配置下,生成的代码是什么形式。

代码生成配置

以下是生成代码的最基本设置

1.Ctrl+E打开模型的配置窗口
Simulink代码生成(一) Embedded Coder配置
2.点击左侧的Solver,右侧Type选为Fixed-step,Solver选为discrete。这是因为必须是离散的求解器才能用Embedded Coder生成代码。
Simulink代码生成(一) Embedded Coder配置
3.点击左侧的Code Generation,把System target file选为Embedded Coder。这么配置是告诉Simulink要生成生成嵌入式C代码。
Simulink代码生成(一) Embedded Coder配置
4.点击Report,勾选Create code generation report和Open report automatically。这样,在生成完毕代码后会自动打开报告。最后点击OK即可完成配置。
Simulink代码生成(一) Embedded Coder配置
5.Ctrl+B生成代码,会在Matlab当前工作路径下生成。代码生成完毕后自动弹出如下报告,可以通过点击左侧的目录或者c文件/头文件名,查看代码。
Simulink代码生成(一) Embedded Coder配置

代码分析

通常来说,一个大型的项目,例如汽车的某个控制器开发,会生成几十万上百万行代码。这种情况下,一般是不会去看Embedded Coder生成的代码,而且Mathworks的工程师也不建议我们去看模型生成的代码。

但是,作为软件集成工程师,分析模型生成的代码是非常重要的技能。因为:
1.熟知Simulink配置对应的C代码,才能配置好底层和应用层交互的接口以及应用层模型之间交互的接口;
2.Simulink生成的代码并不可靠,有的时候也会生成错误的代码,这时就需要我们去人工的检查代码;
3.优化软件资源占用,可能需要从代码入手。

接下来简单分析生成的代码。
1.首先,会有一个ert_main.c的主函数。主函数中会调用模型的初始化函数和step函数。
Simulink代码生成(一) Embedded Coder配置
这个主函数其实完全没有必要,因为项目团队中一般会为底层配置好操作系统和任务调度,而不需要用Simulink生成。可以配置Simulink不生成这个主函数,以减少生成代码所用的时间。
Simulink代码生成(一) Embedded Coder配置
2.比较重要的是demo.h头文件。

头文件中首先是宏定义。然后通过结构体定义了输入输出变量类型,以及声明模型的初始化函数,step函数等。
Simulink代码生成(一) Embedded Coder配置
3.接着是C文件

C文件里声明了模型的输入输出port所对应的变量,以及一眼就能看到的乘以2的计算。很显然,这种结构体形式的输入输出变量是没法和其他模型生成的代码交互的。因此,还需要通过正确的配置方式来获取想要的变量定义,例如把输入输出定义为全局变量。
Simulink代码生成(一) Embedded Coder配置
一般来说,如果想要看看某个简单模型对应的代码,只要看step函数就可以了。

总结

本文只是通过简单的配置来生成代码样例,这样的代码完全没法拿去和其他代码集成编译软件,还需要更多的配置才行。后面会在此基础上,讨论更多的代码生成配置,包括如何和底层代码交互,如何生成适合某个硬件的代码,如何优化代码等。