Sysblock复用多个Caller使用注意事项(文件包含,静态变量)
技术分享
发布于 2025-08-06 16:58:38
查看 8过去300天
静态变量
模型在使用多个Ccaller模块中从同一c文件下引用同一函数时,假如这个函数中存在静态变量,那么会存在静态变量被数个模块重复引用,导致数值与函数仅被一个模块时不符合的现象:
示例情况
举例而言,这是我们所使用函数的代码:
int arrproduct(double *data_in,double *data_out, int num, int *state_count)
{
int i = 0, count = 0;
static int init_state = 0;
for(i = 0; i < num; ++i)
{
data_out[i] = Gain1 * data_in[i];
++count;
}
++init_state;
*state_count = init_state;
return count;
}
在该函数中,我们规定了一个静态变量init_state,在函数的赋值循环结束之后,函数会将init_state加一记录调用函数的次数,并将结果赋值给输出的指针*state_count,将静态变量的值进行传递。
而下图为我们构建的示例模型,图中的两个Ccaller模块的文件路径相同:

此外,我们在’主页-仿真设置-常规-输出区间‘中设置步长为0.02,即一秒钟调用50次模块
以下为仿真结果,可以发现静态变量的值输出为100,与理论上的调用50次模块输出为50不同:

若我们仅使用一个模块,输出变为符合预期的50:


现象原因
存在以上现象的原因是,同一模型内并行调用同一c文件下的函数,导致模型内的静态变量在一次调用后同时执行了两次++init_state,最终导致结果为100而非50。这意味着这个函数只能在这个模型下的Ccaller使用一次,不能被多次Ccaller使用。
解决方式
用户可以考虑复制每个需要同一模型内多次调用同一c文件下的函数,重命名并保存,代码示例如下:
//第一个Ccaller 调用的函数
int arrproduct(double *data_in,double *data_out, int num, int *state_count)
{
int i = 0, count = 0;
static int init_state = 0;
for(i = 0; i < num; ++i)
{
data_out[i] = Gain1 * data_in[i];
++count;
}
++init_state;
*state_count = init_state;
return count;
}
//第二个Ccaller 调用的函数
int arrproduct3(double *data_in,double *data_out, int num, int *state_count)
{
int i = 0, count = 0;
static int init_state = 0;
for(i = 0; i < num; ++i)
{
data_out[i] = Gain1 * data_in[i];
++count;
}
++init_state;
*state_count = init_state;
return count;
}
示例模型如下:

所属专栏:Sysblock基础平台
产品信息:Sysblock 嵌入式代码生成工具