Simulink 自动代码生成原理

如下图,Simulink模型会先变成一个文本式的 .rtw 模型描述文件,然后再变成 .c,.h,最后编译为最终目标文件。

image

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

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

----------------------

再进一步详细的来查看这个代码生成的过程:

image

首先是代码生成解析

model.slx ----〉 model.rtw

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

 

详细的信息可以参考这里:

http://www.mathworks.com/help/releases/R2016a/rtw/tlc/introduction-to-the-model-rtw-file.html 

 

然而看得很熟悉也没什么用,首先它只是一个会自动生成的中间文件,甚至在生成代码后会自动删除,除非你特意设置了保留它。其次,每一个版本更新,它的格式说不定还会变。

然后是目标语言编

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 下去。感兴趣的话,可以在 MATLAB 安装路径 rtwc 文件夹下看到很多很多 .tlc 文件。

image

2 代码内容定制文件

a. 风格

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

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

image

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

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

image

文件在下图中菜单中指定。

所以,这个文件是修改这个模型生成的所有源代码文件的风格。其实一般来说,也不会去改它,修改它大部分是为了定义自己的顶部注释文字。

image

b.内容

image

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

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

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

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

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

从上面再上面的窗口截图可以看到,这里也有一个 .tlc 文件: example_file_process.tlc 。 顺便还可以看到它下面有一个勾选项,就是 Generate an example main program。

所以这个 .tlc 文件可以定义生成自己指定结构的 main 文件。

3. S-function 的 TLC 文件

最开始的第一张图右边的模块是硬件写模块。它以 S-function 的形式调用了硬件I/O的函数。所以在做代码生成的时候,也需要有一个 tlc 文件来告诉 TLC编译器如何生成它的代码。

image

类似于下面这样。其实就是把调用底层函数的语句写在适当的地方。这个文件可以自动生成,所以不用详细研究也无所谓了。

image

Make 机制

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

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

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

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

image

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

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

如果只是想做 Simulink 算法模型的 C 代码生成,上述所说的各种文件都不需要关心。至需要在配制页面做些简单的配制,做好数据管理,就好了。

这里介绍的是工具定制层面的,并不是算法生成层面的。如何做一些跟算法不相关的自定义。

 

原文地址:https://www.cnblogs.com/simulink/p/5289238.html