Simulink 模型的自动代码生成?
简单来说,在我们的 “大” 项目中,需要实现很多算法,其中比如 myfilter。
现在不手写C了,而是搭建Simulink框图。对那些算法比C语法熟悉的人来说,这是个福音。
算法实现方便,测试方便
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里面干翻译这个活的叫TargetLanguageCompiler。
红框外的.tlc只是针对各自不同的目标稍作了些修改,完成一些额外的事。比如ert_shrlib.tlc,多做了一个工作,把生成的.c.h变成.dll。
这一个小节说人话就是:选择ert.tlc。
如果对于一些小算法你有什么高效率的实现,也可以添加进来。比如说查表,比说说针对某个特殊器件的四则运算,到时候Coder就会替换你的实现方式。
当然,一些通用的提高代码效率的方法,还是可以试试。让 Coder 基于它的 “经验”,给你一些通用的建议:
所以,对于代码生成的任务来说,除了选择ert.tlc,点个按钮之外,再考虑下数据管理、代码结构、文件结构......
-
嵌入式
+关注
关注
5068文章
19014浏览量
303144 -
C代码
+关注
关注
1文章
89浏览量
14286
发布评论请先 登录
相关推荐
评论