分享

系列文章 | 怎样从Simulink模型生成我想要的C代码?

 afliegen 2017-09-27


作者简介

柚籽,MATLAB中文论坛(http://www.) 超级版主,MATLAB/Simulink高级应用工程师,同济大学机械电子工程专业硕士学位,专注于物理系统的建模仿真,在论坛回答问题超过1700个,分享大量Simulink应用学习资源

Simulink 模型的自动代码生成?

简单来说,在我们的 “大” 项目中,需要实现很多算法,其中比如 myfilter。

现在不手写C了,而是搭建Simulink框图。对那些算法比C语法熟悉的人来说,这是个福音。

算法实现方便,测试方便……(此处省略Simulink优势一万字。)

Simulink 模型的测试验证非常重要,然而这里不讨论。

总之,算法没问题之后,通过自定代码生成工具Coder“翻译”成C代码,跟手写的一样.c.h,还可以控制函数原型、数据定义、文件结构、甚至注释......

把自动生成的源文件集成到原来的项目文件中。

由各种编译器,把它们编译成不同的可执行文件,最后运行在不同的环境。

比如这里就是通过 VS 编译成 exe,很简单吧。

所以

对于代码生成的任务来说

重点在如何生成自己想要的C代码


但经常会有人问,Coder支持哪些板子?

看下面这张嵌入式软件的伪代码的简单示意图。

Simulink 算法模型通过 Coder 生成的是蓝色部分,标准C;跟硬件打交道的底层驱动黑色部分,是手写代码。

既然叫Coder,所以本质上,它的本职工作就是Simulink模型到C代码这个步骤,就结束了。至于C要通过什么编译器跑到什么硬件上,跟Coder没多大关系。

那么

为什么会有人问这个问题呢?

Build Process

Coder除了把模型翻译成代码的本职工作以外,还额外张罗了一些Build的任务,把C代码变成可执行文件。

为什么说张罗,而不说完成呢,因为Coder本身并没有编译的功能,它会后台调用你安装了的编译器来实现 ,看下图。

比如默认下,Coder会调用VC,使用它内置的相应的main文件模板,然后编译。这就是为什么每次生成代码,在当前目录下就会 “莫名其妙” 的生成一个exe程序。如果你不喜欢,那也可以 “Generate code only”。

如果是上面没列的编译器,自己也可以把它集成进来,比如构造个Template makefile,描述怎么编译链接变成可执行文件。

好像还是没解释所谓硬件支持的问题?

I/O Drive blocks

刚才说的是后台可以调用编译器,构造main文件,生成了可执行文件,下载到硬件。

在很久很久以前,代码生成工具为一些板卡提供了I/O驱动模块库,TIC2000/5000/6000,等等。

然后可以做什么?

看下面这张图,两端的In/Out就换成图中的硬件驱动模块。举例的板卡的驱动库我没装,暂时拿Arduino的库示意一下,提供了很多下图中红框类似的模块。

那么,中间用Simulink/Stateflow搭好算法,两头的输入输出端口连接上这些硬件驱动模块,后台又做好了编译工具链的支持,就可以实现传说中的支持某款硬件:一键下载到硬件上运行了。

如果使用这种方式来开发产品,这样看上去感觉真的很美好~

但是,目测,要做的额外的工作也非常多,所有的要用到的驱动都需要包裹成Simulink Block的形式,要自动生成所需要的main文件,等等,这也是不小的工作量。

做产品开发,使用哪种 “集成” 方式,仁者见仁。

现在就Coder工具来说,这部分 “对硬件的支持” 从Coder里剥离了,变成了免费的Hardware Support Package下载。用来做做算法的原型测试也不错。

另一个经常会问的问题:

代码生成工具的效率怎么样?

虽然Coder习惯叫代码生成工具,但它实际上是个代码翻译工具,把Simulink模型“翻译”成C代码。

其实就跟金山词霸,谷歌翻译一样,基于你写的中文翻译成英文。

“今日天朗气清,看似极好的日子,私心想若能约上三五好友,结伴出游,陶冶性情,便是再好不过了。”

再厉害的谷歌翻译,也翻译不出这句人话:“今天不想上班。”

所以对于Coder来说,也是一样,它的目标是C代码如实的反映出你搭建的Simulink模型结构所表达的信息。在考虑生成的C代码效率如何时,也不能忽略Simulink模型搭建的效率如何?

Simulink Coder生成的C代码主要用于加速桌面仿真、快速原型、以及HIL测试(被控对象模型也要生成C代码)。Embedded Coder提供了更多的自定义的途径,生成高效率的嵌入式C代码。

但其实,对于我们用户来说,这些Coder都是 “看不见” 的,没有所谓打开Embedded Coder工具箱的说法。

我们只需要关心选择哪一个系统目标文件(System tareget file)。罢了,下图。“无责任瞎猜一句”,为什么这些后缀名是.tlc呢?因为Coder里面干翻译这个活的叫Target Language Compiler

红框外的.tlc只是针对各自不同的目标稍作了些修改,完成一些额外的事。比如ert_shrlib.tlc,多做了一个工作,把生成的.c.h变成.dll。

这一个小节说人话就是:选择ert.tlc。

如果对于一些小算法你有什么高效率的实现,也可以添加进来。比如说查表,比说说针对某个特殊器件的四则运算,到时候Coder就会替换你的实现方式。

当然,一些通用的提高代码效率的方法,还是可以试试。让 Coder 基于它的 “经验”,给你一些通用的建议:


所以,对于代码生成的任务来说,除了选择ert.tlc,点个按钮之外,再考虑下数据管理、代码结构、文件结构......

说人话,就是:

如何生成自己想要的C代码

这一系列文章会用一个一个的小例子来逐渐说明:如何让Simulink生成所希望的代码。在这里并不打算介绍系统介绍代码生成,不过分享的这些案例可见一斑。

今天的第二条图文就是本系列的第一篇:使用Simulink.AliasType数据对象。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多