全部学习汇总: GreyZhang/g_matlab: MATLAB once used to be my daily tool. After many years when I go back and read my old learning notes I felt maybe I still need it in the future. So, start this repo to keep some of my old learning notes servral years ago. (github.com)
大学毕业的时候,关于Simulink代码生成的技术一点也不知道,完全是门外汉。刚刚接触的时候也有那么一点点抵触,觉得可能不可靠。没用多久,这种念头真的是一点也么有了。
不知道什么版本开始有了一个Embedded Coder,自己职业变化的原因没能够继续在这方面深入细化下去。前一阵子简单尝试了一下,连文档都基本没看,发现现在的代码生成似乎比以前简单多了。或许做到比较精神还需要很大的功夫,但是能够满足一般需要的确是没有什么大的门槛了。
搭了几个简单的小模型尝试了一下,筛选了自己比较常用的几个配置选项集中到了一个小脚本里面。一般的simulink模型经过这么简单的配置,简单的代码生成已经基本可以了。
来个小例子:
1,搭建了一个简单的加法计算模型:
,2,定义好数据之后,运行写好的小脚本(代码查看文末)
提示如下:
>> model_config
Warning: Temporarily setting SignalResolutionControl to 'TryResolveAll'.
> In warning at 30
In disableimplicitsignalresolution at 48
In model_config at 5
The following signal labels will be forced to resolve to signal objects:
- sum_value (used by: add_test/Add/1)
- number2 (used by: add_test/number2/1)
- number1 (used by: add_test/number1/1)
The following states will be forced to resolve to signal objects:
... none found ...
Restoring SignalResolutionControl to 'UseLocalSettings'.
此时,不仅模型的简单配置完成端口上的信号线也已经跟定义好的数据关联完毕,信号线上都已经加上了小叉子。
3,接下来Ctrl + B的组合键启动代码生成,略等一下完成代码生成并生成一份代码生成报告。
其中,文件的分割管理跟变量定义时相关的,相关的属性需要在数据定义的时候指定。代码注释等信息当然也是可以自己设定的,带着这些信息的话对模型与代码之间的对应追踪还是很有帮助的。
下面看一下生成的代码(我只把主要的逻辑部分展示出来,其他部分可以自己进行模型搭建尝试):
比较令我意外的是这个初始化的函数,居然还给定义时没有进行初始化的变量进行了赋值为0的初始化操作。
其实,模型搭建也是一件很细致的工作,可以配置的参数也是非常多的。拿上面的例子来说,主要的逻辑意义我们已经做完了,也基本上是我们很多时候想要的结果。但是,变量定义的时候我定义的两个输入数字以及一个输出值都是无符号32位数,很明显的一点是这个计算没有考虑溢出保护。
在模型的加法模块参数配置中,把溢出保护的相应部分给勾选上,代码中便会增加溢出保护的相应逻辑。修改后再次代码生成,代码主要部分如下:
如上代码,一个重要的变化就是增加了溢出保护。
现在的MATLAB模块多的令我惊奇,用了多年的MATLAB后来发现其中的一个模块都未能把功能用全。远了不说,在现在的汽车电子行业,未来的逻辑开发在很长的一段时间内估计都会是MATLAB simulink的天下。
最后,附件一下自己的小脚本代码:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Grey 2015.12.01 @BeiJing
% Configurations for simulink code generation with Embeded Coder.
%
disableimplicitsignalresolution(bdroot);
set_param(bdroot,'Solver','ode3');
set_param(bdroot,'SystemTargetFile','ert.tlc');
set_param(bdroot,'GenerateMakefile','off');
set_param(bdroot,'GenerateComments','on');
set_param(bdroot,'GenerateTraceInfo','on');
set_param(bdroot,'GenerateReport','on');
set_param(bdroot,'LaunchReport','on');
set_param(bdroot,'GenerateASAP2','on');
set_param(bdroot,'GenerateSampleERTMain','off');