Отладьте 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-функция не включает заголовочные файлы 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')
Эта команда указывает, что все 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.mexw32 с включенной отладочной информацией. На данном этапе можно хотеть моделировать модель 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, которая является частью вашей документации по операционной системе.

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

| | |

Похожие темы