How to clear custom c-code variables from memory between simulation runs?
Mostrar comentarios más antiguos
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.
Respuestas (3)
Birdman
el 28 de Mzo. de 2018
0 votos
You can use StartFcn and StopFcn callbacks in File->Model Properties->Model Properties->Callbacks to add and delete custom C code.
9 comentarios
Aleksi Martikainen
el 28 de Mzo. de 2018
Birdman
el 28 de Mzo. de 2018
Firstly, can I see your model? Can you share it?
Aleksi Martikainen
el 28 de Mzo. de 2018
Birdman
el 28 de Mzo. de 2018
I can not open it.
Aleksi Martikainen
el 28 de Mzo. de 2018
Birdman
el 28 de Mzo. de 2018
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
el 28 de Mzo. de 2018
Birdman
el 28 de Mzo. de 2018
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
el 28 de Mzo. de 2018
Adam Johnson
el 2 de Feb. de 2022
0 votos
Has this question be addressed? I am getting the same issue and need a fix.
Pawel Hanczur
el 12 de Sept. de 2022
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.
Categorías
Más información sobre Simulink Environment Customization en Centro de ayuda y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!