如何在C S函数之间共享C结构?

时间:2013-07-31 09:37:36

标签: c simulink

有没有办法在几个C S函数之间共享一个C结构(只实例化一次)?这就是我的意思:我有一个带有许多块的Simulink模型,它们被实现为C S函数。这些块中需要许多模型参数,我想创建一个包含所有模型参数的对象,并在开始模拟时仅实例化一次。现在我为每个S函数实例化这个对象以访问参数,但是在S函数之间共享这个对象会很好。

只是一个纯粹的猜测:我可以将我的模型参数结构放在一个单独的DLL中,然后从每个C S函数访问它吗?你们之前有没有这样做过?

2 个答案:

答案 0 :(得分:2)

我已成功实现并测试了DLL的想法(即收集DLL中结构中的所有模型参数 - 加上任何必要的计算 - 并将其链接到其他C S函数)。 Simulink是一个单一的过程,我相信模拟是一个单一的线程(如果没有,有办法使其线程安全)。

来自DLL的模型参数的结构充当单例(每个模拟仅实例化一次并在其他S函数之间共享)。

更新(来自mathworks的一些回复):

Simulink的仿真部分始终是单线程的。因此,共享DLL没有线程安全问题。

不同S功能块的全局变量将共享相同的内存位置。这意味着将为所有Simulink加载共享库的单个实例。因此,加载共享库的所有S函数实例都将引用相同的共享库和数据。

或者,您也可以考虑使用数据存储块来实现全局变量。这将需要从每个S功能到适当的数据存储块的信号连接。但是不需要S函数之间的连接。

答案 1 :(得分:1)

您可以将值分配并存储在单独的DLL中,尽管它看起来很复杂。几年前在s-functions之间共享DLL,我发现Matlab / Simulink的DLL加载是不透明的,难以管理(例如,加载相关的DLL)。

一种更简单的方法 - 让一个s函数在其DWork向量中分配结构:

http://www.mathworks.com/help/simulink/sfg/about-dwork-vectors.html

然后将指针值存储到某些工作空间/全局变量中,以后可以通过其他s函数访问它们。

可能是使用mexEvalString写入工作空间/全局变量的最简单方法,并使用mexGetVariable读取它们(Mathworks文档非常适合这些和其他函数)