主要内容

MATLAB 函数中初始化持久变量

持久变量是 MATLAB® 函数中的局部变量,用于在函数调用之间在内存中保留其值。请参阅 persistent。您可以在 MATLAB Function 模块和 Stateflow® 图中的 MATLAB 函数中初始化持久变量。但是,当您使用持久变量时,某些编码做法可能会生成错误。

避免将 coder.opaque 与持久变量结合使用

如果您将由 coder.opaque (MATLAB Coder) 函数声明的变量用作持久变量,则对模型进行仿真会生成错误。例如,此函数使用持久变量 pp,该变量首先通过使用 coder.opaque 来声明。当您在模型中对该函数进行仿真时,以下代码会生成错误。

function y = fcn(u)
%#codegen
persistent pp;
if isempty(pp)
    pp = eml.opaque("int","0");
end
q = 0;
q = eml.ceval("(int)",pp);
q = q + 1;

pp = eml.ceval("(int)",q);
y = 0;
y = eml.ceval("(int)",pp);

使用最佳做法避免错误

要避免由持久变量引起的初始化错误,请遵循以下最佳做法:

  • 仅通过访问常量在函数中初始化持久变量。

  • 确保函数的控制流不依赖初始化是否发生。

如果您不遵循这些规范,在下列情况下会产生初始化错误:

  • 具有持久变量的 MATLAB Function 模块,其中允许直接馈通属性被清除

  • 包含 State Control 模块(其中状态控制设置为同步)的模型中具有持久变量的 MATLAB Function 模块

  • 实现摩尔状态机语义并使用具有持久变量的 MATLAB 函数的 Stateflow 图

例如,此版本的 fcn 使用持久变量 nn 的初始值取决于输入 u,并且 return 语句会中断函数的正常控制流。当在具有上述条件之一的模型中使用时,以下代码会生成错误。

function y = fcn(u)
    persistent n
        
    if isempty(n)
        n = u;
        y = 1;
        return
    end
    
    y = n;
    n = n + u; 
end

无直接馈通的 MATLAB Function 模块

此示例模型包含一个 MATLAB Function 模块,该模块未遵循在 MATLAB 函数中使用持久变量的最佳做法。MATLAB Function 模块输入是方波,由一个 Sign 模块和一个 Sine Wave 模块提供。MATLAB Function 模块在每个时间步将 u 的值添加到持久变量 n

对模型进行仿真。仿真返回错误,因为:

  • 持久变量 n 的初始值取决于输入 u

  • return 语句会中断函数的正常控制流。

  • MATLAB Function 模块的允许直接馈通属性被清除。

在 MATLAB Function 模块中,通过将持久变量设置为常量值并删除 return 语句来初始化该持久变量。使用以下代码重定义函数。

function y = fcn(u)
    persistent n
     if isempty(n)
         n = 1;
     end
     y = n;
     n = n + u;
 end

再次对模型进行仿真。

同步模式下的 State Control 模块

此示例模型包含一个 MATLAB Function 模块,该模块未遵循在 MATLAB 函数中使用持久变量的最佳做法。MATLAB Function 模块输入是方波,由一个 Sign 模块和一个 Sine Wave 模块提供。MATLAB Function 模块在每个时间步将 u 的值添加到持久变量 n。模型包含 State Control 模块,其中状态控制设置为 Synchronous

对模型进行仿真。仿真返回错误,因为:

  • 持久变量 n 的初始值取决于输入 u

  • return 语句会中断函数的正常控制流。

  • 模型包含 State Control 模块,其中状态控制设置为 Synchronous

在 MATLAB Function 模块中,通过将持久变量设置为常量值并删除 return 语句来初始化该持久变量。使用以下代码重定义函数。

function y = fcn(u)
    persistent n
     if isempty(n)
         n = 1;
     end
     y = n;
     n = n + u;
 end

再次对模型进行仿真。

实现摩尔语义的 Stateflow 图

此示例模型包含具有一个 MATLAB 函数的 Stateflow 图,该函数未遵循使用持久变量的最佳做法。

该 MATLAB 函数根据活动状态将 1-1 加到持久变量 n

对模型进行仿真。仿真返回错误,因为:

  • 持久变量 n 的初始值取决于输入 u

  • return 语句会中断函数的正常控制流。

  • 图实现摩尔语义。

在该 MATLAB 函数中,通过将持久变量设置为常量值并删除 return 语句来初始化该持久变量。使用以下代码重定义函数。

function y = fcn(u)
    persistent n
     if isempty(n)
         n = 1;
     end
     y = n;
     n = n + u;
 end

再次对模型进行仿真。

另请参阅

模块

函数

主题