专栏
标签
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模块的文件路径相同:

75.png

此外,我们在’主页-仿真设置-常规-输出区间‘中设置步长为0.02,即一秒钟调用50次模块

以下为仿真结果,可以发现静态变量的值输出为100,与理论上的调用50次模块输出为50不同:

76.png

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

77.png
78.png

现象原因

存在以上现象的原因是,同一模型内并行调用同一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;

}

示例模型如下:

79.png

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

全部回答

暂无数据
暂无数据
用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天