В этом разделе приведены общие советы по отладке S-функций C MEX в среде Simulink ® и использованию программного обеспечения сторонних производителей. В следующих списках перечислены некоторые из наиболее распространенных ошибок, допущенных при записи S-функции. Для более подробного анализа используйте отладчик, поставляемый с компилятором Си.
Примеры в конце этого раздела показывают, как отладить S-функцию C MEX во время моделирования с использованием стороннего программного обеспечения.
В первом примере используется среда Microsoft ® Visual C++ ® .NET (версия 7.0).
Во втором примере выполняется отладка S-функции на платформе Open Group UNIX ®.
Дополнительные сведения об отладке файлов см. в документации компилятора.
Прежде чем начать, убедитесь, что вы хорошо понимаете, как писать C S-функции и требуемые методы обратного вызова. За помощью:
Ознакомьтесь с разделом Доступные реализации S-функций, чтобы определить, была ли реализована S-функция с помощью наиболее подходящего метода.
Если S-функция не компилируется, сначала убедитесь, что mex команда правильно настроена, и функция S включает все необходимые файлы:
Управляемый mex -setup для обеспечения правильной установки компилятора.
Убедитесь, что вы передаете все исходные файлы, необходимые для вашей S-функции, в mex команда.
Убедитесь, что эти дополнительные исходные файлы находятся в пути MATLAB ®.
Убедитесь, что функция S включает simstruc.h файл заголовка. При доступе к устаревшему коду убедитесь, что все файлы заголовка, необходимые для этого кода, также включены в S-функцию.
Убедитесь, что S-функция не включает simstruc_types.h или rtwtypes.h заголовочные файлы. Эти файлы заголовков Simulink и Simulink Coder™ включаются автоматически. При компиляции S-функции в виде файла MEX для моделирования, включая rtwtypes.h файл приводит к ошибкам.
Если mex команда компилирует S-функцию, но S-функция не моделируется или моделирование приводит к неправильным результатам, проверьте исходный код S-функции, чтобы убедиться, что:
Вы не перезаписываете важную память
Вы не используете неинициализированные переменные
В следующей таблице описаны дополнительные общие конструкции S-функций, которые могут привести к ошибкам компиляции и моделирования.
| Ваша S-функция... | Ищите... |
|---|---|
Использовать for петли для назначения памяти? | Экземпляры, в которых S-функция может непреднамеренно назначить значения за пределами границ массива. |
| Использовать глобальные переменные? | Расположения в коде, в которых глобальные переменные могут быть повреждены. Если в модели имеется несколько экземпляров S-функции, они могут записываться в одну и ту же ячейку памяти. |
| Выделить память? | Память S-функции не освобождается. Всегда свободная память, которую распределяет ваша S-функция, используя malloc и free команды для выделения и освобождения памяти соответственно. |
| Есть ли прямой проход? | Неправильная установка флага прямого прохождения в S-функции. S-функция может получить доступ к своим входам в mdlOutputs метод только в том случае, если он указывает, что входные порты имеют прямой канал. Доступ к входным сигналам в mdlOutputs когда флаг прямого канала входного порта установлен в false приводит к неопределённому поведению. Чтобы проверить, неправильно ли установлен флаг прямого прохождения, можно включить свойство модели. TryForcingSFcnDF с помощью командыset_param(model_name,'TryForcingSFcnDF','on') model_name иметь флаг прямого прохождения true для всех входных портов. После включения этого свойства, если моделирование дает правильные ответы, не вызывая алгебраического цикла, одна из S-функций в модели потенциально устанавливает неверный флаг прямого прохождения. Проконсультируйтесь с on direct feedthrough в sfuntmpl_doc.c для получения дополнительной информации по диагностике ошибок прямого прохождения. |
| Правильно ли получить доступ к входным сигналам? | Экземпляры кода, в которых функция S использует неправильные макросы для доступа к входным сигналам, например, при доступе к несмежному сигналу. Несмежные сигналы возникают, когда входной порт S-функции подается блоком селектора, который выбирает каждый другой элемент векторного сигнала. Для несмежных входных сигналов используйте следующие команды:// In mdlInitializeSizes
ssSetInputPortRequiredContiguous(S, 0, 0);
// In mdlOutputs, access the inputs using
InputRealPtrsType uPtrs1 =
ssGetInputPortRealSignalPtrs(S,0); // In mdlInitializeSizes ssSetInputPortRequiredContiguous(S, 0, 1); // In mdlOutputs, access the inputs using const real_T *u0 = (const real_T*) ssGetInputPortSignal(S,0); /* If ssSetInputPortRequiredContiguous is 0, ssGetInputPortSignal returns an invalid pointer.*/ |
Для получения дополнительной помощи в отладке S-функции можно использовать следующие методы.
Скомпилировать S-функцию в режиме отладки с помощью -g для опции mex команда. Это позволяет использовать дополнительные функции диагностики, которые вызываются только при компиляции S-функции в режиме отладки.
Место в методах обратного вызова, чтобы убедиться, что они запущены и выполняются в ожидаемом порядке. Кроме того, используйте ssPrintfssPrintf инструкции для печати возвращают значения в командную строку MATLAB, чтобы проверить, дает ли код ожидаемые результаты.
Напечатать feature memstats в командной строке MATLAB для запроса использования памяти.
Используйте инструмент сравнения файлов и папок MATLAB или другое приложение разностного текста для поиска текстовых изменений в различных версиях S-функции. Это поможет найти изменения, которые отключили ранее скомпилированную и запущенную S-функцию. Инструкции по использованию инструмента «Сравнение файлов и папок» см. в разделе Сравнение файлов и папок и объединение файлов.
Используйте настройки в диалоговом окне Параметры конфигурации (Configuration Parameters), чтобы проверить наличие проблем с памятью.
Установите для диагностики несогласованности данных решателя значение warning.
Задайте для ограничений массива, превышающих диагностические значения warning или error(Дополнительные сведения об использовании этой диагностики см. в разделе Проверка границ массива).
Выключите оптимизацию повторного использования памяти сигналов (Simulink Coder).
Отделите алгоритм S-функции от интерфейса Simulink, затем используйте S-Function Builder для создания нового интерфейса Simulink для алгоритма. S-Function Builder обеспечивает реализацию интерфейса наиболее согласованным методом.
Отладку и профилирование части алгоритма S-функции можно выполнить с помощью стороннего программного обеспечения, если этот алгоритм отделен от интерфейса Simulink S-функции. Отладку и профилирование интерфейса S-функции с помощью модуля Simulink невозможно, поскольку код интерфейса Simulink не поставляется вместе с продуктом.
Кроме того, можно использовать стороннее программное обеспечение для отладки S-функции во время моделирования, как показано в следующих двух примерах. В этих примерах используется модель Simulink sfcndemo_timestwo и S-функция C MEX timestwo.c.
Перед началом примера сохраните файлы sfcndemo_timestwo и timestwo.c в рабочую папку.
Открытие модели Simulink sfcndemo_timestwo.
Создайте версию файла MEX, которую можно отладить, скомпилировав файл C с помощью mex с помощью команды -g вариант.
mex -g timestwo.c
-g параметр создает исполняемый файл timestwo.mexw64 с включенными символами отладки. На данном этапе может потребоваться смоделировать sfcndemo_timestwo для обеспечения правильной работы модели.
Не выходя из среды MATLAB, запустите среду разработки Майкрософт.
В строке меню среды разработки Microsoft выберите Сервис > Отладка процессов.
В открывшемся диалоговом окне Процессы (Processes) выберите MATLAB.exe в списке Доступные процессы (Available Processes) и щелкните Присоединить (Attach).
В открывшемся диалоговом окне Присоединить к процессу (Attach to Process) выберите Собственный (Native) в списке типов программ и нажмите кнопку OK. Теперь вы должны быть присоединены к процессу MATLAB.
Щелкните Закрыть (Close) в диалоговом окне Процессы (Processes).
Сбросьте функции MEX в MATLAB с помощью clear команда.
clear mex
В меню Файл среды разработки Microsoft выберите Открыть > Файл. Выберите timestwo.c исходные файлы из открывающегося браузера файлов.
Установите точку останова в нужной строке кода, щелкнув ее правой кнопкой мыши и выбрав в контекстном меню пункт «Вставить точку останова». Если модель не была запущена ранее, точка останова может отображаться с вопросительным знаком, указывающим, что исполняемый файл не загружен. При последующем запуске модели загружается .mexw32 и удаляет вопросительный знак из точки останова.
Запуск моделирования из sfcndemo_timestwo Модель Simulink. Необходимо запустить S-функцию в среде разработки Майкрософт и выполнить отладку файла в этой среде.
Перед началом примера сохраните файлы sfcndemo_timestwo и timestwo.c в рабочую папку.
Создайте версию файла MEX для отладки:
Открытие модели Simulink sfcndemo_timestwo.
Создайте версию файла MEX, которую можно отладить, скомпилировав файл C с помощью mex с помощью команды -g вариант:
mex -g timestwo.c
-g параметр создает исполняемый файл timestwo.mexa64 с включенными символами отладки.
Моделирование sfcndemo_timestwo для обеспечения правильной работы модели.
Выйдите из среды MATLAB.
Отладка файла MEX:
Запустите среду MATLAB в режиме отладки с помощью следующей команды:
matlab -D<nameOfDebugger> -D флаг запускает среду MATLAB в указанном отладчике. Например, для использования gdb отладочный инструмент на платформе Linux ®, введите эту команду.
matlab -DgdbПосле загрузки отладчика продолжите загрузку среды MATLAB путем ввода run в приглашении отладчика (gdb).
run -nodesktop
Starting program: matlab ...
Примечание
Отладчик может остановить ложные сигналы нарушения сегментации, возникающие в результате взаимодействия с базовой виртуальной машиной Java ® Virtual Machine (JVM™). Вы можете игнорировать эти сообщения и продолжить, используя cont команда. Если вы не отлаживаете сигналы нарушения сегментации и хотите подавить эти сообщения, введите команду handle SIGSEGV nostop noprint pass.
Откройте окно sfcndemo_timestwo Модель Simulink.
Нажмите Ctrl + C, чтобы открыть отладчик.
На (gdb) , установите точки останова в исходном коде, например:
break timestwo.c:37
Breakpoint 1 (timestwo.c:37) pending (gdb)
На (gdb) введите cont для продолжения.
cont
Используйте процедуры отладчика для отладки S-функции. Дополнительные сведения см. в разделе gdb документация, которая является частью документации операционной системы.
Level-2 S-функция MATLAB | Функция MATLAB | S-функция | Построитель S-функций