主要内容

处理S函数中的错误

关于处理错误

使用S函数时,正确处理无效参数值等意外事件非常重要。

如果您的C MEX S函数具有需要验证其内容的参数,请使用以下技术报告错误。

ssSetErrorStatus(S,“由于……而遇到的错误”);返回;

在大多数情况下,Simulink金宝app®引擎在诊断查看器中显示错误。如果在mdlCheckParameters在将S功能参数输入“块”对话框时,引擎会打开如下所示的错误对话框。在任何一种情况下,引擎都会显示错误消息以及调用错误的S函数和关联S函数块的名称。

第二个论点是ssSetErrorStatus必须是持久内存。它不能是函数中的局部变量。例如,以下情况会导致不可预测的错误。

mdlOutputs(){char msg[256];/*非法:应为“static char*/*msg[256];”*/sprintf(msg,“由于%s引起的错误”,字符串);ssSetErrorStatus(s,msg);return;}

因为ssSetErrorStatus不会生成异常,使用它来报告S函数中的错误比使用MEXERMSGSTXT这个MEXERMSGSTXT函数使用异常处理来终止S函数的执行。为了支持S函数中的异常处理,Simulink引擎必须在每次S函数调用之前设置异常处理程序。这会在模拟中引入金宝app开销。金宝app

无异常代码

通过确保cmex S函数完全包含无异常代码。无异常代码指的是从不跳远的代码。如果S函数包含任何在调用时具有跳远潜力的例程,则它就不是无异常的。例如,MEXERMSGSTXT调用时引发异常(即长跳转),从而结束S函数的执行mxCalloc在内存分配错误的情况下可能会导致不可预测的结果,因为mxCalloc跳远。如果需要内存分配,请使用stdlib.h分配直接执行例程并执行自己的错误处理。

如果你不打电话MEXERMSGSTXT或其他导致异常的API例程,请使用SS\U选项\U例外\U自由\U代码S函数选项。您可以通过在中密度作用

ssSetOptions(S、SS\U选项\U例外\U自由\U代码);

设置此选项可允许Simulink引擎绕过通常在每次调用S函数之前执行的异常处理设置,从而提高S函数的性能。在使用时,必须非常小心地验证代码是否无异常金宝appSS\U选项\U例外\U自由\U代码。如果设置此选项时S函数生成异常,则会出现不可预测的结果。

全部的墨西哥*常规动作具有跳远的潜力。几个mx*套路也有跳远的潜力。为了避免任何困难,只使用检索指针或确定参数大小的API例程。例如,以下API例程从不引发异常:mxGetPr,mxGetData,mxGetNumberOfDimensions,mxGetM,mxGetNmxGetNumberOfElements.

编码运行时例程也可以抛出异常。运行时例程是指发动机在模拟循环期间调用的某些S函数例程(请参阅金宝appSimulink引擎与C S函数的交互)。运行时例程包括

  • mdlGetTimeOfNextVarHit

  • 计算输出

  • mdlUpdate

  • MDL激励

如果S函数中的所有运行时例程都没有异常,则可以使用此选项:

ssSetOptions(S、SS\U选项\U运行时\U异常\U自由\U代码);

S函数中的其他例程不必是无异常的。

ssSetErrorStatus终止条件

如果您的一个cmex S函数回调方法调用ssSetErrorStatus在模拟过程中,Simulink引擎会发布错误,并在金宝app回调方法返回时立即终止模拟。如果你的S函数选择呼叫退出时终止选项已启用(请参见ssSetOptions),引擎将调用您的S函数亚硝胺方法作为终止过程的一部分。否则,引擎将调用S函数亚硝胺方法,仅当至少有一个块mdlStart方法在模拟过程中无错误地执行。

检查数组边界

如果您的C MEX S函数导致其他无法解释的错误,原因可能是S函数正在写入内存中超出其指定区域的内容。您可以通过启用数组边界检查功能来验证这种可能性。该功能检测S函数块在以下类型的情况下试图写入超出其指定区域的内容块数据的数量:

  • 工作向量(R、I、P、D和模式)

  • 状态(连续和离散)

  • 输出

要启用数组边界检查,请选择警告错误超出了数组边界上的选项列表配置参数对话框。或者,在MATLAB中输入以下命令:®命令提示符。

设置参数(型号名称,“ArrayBoundsChecking”,价值)

哪里型号名称是Simulink模型的名称,并且金宝app价值要么“没有”,“警告”“错误”.

另见

|

相关话题