打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
导出函数
userphoto

2022.09.17 广东

关注
  
Guy Rouleau
MathWorks 应用工程师

博客介绍关于 Simulink 以及其它 MathWorks 的基于模型的设计工具。官网博客地址:

http://blogs.mathworks.com/simulink/

声明:

本系列已取得原作者授权翻译转发。

其它:

暂定本系列一共翻译十五篇。

本来我写这篇是想介绍一下 R2016b 增加的这几个新模块: Initialize Function、Reset Function 以及 Terminator Function,还有跟它们相关的 State Reader 和 State Writer 模块。

但我突然发现,跟这几个新模块很相关的一种模型架构,我几乎从没提过:

Export Function Models

生成代码

我们拿下面这个模型作为一个例子。它有一个 Bias 和一个 Unit Delay 模块,每 0.001s 运行一次,另外有一个 Math Function 模块,每 0.01s 运行一次

就像你们知道的那样,Embedded Coder 可以把 Simulink 模型生成 C 代码。这里使用 Embedded 默认的系统目标文件配置(tlc文件),所生成的代码像下面这样:

如你所见,代码里有一个 Initialize 函数以及一个 Step 函数。Step 函数将以模型的基础采样率调用,在这里是 0.001s。最好是把这个代码放在单任务环境里运行。

如果你需要的话,也可以让 Simulink 把每个离散采样率归到一个单独的任务。

在这所生成的代码里,每一个采样时间的部分都单独生成一个函数。这样,你就可以用你实现的调度器,来任意调用各个采样率的部分。

导出函数

各个采样率的部分都能生成一个单独的函数还挺有用的,但是,如果你想更随心所欲的控制代码的执行,该怎么做呢?比如说,把某个采样率的部分拆成若干个任务,然后指定每个任务不同的优先级。

为此,Embedded Coder 提供了导出函数(export functions)的功能。这个功能可以直接控制某个部分单独生成函数,另外还可以仿真它们的调度和优先级。

为了匹配导出函数这个目的,你的模型必须以特定的方式来搭建。需要导出的函数顶层必须只包含 Function Call 子系统,输入以及输出端口。这样的话,每一个子系统会生成一个函数。

比如,我们刚才那个模型,重新按照下面这个方式来实现:


对于仿真来说,不同任务的调度必须显示指定出来,比如像上图那样,使用 Stateflow 来实现。要生成代码的时候,你可以在这个子系统上右键,然后导出这个函数。

得到的代码就像下面这样:

你就可以把这些代码集成到你手写的调度器里去了。就像我之前提到的,通过这种方式,你可以将一个速率的部分拆分成多个函数或者任务。

导出函数模型

对于更大型的项目,你也可以将导出函数构造为单独的模型(Export Function Models)。

在这里,顶层的模型只是用于仿真,被引用子模型要生成代码。 Simulink 会自动识别这个模型是用于导出函数的,它所生成的代码也会跟上面的那个子系统类似。

接下来

下周,我们将聊聊如何将这几个新模块 Initialize Function、Reset Function、Terminate Function 模块用在导出函数模型内部,来仿真某个功能或者任务的关闭以及重启。


说明

更详细的信息可以在帮助文档里搜索:

Export-Function Models。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
怎样生成我想要的C代码系列 | 集成外部C代码到Simulink模型
Simulink中使用已有的c代码进行仿真和代码生成
谈谈simulink自动代码生成
什么是Embedded Coder Robot NXT?
MBD的Simulink使用技巧①:Simulink代码生成的基本概念
在MATLAB中采用M文件实现对Simulink中的S函数程序实现自动调参数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服