我使用 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();
}
...
}
以上两个调度给出不同的结果。我想知道哪一个是正确的?非常感谢任何帮助。
在我看来,您似乎为代码生成选择了 S 函数目标。如果您打算在通用处理器上运行代码,我建议使用 grt 目标。
应正确设置仿真 -> 模型配置参数 ->代码生成 -> 系统目标文件。一个好的起点是grt.tlc或ert.tlc。
生成代码时,您将看到以下函数:
-
<model_name>_initialize
- 此函数应在进入调度循环之前调用一次 -
<model_name>_step
- 如果模型中有多个任务速率,则可能有多个这样的函数。在目标代码中调用这些代码的速率应与它们在模型中执行的速率相同。 -
<model_name>_terminate
- 应在关闭目标之前调用此函数(尽管在很多情况下,这可能是空的)
这个 Matlab 帮助页面可能是进一步研究的良好起点。