Как разделить структуру C среди функций C S?

Есть ли способ разделить структуру C (созданную только один раз) среди нескольких функций C S? Вот что я имею в виду: у меня есть модель Simulink со многими блоками, которые реализованы как C S-функции. Есть много параметров модели, которые необходимы в этих блоках, и я хотел бы создать один объект, который содержит все параметры модели и создается только один раз, когда я запускаю симуляцию. Прямо сейчас я создаю экземпляр этого объекта для каждой S-функции, чтобы получить доступ к параметрам, но было бы неплохо поделиться этим объектом среди S-функций.

Просто чистое предположение: могу ли я поместить структуру параметров моей модели в отдельную DLL и впоследствии обращаться к ней из каждой C-функции? Кто-нибудь из вас делал это раньше?

2 ответа

Решение

Я успешно реализовал и протестировал идею DLL (т.е. собрал все параметры модели в структуре внутри DLL - плюс любые необходимые вычисления - и связал ее с другими C-функциями C). Simulink - это отдельный процесс, и я считаю, что моделирование - это один поток (если нет, то есть способы сделать его поточно-ориентированным).

Структура с параметрами модели из DLL действует как одноэлементная (создается только один раз за симуляцию и используется совместно с другими S-функциями).

Обновление (некоторые ответы из математических работ):

Симуляционная часть от Simulink всегда однопоточная. Следовательно, нет проблем с безопасностью потоков для разделяемой DLL.

Глобальные переменные для различных блоков S-функций будут совместно использовать одну и ту же ячейку памяти. Это означает, что один экземпляр общей библиотеки будет загружен для всего Simulink. Поэтому все экземпляры S-функций, которые загружают общую библиотеку, будут ссылаться на одну и ту же общую библиотеку и данные.

В качестве альтернативы вы также можете рассмотреть возможность использования блоков хранилища данных для реализации глобальных переменных. Это потребует подключения сигнала от каждой S-функции к соответствующим блокам хранилища данных. Но связь между S-функциями не понадобится.

Вы можете размещать и хранить значения в отдельной DLL, хотя это кажется сложным. Разделяя DLL между s-функциями несколько лет назад, я обнаружил, что загрузка DLL Matlab / Simulink непрозрачна и трудна в управлении (например, загрузка зависимых DLL).

Более простой подход - одна s-функция выделяет структуры в своем векторе DWork:

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

затем сохраните значения указателя в некоторой рабочей области / глобальных переменных, где позже они могут быть доступны другим s-функциям.

Вероятно, самый простой способ записи в рабочую область / глобальные переменные с помощью mexEvalString и чтения из них с помощью mexGetVariable (документация по Mathworks отлично подходит для этих и других функций)

Другие вопросы по тегам