exponenta event banner

Отладка S-функций C MEX

Сведения об отладке S-функций C MEX

В этом разделе приведены общие советы по отладке S-функций C MEX в среде Simulink ® и использованию программного обеспечения сторонних производителей. В следующих списках перечислены некоторые из наиболее распространенных ошибок, допущенных при записи S-функции. Для более подробного анализа используйте отладчик, поставляемый с компилятором Си.

Примеры в конце этого раздела показывают, как отладить S-функцию C MEX во время моделирования с использованием стороннего программного обеспечения.

  • В первом примере используется среда Microsoft ® Visual C++ ® .NET (версия 7.0).

  • Во втором примере выполняется отладка S-функции на платформе Open Group UNIX ®.

Дополнительные сведения об отладке файлов см. в документации компилятора.

Отладка в среде Simulink

Прежде чем начать, убедитесь, что вы хорошо понимаете, как писать C S-функции и требуемые методы обратного вызова. За помощью:

  • Используйте блок S-Function Builder для создания простых S-функций и изучения содержимого исходных файлов.

  • Проверьте примеры моделей S-функций, доступные в sfundemos. Папка matlabroot/simulink/src (open) содержит исходные файлы 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')
Эта команда указывает, что все S-функции в модели 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-функции в режиме отладки.

  • Место ssPrintf в методах обратного вызова, чтобы убедиться, что они запущены и выполняются в ожидаемом порядке. Кроме того, используйте ssPrintf инструкции для печати возвращают значения в командную строку MATLAB, чтобы проверить, дает ли код ожидаемые результаты.

  • Напечатать feature memstats в командной строке MATLAB для запроса использования памяти.

  • Используйте инструмент сравнения файлов и папок MATLAB или другое приложение разностного текста для поиска текстовых изменений в различных версиях S-функции. Это поможет найти изменения, которые отключили ранее скомпилированную и запущенную S-функцию. Инструкции по использованию инструмента «Сравнение файлов и папок» см. в разделе Сравнение файлов и папок и объединение файлов.

  • Используйте настройки в диалоговом окне Параметры конфигурации (Configuration Parameters), чтобы проверить наличие проблем с памятью.

  • Отделите алгоритм S-функции от интерфейса Simulink, затем используйте S-Function Builder для создания нового интерфейса Simulink для алгоритма. S-Function Builder обеспечивает реализацию интерфейса наиболее согласованным методом.

Отладка с использованием стороннего программного обеспечения

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

Кроме того, можно использовать стороннее программное обеспечение для отладки S-функции во время моделирования, как показано в следующих двух примерах. В этих примерах используется модель Simulink sfcndemo_timestwo и S-функция C MEX timestwo.c.

Отладка S-функций C MEX с помощью среды Microsoft Visual C++ .NET

Перед началом примера сохраните файлы sfcndemo_timestwo и timestwo.c в рабочую папку.

  1. Открытие модели Simulink sfcndemo_timestwo.

  2. Создайте версию файла MEX, которую можно отладить, скомпилировав файл C с помощью mex с помощью команды -g вариант.

    mex -g timestwo.c

    -g параметр создает исполняемый файл timestwo.mexw64 с включенными символами отладки. На данном этапе может потребоваться смоделировать sfcndemo_timestwo для обеспечения правильной работы модели.

  3. Не выходя из среды MATLAB, запустите среду разработки Майкрософт.

  4. В строке меню среды разработки Microsoft выберите Сервис > Отладка процессов.

  5. В открывшемся диалоговом окне Процессы (Processes) выберите MATLAB.exe в списке Доступные процессы (Available Processes) и щелкните Присоединить (Attach).

  6. В открывшемся диалоговом окне Присоединить к процессу (Attach to Process) выберите Собственный (Native) в списке типов программ и нажмите кнопку OK. Теперь вы должны быть присоединены к процессу MATLAB.

  7. Щелкните Закрыть (Close) в диалоговом окне Процессы (Processes).

  8. Сбросьте функции MEX в MATLAB с помощью clear команда.

    clear mex
  9. В меню Файл среды разработки Microsoft выберите Открыть > Файл. Выберите timestwo.c исходные файлы из открывающегося браузера файлов.

  10. Установите точку останова в нужной строке кода, щелкнув ее правой кнопкой мыши и выбрав в контекстном меню пункт «Вставить точку останова». Если модель не была запущена ранее, точка останова может отображаться с вопросительным знаком, указывающим, что исполняемый файл не загружен. При последующем запуске модели загружается .mexw32 и удаляет вопросительный знак из точки останова.

  11. Запуск моделирования из sfcndemo_timestwo Модель Simulink. Необходимо запустить S-функцию в среде разработки Майкрософт и выполнить отладку файла в этой среде.

Отладка S-функций C MEX на платформах UNIX для открытых групп

Перед началом примера сохраните файлы sfcndemo_timestwo и timestwo.c в рабочую папку.

Создайте версию файла MEX для отладки:

  1. Открытие модели Simulink sfcndemo_timestwo.

  2. Создайте версию файла MEX, которую можно отладить, скомпилировав файл C с помощью mex с помощью команды -g вариант:

    mex -g timestwo.c

    -g параметр создает исполняемый файл timestwo.mexa64 с включенными символами отладки.

  3. Моделирование sfcndemo_timestwo для обеспечения правильной работы модели.

  4. Выйдите из среды MATLAB.

Отладка файла MEX:

  1. Запустите среду MATLAB в режиме отладки с помощью следующей команды:

    matlab -D<nameOfDebugger>

    -D флаг запускает среду MATLAB в указанном отладчике. Например, для использования gdb отладочный инструмент на платформе Linux ®, введите эту команду.

    matlab -Dgdb
  2. После загрузки отладчика продолжите загрузку среды MATLAB путем ввода run в приглашении отладчика (gdb).

    run -nodesktop
    
    Starting program: matlab
    ...

    Примечание

    Отладчик может остановить ложные сигналы нарушения сегментации, возникающие в результате взаимодействия с базовой виртуальной машиной Java ® Virtual Machine (JVM™). Вы можете игнорировать эти сообщения и продолжить, используя cont команда. Если вы не отлаживаете сигналы нарушения сегментации и хотите подавить эти сообщения, введите команду handle SIGSEGV nostop noprint pass.

  3. Откройте окно sfcndemo_timestwo Модель Simulink.

  4. Нажмите Ctrl + C, чтобы открыть отладчик.

  5. На (gdb) , установите точки останова в исходном коде, например:

    break timestwo.c:37
    
    Breakpoint 1 (timestwo.c:37) pending
    (gdb)
  6. На (gdb) введите cont для продолжения.

    cont
  7. Используйте процедуры отладчика для отладки S-функции. Дополнительные сведения см. в разделе gdb документация, которая является частью документации операционной системы.

См. также

| | |

Связанные темы