在Simulink Coder转换后调用Simulink模型的C函数的正确调度是什么?

时间:2016-01-15 09:47:48

标签: simulink

我已经使用Simulink构建子系统并使用Simulink Coder将其转换为C.然后我将编写我的主函数,其中将调用子系统的C函数(mdlOutput(),mdlUpdate()等),如下所示:

/* scheduling 1*/
main()
{
...  
for (i=0;i<100;i++)
{
   mdlOutput();
   mdl_U = 1-mdl_Y; /* updating input using output */
   mdlUpdate();
}
...
}

您可以看到主要功能中形成了反馈。但是,我已经看到很多例子,其中mdl_U位于mdlOuput()之前,如:

/* scheduling 2*/
main()
{
...
for (i=0;i<100;i++)
{
   mdl_U = 1-mdl_Y; /* updating input using output */
   mdlOutput();  
   mdlUpdate();
 }
...
}

以上两个调度给出了不同的结果。我想知道哪一个是正确的?非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我认为您为代码生成选择了S-Function目标。如果您打算在通用处理器上运行代码,我会建议使用grt目标。

模拟 - &gt;型号配置参数 - &gt;代码生成 - &gt;应正确设置系统目标文件。一个很好的起点是grt.tlc或ert.tlc。

生成代码时,您将看到以下功能:

  1. <model_name>_initialize - 此功能应在进入调度循环之前调用一次
  2. <model_name>_step - 如果您的模型中有多个任务率,则可能有其中一些功能。这些应该在目标代码中以与它们在模型中执行的速率相同的速率调用。
  3. <model_name>_terminate - 应该在关闭目标之前调用此函数(尽管在很多情况下,这可能是空的)
  4. This Matlab help page可能是进一步研究的良好起点。