我的工作场所使用MATLAB和子产品Simulink,Realtime workshop(RTW),RTW Embedded Coder。我们有一个大型的simulink模型,它被编译成C然后到一个目标文件,以便加载到嵌入式目标上。 整个编译过程需要大约3小时,这很长,主要是从simulink模型生成的C文件的编译和链接。
删除一个特定子系统会将编译时间缩短到30分钟,并且由于此子系统不会经常更改,我计划在C中编码,然后在MEX中编码,并在主模型中使用MEX文件。
该技术会减少编译时间吗? 还有其他一种我应该研究的技术吗?
编辑:我认为解决方案大致如下: 从违规子系统生成C. 将其编译为某种对象,库 将其包含在模型中(但我对模拟不感兴趣,它只有输入) 在构建过程中包含它,可能在编译其余代码后链接答案 0 :(得分:3)
您可以尝试将违规子系统放入另一个模型并使用模型参考。您可以使用Simulink.SubSystem.convertToModelReference将子系统转换为模块。
模型参考具有增量代码生成功能,因此只要模型不变,Simulink就不会为引用的模型重新生成或重新编译代码。
答案 1 :(得分:0)
我不认为你的建议会减少编译时间,因为你似乎暗示大部分时间花在编译生成的源文件上,即C编译器减慢了速度,而不是Simulink。
如果您从该子系统创建一个mex文件(S-Function),您可以选择制作inlined S-Function或non-inlined。除非您转换的子系统相当微不足道(而且我猜它不是),否则您将需要选择前一个选项,因为后者受到严重限制。但是,在这两种情况下,您的C编译器仍将具有编译源文件。在内联的情况下,这些将是您编写的TLC吐出的源文件,而在另一个情况下,它将是您编译的源文件以创建S函数本身。
我能想到的解决方案是在C中复制违规子系统的功能,并使用嵌入式目标的编译器生成静态库。此外,创建一个内联的S函数,在模拟中模拟该子系统。在这个S函数的TLC文件中,您只需要让Simulink为静态库包含适当的头文件,然后进行引用该库的函数调用。这样可以避免编译器在每次模型构建期间重新编译源代码。
在构建模型时,您还需要弄清楚如何传递链接器指令以链接到静态库(假设代码生成过程自动调用嵌入式编译器来构建代码)。