生成代码
我们拿下面这个模型作为一个例子。它有一个 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 会自动识别这个模型是用于导出函数的,它所生成的代码也会跟上面的那个子系统类似。
-
函数
+关注
关注
3文章
4299浏览量
62352 -
代码
+关注
关注
30文章
4733浏览量
68277
发布评论请先 登录
相关推荐
评论