Этот раздел обеспечивает высокоуровневые советы о том, как отладить S-функции MEX C в среде Simulink® и использовании стороннего программного обеспечения. Следующие списки подсвечивают некоторые более распространенные ошибки, сделанные при записи S-функции. Для более детального анализа используйте отладчик, которому предоставляют ваш компилятор C.
Примеры в конце этого раздела show, как отладить S-функцию MEX C в процессе моделирования, с помощью стороннего программного обеспечения.
Первый пример использует Microsoft® Visual C ++®.NET (версия 7.0) среда.
Второй пример отлаживает S-функцию на платформе Open Group UNIX®.
Обратитесь к своей документации компилятора для получения дополнительной информации об отладке файлов.
Прежде чем вы начнете, убедитесь, что у вас есть хорошее понимание того, как записать S-функции C и необходимые методы коллбэка. Для помощи:
Считайте раздел Available S-Function Implementations, чтобы определить, реализовали ли вы свою S-функцию с помощью самого соответствующего метода.
Используйте блок S-Function Builder, чтобы сгенерировать простые S-функции и изучить содержимое исходных файлов.
Смотрите модели S-функции в качестве примера, доступные в sfundemos
. Папка
(открытый) содержит исходные файлы S-функции для этих моделей.matlabroot
/simulink/src
Если ваша 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-функцию... | Lookfor... |
---|---|
Используйте for циклы, чтобы присвоить память? | Экземпляры, где ваша S-функция может непреднамеренно присвоить значения за пределами границ массивов. |
Использовать глобальные переменные? | Местоположения в коде, где глобальные переменные могут быть повреждены. Если у вас есть несколько экземпляров вашей S-функции в модели, они могут переписать ту же ячейку памяти. |
Выделить память? | Память ваша S-функция не освобождает. Всегда освобождайте память ту свою S-функцию, выделяет, с помощью malloc и free команды, чтобы выделить и освободить память, соответственно. |
Имеет прямое сквозное соединение? | Неправильная прямая проходная установка флага в вашей S-функции. S-функция может получить доступ к своим входным параметрам в mdlOutputs метод, только если это указывает, что входные порты имеют прямое сквозное соединение. Доступ к входным сигналам в mdlOutputs когда входной порт прямой проходной флаг установлен в false приводит к неопределенному поведению. Чтобы проверять, есть ли у вас прямой проходной флаг неправильно набор, можно включить свойство TryForcingSFcnDF модели использование командыset_param(model_name,'TryForcingSFcnDF','on') model_name имейте прямой проходной флаг true для всех их входных портов. После того, как вы включаете это свойство, если ваша симуляция производит правильные ответы, не вызывая алгебраический цикл, одна из ваших S-функций в модели потенциально установила неправильный прямой проходной флаг. Консультируйтесь относительно прямого сквозного соединения в 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-функцию в режиме отладки.
Место
операторы в ваших методах коллбэка, чтобы гарантировать, что они запускаются и что они выполняются в порядке, который вы ожидаете. Кроме того, используйте ssPrintf
ssPrintf
операторы, чтобы распечатать возвращаемые значения к командной строке MATLAB, чтобы проверять, производит ли ваш код ожидаемые результаты.
Введите feature memstats
в командной строке MATLAB, чтобы запросить использование памяти.
Используйте инструмент Comparisons папки MATLAB File & или другое текстовое приложение дифференцирования, чтобы искать текстовые изменения в различных версиях вашей S-функции. Это может помочь вам определить местоположение изменений, которые отключили S-функцию, которая ранее скомпилировала и запустила. Смотрите Сравнивают Файлы и Папки и Файлы Слияния для получения инструкций относительно того, как использовать инструмент Comparisons папки File &.
Используйте настройки на диалоговом окне Configuration Parameters, чтобы проверять на проблемы памяти.
Установите диагностику Solver data inconsistency на warning
.
Установите диагностику Array bounds exceeded на warning
или error
(См. Границы Проверки Массивов для получения дополнительной информации о том, как использовать эту диагностику).
Поверните Повторное использование памяти (Simulink Coder) оптимизация прочь.
Отделитесь алгоритм S-функции от его интерфейса Simulink затем используют Разработчика S-функции, чтобы сгенерировать новый интерфейс Simulink для алгоритма. Разработчик S-функции гарантирует, что интерфейс реализован в самом сопоставимом методе.
Можно отладить и профилировать фрагмент алгоритма S-функции с помощью стороннего программного обеспечения, если вы разделяете алгоритм от интерфейса Simulink S-функции. Вы не можете отладить и профилировать интерфейс S-функции с механизмом Simulink, потому что код интерфейса Simulink не поставляется с продуктом.
Можно дополнительно использовать стороннее программное обеспечение, чтобы отладить S-функцию в процессе моделирования, как показано в следующем двум примерам. Эти примеры используют модель Simulink sfcndemo_timestwo
и S-функция MEX C timestwo.c
.
Прежде, чем начать пример, сохраните файлы sfcndemo_timestwo
и timestwo.c
в вашу рабочую папку.
Откройте модель Simulink sfcndemo_timestwo
.
Создайте версию файла MEX, который можно отладить путем компиляции файла C с помощью mex
команда с -g
опция.
mex -g timestwo.c
-g
опция создает исполняемый timestwo.mexw64
с включенной отладочной информацией. На данном этапе можно хотеть симулировать sfcndemo_timestwo
модель, чтобы гарантировать его запускается правильно.
Не выходя из среды MATLAB, запустите Microsoft Development Environment.
Из панели меню Microsoft Development Environment выберите Tools > Debug Processes.
В диалоговом окне Processes, которое открывается, выберите MATLAB.exe
процесс в Available Processes перечисляет и нажимает Attach.
В диалоговом окне Attach to Process, которое открывается, выберите Native в списке типов программы и нажмите OK. Необходимо теперь быть привязаны к процессу MATLAB.
Нажмите Close на диалоговом окне Processes.
Очистите MEX-функции в MATLAB с помощью clear
команда.
clear mex
В меню Microsoft Development Environment File выберите Open > File. Выберите timestwo.c
исходные файлы от файлового браузера, который открывается.
Установите точку останова на желаемой строке кода путем щелчка правой кнопкой по линии и выбора Insert Breakpoint из контекстного меню. Если вы ранее не запустили модель, точка останова может обнаружиться с вопросительным знаком, указав, что исполняемый файл не загружается. Впоследствии выполнение модели загружает .mexw32
файл и удаляет вопросительный знак из точки останова.
Запустите симуляцию с sfcndemo_timestwo
Модель Simulink. Вы должны запускать S-функцию в Microsoft Development Environment и можете отладить файл в той среде.
Прежде, чем начать пример, сохраните файлы 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® (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 MATLAB S-Function | MATLAB Function | S-Function | S-Function Builder