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