How to clear custom c-code variables from memory between simulation runs?
显示 更早的评论
Hello
I have a Simulink model that has lots of custom c-code functions in it. It seems that in Simulink the custom code variables stay in the memory after the simulation has ended.
For example I have following code:
int i = 0;
int foo() {
i = i + 1;
return i;
}
The value of i does not reset to 0 between simulation runs. The value of i increments by 1 for everytime I run the simulation.
How do I unload the variables of custom c-code from the memory?
Thanks in advance.
回答(3 个)
Birdman
2018-3-28
0 个投票
You can use StartFcn and StopFcn callbacks in File->Model Properties->Model Properties->Callbacks to add and delete custom C code.
9 个评论
Aleksi Martikainen
2018-3-28
Birdman
2018-3-28
Firstly, can I see your model? Can you share it?
Aleksi Martikainen
2018-3-28
Birdman
2018-3-28
I can not open it.
Aleksi Martikainen
2018-3-28
Birdman
2018-3-28
This code should do it. Note that static variables will keep their values between each simulation.
The code:
int test()
{
int i=0;
i=i+1;
return i;
}
Aleksi Martikainen
2018-3-28
Birdman
2018-3-28
In my code, i is defined within the function and at every simulation, it is initialized to 0, equivalent to clearing it at the end of the simulation.
Aleksi Martikainen
2018-3-28
Adam Johnson
2022-2-2
0 个投票
Has this question be addressed? I am getting the same issue and need a fix.
Pawel Hanczur
2022-9-12
Hello.
I was struggling a lot with this strange issue. Here is the workaround:
In m-function you'll should have the contruction of sort fo this:
persistent Is_First_Cycle;
if isempty(Is_First_Cycle)
Is_First_Cycle=1;
else
Is_First_Cycle=0;
end
Then you pass the flag to the to the C code:
coder.ceval('my_C_prg', Is_First_Cycle,...);
Then in C code you can add something like this:
//my_C_prg.c
void C_prg(double Is_First_Cycle, ...)
{
double var1;
double* refVar1;
double* refVar2;
if (Is_First_Cycle==1)
{var1=0;
VarsIni (&refVar1, &refVar2,...);
}
...
What moreover when i was trying to set pointer variable in main function for example:
void C_prg(double Is_First_Cycle,..., ..., ...)
{
double var1;
double* refVar1;
double* refVar2;
if (Is_First_Cycle==1)
{var1=0;
refVar1[0]=1;
refVar2[0]=3;
}
}
The all Matlab crashed. And funny thing is that, that when you I used the first construction (with inner VarsIni function), everything worked fine.
Best regards.
类别
在 帮助中心 和 File Exchange 中查找有关 Simulink Environment Customization 的更多信息
产品
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!