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

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

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

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

  • В первом примере используется Microsoft® Визуальный C++® Окружение .NET (версия 7.0).

  • Второй пример отлаживает S-функцию в The 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 заголовочные файлы. Эти файлы заголовка 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')
Эта команда задает, что все S-функции в модели 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-функцию, которая ранее скомпилировалась и выполнялась. Инструкции по использованию инструмента «Сравнение файлов и папок» см. в разделе Сравнение файлов и папок и слияние файлов.

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

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

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

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

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

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

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

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

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

    mex -g timestwo.c

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

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

  4. В панели меню среды разработки Майкрософт выберите 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. В меню File среды разработки Майкрософт выберите Open > File. Выберите timestwo.c исходные файлы из открывшегося браузера файлов.

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

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

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

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

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

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

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

    mex -g timestwo.c

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

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

  4. Выход из окружения MATLAB.

Отлаживайте файл MEX:

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

    matlab -D<nameOfDebugger>

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

    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 документация, являющаяся частью документации операционной системы.

См. также

| | |

Похожие темы