浅谈Simulink 自动代码生成原理

介绍代码生成的时候,第一步就是选择目标【Target Selection】,Matlab已经自带了不少目标系统,例如ert.tlc。

如果你安装了NIVeriStand或其他快速原型产品,这里就会多出来一些目标系统可以选择。自定义目标系统是为了让Simulink生成的代码能根据用户的需要,与底层驱动做集成。

我们首先需要了解Simulink目标编译的流程,如下图,Simulink模型会先变成一个文本式的 .rtw 模型描述文件,然后再变成 .c,.h,最后编译为最终目标文件。

典型的 Simulink 用户通常都是,用Simulink设计好算法后,做到生成源代码这一步。然后把生成的算法的.c .h 源代码拷贝到自己的工程目录下(比如 CCS或者CodeWarrior 或者 VC ),去做编译。

但是也有部分人希望把编译下载的工作也集成到 MATLAB/Simulink 里面来,实现“一键编译下载”。这样对于开发人员来说就方便很多,但是后面就增加了很多的基础工作需要去做,比如自定义编译过程,以及将底层驱动集成到 Simulink 环境中去。

首先是代码生成解析

model.slx ----〉 model.rtw

解析出来的 .rtw 是文本文件,描述了所有模块、输入、输出、参数、状态等等模型的全部配置和属性信息。旧版的 Simulink 的 .mdl文件用文本文件打开,内容就是那差不多的风格。

然后是目标语言编译

model.rtw ---> model.c model.h

Target Language Compiler 是代码生成工具, Simulink Coder/Embedded Coder 会使用这个工具,去执行 .tlc 文件。 tlc 文件里描述了如何将 .rtw 变成代码。

所以 tlc 也可以说是一种编程语言,一种解释性的编程语言。它是专门设计用来实现代码生成的。通过它写出来的文件后缀名都是 .tlc,所以一般也会说是 .tlc 文件。

代码生成用到的 .tlc 文件是一系列,而不是单单是一个或者一类。

1 系统目标文件

在这个位置设置的 tlc 文件叫做系统目标文件。

它控制的是全局的代码生成,比如是生成 C 还是 C++,是生成嵌入式的紧凑型代码还是生成实时仿真用的代码,等等。

所以这个文件里面也定义了你能在这个 Code Generation 下面能看到的各个菜单和各个选项。

正因为它要做的事情很多,所以实际上它里面 include 了别的 .tlc 文件,再层层叠叠的 include 下去。

2 代码内容定制文件

a. 风格

左边是自动生成的代码,与右边相比,是不是很相似。

在代码生成过程中,会按照右边的模板,将标注的 %<>占位符会变成模型的真实信息,生成左边的代码文件。

这个文件后缀名是 .cgt,所以它并不负责具体的代码生成,只是定义了源代码文件的框架结构。TLC 按照这个结构来生成代码文件。

比如 .c 文件一开始先写几行注释说明文字,然后放置所有生成的 includes 信息,然后放置所有的 define 信息 ,等等。

b.内容

代码生成总的来说,包括跟算法相关的 .c .h 文件还包括一个示例的 main 文件。跟算法相关的源文件内容是由模型以及数据管理决定的。

这个 main 文件只是个示例作用,当 Code Generation 页面上的 Generate Code only 选项没有被选中时,会自动生成一个 model.exe。这时候用的就是这个示例 main 文件。大部分人都有自己的集成开发环境,所以都不需要这个 main 文件。

那什么时候需要生成自己的 main 文件呢?

就是当需要把 C 代码编译下载功能也集成在 MATLAB/Simulink 环境下的时候。这时就需要提供一个针对编译器正常使用的 main 文件。

注意这并不是说 MATLAB/Simulink 可以代替编译器,后台还是需要有语句来调用编译器的功能。

Make 机制

model.c model.h --> model.hex / model.exe

Make 过程就是调用编译器的 make 功能,把的源文件以及 Main 文件,以及各种库源文件都编译,然后链接,变成目标可执行文件。

左边是实际上需要使用的 make 文件,后缀名.mk。它描写了如何将源文件编译生成可执行文件。其中包括模型信息,编译工具地址、库文件地址等等。可以看到有些信息是与模型相关的,也就是会变化的,有些是不会变化的。

所以,真正需要提供的是 make 文件的模板,后缀名 .tmf 如右图。在模板里,会变化的地方使用占位符(传说中的 Token),等真正需要的时候,代码生成工具会自动取得相应的信息,而生成本模型需要的 make 文件。

针对特定编译器的模板文件是需要自己写的。编译器在编译成功后会自动生成一个 .mk 文件,可以把这个拿过来改写。

综上,代码生成的过程,简单来说就是这样的流程。

编辑于 2022-04-21 18:34