В этом разделе приведены советы высокого уровня по отладке S-функций C MEX в Simulink® окружение и использование стороннего программного обеспечения. В следующих списках перечислены некоторые из наиболее распространенных ошибок, допущенных при написании S-функции. Для более подробного анализа используйте отладчик, предоставленный с вашими Компиляторами C.
Примеры в конце этого раздела показывают, как отлаживать S-функцию C MEX во время симуляции, используя стороннее программное обеспечение.
В первом примере используется Microsoft® Визуальный C++® Окружение .NET (версия 7.0).
Второй пример отлаживает S-функцию в The 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
заголовочные файлы. Эти файлы заголовка Coder™ Simulink и Simulink автоматически включаются для вас. Если вы компилируете свою 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-функций в модели потенциально устанавливает неправильный прямой обратный флаг. Проконсультируйтесь по прямому сквозному соединению в sfuntmpl_doc.c для получения дополнительной информации о диагностике ошибок прямой передачи. |
Получить правильный доступ к входным сигналам? | Образцы в коде, где ваша S-функция использует неправильные макросы для доступа к входным сигналам, например, при доступе к несмежному сигналу. Несмежные сигналы результата, когда входной порт S-функции подается блоком Selector, который выбирает каждый другой элемент массива вектора сигнал. Для разъединенных входных сигналов используйте следующие команды:// 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 запросить использование памяти.
Используйте инструмент ФАЙЛ MATLAB & folder Comparisons или другое приложение для дифференцирования текста, чтобы искать текстовые изменения в различных версиях вашей S-функции. Это может помочь вам найти изменения, которые отключили S-функцию, которая ранее скомпилировалась и выполнялась. Инструкции по использованию инструмента «Сравнение файлов и папок» см. в разделе Сравнение файлов и папок и слияние файлов.
Используйте настройки в диалоговом окне Параметров конфигурации, чтобы проверить на проблемы с памятью.
Установите диагностику Solver data inconsistency равной warning
.
Установите диагностику Array bounds exceeded равной warning
или error
(Дополнительные сведения о том, как использовать эту диагностику, см. в разделе Проверка границ массивов).
Отключите оптимизацию Повторного использования памяти (Simulink Coder).
Отделите алгоритм S-функции от интерфейса Simulink, затем используйте S-Function Builder, чтобы сгенерировать новый интерфейс Simulink для алгоритма. S-Function Builder гарантирует, что интерфейс реализован наиболее последовательным методом.
Вы можете отлаживать и профилировать фрагмент алгоритма вашей 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
The -g
опция создает исполняемый файл timestwo.mexw64
с включенными символами отладки. На данной точке можно захотеть симулировать sfcndemo_timestwo
модель, чтобы убедиться, что он работает правильно.
Не выходя из окружения MATLAB, запустите среду разработки Майкрософт.
В панели меню среды разработки Майкрософт выберите Tools > Debug Processes.
В открывшемся Processes окне выберите MATLAB.exe
обработайте в списке Available Processes и нажмите Attach.
В открывшемся Attach to Process окне выберите Native в списке типов программ и нажмите OK. Теперь вы должны быть присоединены к процессу MATLAB.
Нажмите Close в диалоговом окне Processes.
Очистить MEX-функции в MATLAB можно используя clear
команда.
clear mex
В меню File среды разработки Майкрософт выберите Open > File. Выберите timestwo.c
исходные файлы из открывшегося браузера файлов.
Установите точку останова на нужной строке кода, щелкнув правой кнопкой мыши по линии и выбрав Insert Breakpoint из контекстного меню. Если вы ранее не запускали модель, точка останова может появиться с вопросительным знаком, указывающим, что исполняемый файл не загружен. Впоследствии выполнение модели загружает .mexw32
Файл и удаляет вопросительный знак из точки останова.
Запустите симуляцию из sfcndemo_timestwo
Модель Simulink. Вы должны запустить S-функцию в среде разработки Майкрософт и можете отлаживать файл в этом окружении.
Прежде чем начинать пример, сохраните файлы sfcndemo_timestwo
и timestwo.c
в рабочую папку.
Создайте версию файла MEX для отладки:
Откройте модель Simulink sfcndemo_timestwo
.
Создайте версию файла MEX, которую можно отлаживать, скомпилировав файл C с помощью mex
команда со -g
опция:
mex -g timestwo.c
The -g
опция создает исполняемый файл timestwo.mexa64
с включенными символами отладки.
Симулируйте sfcndemo_timestwo
модель, чтобы убедиться, что он работает правильно.
Выход из окружения MATLAB.
Отлаживайте файл MEX:
Запустите окружение MATLAB в режиме отладки с помощью этой команды:
matlab -D<nameOfDebugger>
The -D
флаг запускает окружение MATLAB в указанном отладчике. Для примера использовать gdb
инструмент отладки в Linux® platform, введите эту команду.
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