在 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 使用持久变量 n。n 的初始值取决于输入 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再次对模型进行仿真。

另请参阅
模块
- MATLAB Function | State Control (HDL Coder) | Chart (Stateflow)