Указатели в S-функциях

Сведения об ошибках обработки

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

Если ваша функция C MEX S имеет параметры, содержимое которых необходимо проверить, используйте следующий метод, чтобы сообщить об ошибках.

ssSetErrorStatus(S,"Error encountered due to ...");
return;

В большинстве случаев Simulink® в программе Diagnostic Viewer отображаются ошибки. Если ошибка встречается в mdlCheckParameters когда параметры S-функции вводятся в диалоговое окно блока, механизм открывает диалоговое окно ошибки, показанное ниже. В любом случае механизм отображает сообщение об ошибке вместе с именем S-функции и связанного с ней блока s-function, который вызвал ошибку.

Второй аргумент в ssSetErrorStatus должна быть постоянной памятью. Это не может быть локальная переменная в вашей функции. Для примера следующее вызывает непредсказуемые ошибки.

mdlOutputs()
{
    char msg[256]; /* ILLEGAL: should be "static char */
							/*msg[256];"*/
    sprintf(msg,"Error due to %s", string);
    ssSetErrorStatus(S,msg);
    return;
}

Потому что ssSetErrorStatus не генерирует исключения, использование его для сообщения об ошибках в вашей S-функции предпочтительнее, чем использование mexErrMsgTxt. The mexErrMsgTxt функция использует обработку исключений, чтобы завершить выполнение S-функции. Чтобы поддержать обработку исключений в S-функциях, механизм Simulink должен настроить обработчики исключений до каждого вызова S-функции. Это вводит накладные расходы в симуляцию.

Исключение Бесплатный код

Можно избежать накладных расходов на симуляцию, гарантируя, что ваша функция C MEX S-function полностью содержит код, свободный от исключений. Бесплатный код исключения относится к коду, который никогда не скачет в длину. Ваша S-функция не является свободной от исключений, если она содержит любую стандартную программу, которая при вызове имеет потенциал прыжков в длину. Для примера, mexErrMsgTxt выдает исключение (т.е. длинные скачки) при вызове, таким образом завершая выполнение вашей S-функции. Использование mxCalloc может вызвать непредсказуемые результаты в случае ошибки выделения памяти, потому что mxCalloc длинные прыжки. Если необходимо выделение памяти, используйте stdlib.h calloc Выполните настройку непосредственно и выполните собственную обработку ошибок.

Если вы не звоните mexErrMsgTxt или другие стандартные программы API, которые вызывают исключения, используйте SS_OPTION_EXCEPTION_FREE_CODE Опция S-функции. Вы делаете это путем ввода следующей команды в mdlInitializeSizes функция.

ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);

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

Все mex* стандартные программы имеют потенциал длинных прыжков. Несколько mx* стандартные программы также имеют потенциал прыжков в длину. Чтобы избежать любых трудностей, используйте только стандартные программы API, которые извлекают указатель или определяют размер параметров. Например, следующие стандартные программы API никогда не выдают исключение: mxGetPr, mxGetData, mxGetNumberOfDimensions, mxGetM, mxGetN, и mxGetNumberOfElements.

Код в стандартных программах выполнения также может выдавать исключения. Стандартные программы выполнения ссылаются на определенные стандартные программы S-функций, которые инициатор вызывает во время цикла симуляции (см. «Взаимодействие Simulink Engine с C S-Functions»). Во время выполнения стандартных программ включать

  • mdlGetTimeOfNextVarHit

  • mdlOutputs

  • mdlUpdate

  • mdlDerivatives

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

ssSetOptions(S, SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE);

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

Критерии завершения ssSetErrorStatus

Если один из методов коллбэка C MEX S-функции вызывает ssSetErrorStatus во время симуляции механизм Simulink помещает ошибку и завершает симуляцию, как только метод коллбэка возвращается. Если ваша S-функция SS_OPTION_CALL_TERMINATE_ON_EXIT опция включена (см. ssSetOptions), двигатель вызывает вашу S-функцию mdlTerminate способ как часть процесса завершения. В противном случае двигатель вызывает вашу S-функцию mdlTerminate метод только, если хотя бы один блок mdlStart метод выполнен без ошибок во время симуляции.

Проверка границ массива

Если ваша функция C MEX S вызывает в противном случае необъяснимые ошибки, причиной может быть то, что S-функция записывается за пределы назначенных ей областей в памяти. Можно проверить эту возможность, включив функцию проверки границ массива. Эта функция обнаруживает любую попытку блока S-Function записать за пределы областей, назначенных ему для следующих типов блочных данных:

  • Рабочие векторы (R, I, P, D и режим)

  • Состояния (непрерывные и дискретные)

  • Выходы

Чтобы включить проверку границ массива, выберите warning или error из списка опций Array bounds exceeded в диалоговом окне Configuration Parameters. Также введите следующую команду в MATLAB® командная строка.

set_param(modelName, 'ArrayBoundsChecking', ValueStr)

где modelName - имя модели Simulink и ValueStr является либо 'none', 'warning', или 'error'.

См. также

|

Похожие темы