Этот раздел обеспечивает высокоуровневые советы о том, как отладить 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-функция не включает заголовочные файлы rtwtypes.h
или simstruc_types.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 & или другой текст differencing приложение, чтобы искать текстовые изменения в различных версиях вашей S-функции. Это может помочь вам определить местоположение изменений, которые отключили S-функцию, которая ранее скомпилировала и запустила. Смотрите Сравнивают Файлы и Папки и Файлы Слияния (MATLAB) для получения инструкций относительно того, как использовать инструмент Comparisons папки File &.
Используйте настройки на диалоговом окне Configuration Parameters, чтобы проверить на проблемы памяти.
Установите диагностику противоречивости данных Решателя на warning
.
Установите превышенную диагностику границ Массива на warning
или error
(См. Границы Проверки Массивов для получения дополнительной информации о том, как использовать эту диагностику).
Выключите оптимизацию Повторного использования памяти.
Отделитесь алгоритм S-функции от его интерфейса Simulink затем используют Разработчика S-функции, чтобы сгенерировать новый интерфейс Simulink для алгоритма. Разработчик S-функции гарантирует, что интерфейс реализован в самом сопоставимом методе.
Можно отладить и профилировать фрагмент алгоритма S-функции с помощью стороннего программного обеспечения, если вы разделяете алгоритм от интерфейса Simulink S-функции. Вы не можете отладить и профилировать интерфейс S-функции с механизмом Simulink, потому что код интерфейса Simulink не поставляется с продуктом.
Можно дополнительно использовать стороннее программное обеспечение, чтобы отладить S-функцию во время моделирования, как показано в следующем двум примерам. Эти примеры используют модель Simulink sfcndemo_timestwo
и S-функция MEX C timestwo.c
c.
Прежде, чем начать пример, сохраните файлы sfcndemo_timestwo
и timestwo.c
в вашу рабочую папку.
Откройте модель Simulink sfcndemo_timestwo
.
Создайте версию файла MEX, который можно отладить путем компиляции файла C с помощью команды mex
с опцией -g
.
mex -g timestwo.c
Опция -g
создает исполняемый timestwo.mexw32
с включенной отладочной информацией. На данном этапе можно хотеть моделировать модель sfcndemo_timestwo
, чтобы гарантировать, что она запускается правильно.
Не выходя из среды MATLAB, запустите Microsoft Development Environment.
Из панели меню Microsoft Development Environment выберите Tools> Debug Processes.
В диалоговом окне Processes, которое открывается, выберите процесс MATLAB.exe
в Доступных Процессах, перечисляют и нажимают Attach.
В диалоговом окне Attach to Process, которое открывается, выберите Native в списке типов программы и нажмите ОК. Необходимо теперь быть привязаны к процессу MATLAB.
Нажмите Close на диалоговом окне Processes.
Очистите MEX-функции в MATLAB с помощью команды clear
.
clear mex
Из меню Microsoft Development Environment File выберите Open> File. Выберите исходные файлы timestwo.c
из файлового браузера, который открывается.
Установите точку останова на желаемой строке кода путем щелчка правой кнопкой по строке и выбора Insert Breakpoint из контекстного меню. Если вы ранее не запустили модель, точка останова может обнаружиться с вопросительным знаком, указав, что исполняемый файл не загружается. Впоследствии выполнение модели загружает файл .mexw32
и удаляет вопросительный знак из точки останова.
Запустите моделирование с модели Simulink sfcndemo_timestwo
. Вы должны запускать 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
.
Откройте модель Simulink sfcndemo_timestwo
.
Нажмите Ctrl+C, чтобы открыть отладчик.
В подсказке (gdb)
набор устанавливает точки останова в исходном коде, например:
break timestwo.c:37
Breakpoint 1 (timestwo.c:37) pending (gdb)
В подсказке (gdb)
введите команду cont
, чтобы продолжиться.
cont
Используйте свои стандартные программы отладчика, чтобы отладить S-функцию. Для получения дополнительной информации см. документацию gdb
, которая является частью вашей документации по операционной системе.
Уровень 2 S-функция MATLAB | Функция MATLAB | S-функция | Разработчик S-функции