分享

怎样生成我想要的C代码系列 | Simulink子系统如何生成单独的子函数?

 afliegen 2017-09-27

作者简介

柚籽,MATLAB中文论坛(http://www.) 超级版主,MATLAB/Simulink高级应用工程师,同济大学机械电子工程专业硕士学位,专注于物理系统的建模仿真,在论坛回答问题超过1700个,分享大量Simulink应用学习资源

我们写 C 代码的时候,为了主程序结构清晰,通常会把具有独立功能的代码变成子函数的形式。类似的,为了 Simulink 模型结构清晰,我们在模型里也经常会用把具一片实现某种功能的模块变成子系统的形式

那么,如果我希望这些 Simulink 子系统在自动代码生成时,也能真的生成单独的子函数,该如何配置呢?

点击末尾的 “阅读原文” 下载本文的案例模型

把某个子系统编程函数调用
  • 要得到:

    • 自动生成代码时,让某个 Simulink 子系统的算法生成单独子函数形式。

  • 怎么做:

    • 把该子系统变为元胞子系统 (Atomic Subsystem),并配置子系统的代码生成选项

举个例子

1. 模型

  • 这是在前一篇帖子最后用到的一个模型。MATLAB Function 里面写了一个循环语句,并在循环内部调用了外部子系统 func

  • 它所生成的代码如下图。可以看到 Simulink 子系统 func 在生成代码后,具体的 C 代码并不会平铺在主程序里。它而是作为一个函数调用的形式出现的的 func( )

2. 设置

  • 这是因为对该模块的属性做了设置,如下图

  • 首先右键点击模型,打开 Block Parameters 界面,首先要在 Main 的页面将子系统勾选为Atomic Subsystem。只不过在这个案例模型里,由于 func 是触发子系统,默认就是 Atomic 的。

  • 然后,点开出现的 Code Generation 页面,将 Function packaging 配置为 Nonresusable function,主函数调用它时通过全局变量来传递数据(总之不选择 Inline 和 Auto)。


  • 也可以设置为 Reusable ,这时主程序调用它的时候,会通过传参的方式来进行数据传递。最后生成的代码如下图

  • 模型的默认设置是 Auto,所以在这种情况下,代码生成工具会把这个子系统的算法代码写在主程序里,而不会采用函数调用的方式,如下图:

总结

如果希望某个子系统的 C 代码单独生成一个子函数,那么:

  1. 把子系统配置为元胞子系统(Atomic Subsystem);

  2. 设置 Code Generation 属性为 Reusable  或者 NonReusable。

另外,不仅可以将子系统的代码放在单独的子函数里,还可以配置放在单独的文件(在配置菜单里指定文件名即可)里。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多