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

Об отладке C S-функции MEX

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

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

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

  • Второй пример отлаживает S-функцию на платформе Open Group UNIX®.

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

Отладьте в окружении Simulink

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

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

  • Смотрите модели S-функции в качестве примера, доступные в sfundemos. Папка matlabroot/simulink/src (открытый) содержит исходные файлы 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-функцию...Lookfor...
Используйте for циклы, чтобы присвоить память?Экземпляры, где ваша S-функция может непреднамеренно присвоить значения за пределами границ массивов.
Использовать глобальные переменные?Местоположения в коде, где глобальные переменные могут быть повреждены. Если у вас есть несколько экземпляров вашей S-функции в модели, они могут переписать ту же ячейку памяти.
Выделить память?Память ваша S-функция не освобождает. Всегда освобождайте память ту свою S-функцию, выделяет, с помощью malloc и free команды, чтобы выделить и освободить память, соответственно.
Имеет прямое сквозное соединение?Неправильная прямая проходная установка флага в вашей S-функции. S-функция может получить доступ к своим входным параметрам в mdlOutputs метод, только если это указывает, что входные порты имеют прямое сквозное соединение. Доступ к входным сигналам в mdlOutputs когда входной порт прямой проходной флаг установлен в false приводит к неопределенному поведению. Чтобы проверять, есть ли у вас прямой проходной флаг неправильно набор, можно включить свойство TryForcingSFcnDF модели использование команды
set_param(model_name,'TryForcingSFcnDF','on')
Эта команда указывает что все S-функции в модели 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-функцию, которая ранее скомпилировала и запустила. Смотрите Сравнивают Файлы и Папки и Файлы Слияния (MATLAB) для получения инструкций относительно того, как использовать инструмент Comparisons папки File &.

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

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

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

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

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

Отладка C S-функции MEX Используя среду.NET Microsoft Visual C++

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

  1. Откройте модель Simulink sfcndemo_timestwo.

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

    mex -g timestwo.c

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

  3. Не выходя из среды MATLAB, запустите Microsoft Development Environment.

  4. Из панели меню Microsoft Development Environment выберите Tools > Debug Processes.

  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 Development Environment File выберите Open > File. Выберите timestwo.c исходные файлы от файлового браузера, который открывается.

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

  11. Запустите симуляцию с sfcndemo_timestwo Модель Simulink. Вы должны запускать S-функцию в Microsoft Development Environment и можете отладить файл в той среде.

Отладка C S-функции 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® (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 документация, которая является частью вашей документации по операционной системе.

Смотрите также

| | |

Похожие темы