目录
1. 前言
在上一篇博客Matlab/Simulink自动生成C代码实验(基于一个简单信号滤波例子)中基于一个简单的信号滤波的例子做了利用Simulink Coder和Embedded Coder生成C代码的例子。
基于这个实验结果,进一步对于实际项目开发中的simulink模型进行自动生成代码的实验,结果碰到了一个非常迷幻的问题。在网上上下求索寻找原因解释和解决方案未果,经过艰苦曲折的排查,最终发现一个令人啼笑皆非的原因。由于这个原因过于出乎意料,所以在调查过程中根本就没有往那个方向想,所以最终其实是靠一次意外幸运地发现了问题的原因和临时解决方案。本文仍然基于信号滤波的例子再现这个问题,以为后来者鉴。
2. 实验模型
实验模型与上一篇相同,差异仅在于把用于观测仿真结果的TimeScope和SpectrumAnalyzer删除(在最初发现这个问题时所作实验的实际项目开发模型中没有这些模块)了。
以上模型用Simulink Coder仍然正常地生成了代码,所生成的代码经过验证也是正确的。
接下来用Embedded Coder进行嵌入式代码的生成(虽然实际上这个问题折腾了非常久,但是这里就长话短说直接上结论了),在生成代码弹出的Code Generation Report对话框中,发现所生成的代码是空的,如下所示:
点击"Eliminated Blocks"查看结果如下,结果令人惊讶:
如上图所示,所有的模块都被删除了?!
但是如上所述,该模型与上一篇中能够正常embedded code的模型的差异仅仅在于TimeScope和SpectrumAnalyzer等仿真结果观测模块。
反复实验表明,把这些模块加回去就可以正确生成embedded code,删掉后就无法生成。然后针对发现这个问题的实际项目开模块也同样追加上TimeScope和SpectrumAnalyzer模块也可以正常生成embedded code。但是,基于Simulink Coder生成Generic code不受此影响。
3. 可能的解释
Embedded Coder要生成面向嵌入式运行的代码,在Simulink Coder的基础上加入了优化的步骤,这个优化的过程就包括编译器把认为冗余的模块删除(Elimination)的处理。而判断是否冗余的一个依据则是这个模块的输出数据有没有被使用(做过数字电路综合的小伙伴知道在数字电路综合工具也会执行这种优化)。在以上模型中,因为TImeScope和SpectrumAnalyzer被删除后,编译器认为SinWave和LPF模块的输出数据没有任何人使用(用out模块输出给WorkSpace不算被使用),因此就无情地将它们全部删掉了。。。
这真实一个令人啼笑皆非的优化。。。不过还没有找到官方文档关于这个Elimination处理的描述,所以以上目前只是一个猜测,还有待继续求证。但是,这种Elimination优化处理虽然是合理的,但是工具应该提供比如说指定什么模块不允许进行优化啊之类的选择,但是目前对于Embedded Coder的使用经验还比较少,不知道该如何该如何来更精细地指定Embedded Coder的优化选项。有待进一步调查考证。