Dynamic memory allocation in C++ S_functions

3 views (last 30 days)
Lukas Abelt
Lukas Abelt on 21 Jun 2017
Commented: Lukas Abelt on 11 Jul 2017
Hey there, My question is pretty straightforward: Is it possible/allowed to reallocate Memory in S-functions written in C++. I have an array in my S-Function that buffers data for me and I was wondering if I need to allocate the buffer big enough in my mdlStart function or if I could start off with a small buffer and use realloc() to make it bigger if needed at run-time. While researching this Problem I found some unclear answers to that. Some say, that dynamic allocation is not allowed in Simulink, but I couldn't find any specific Information about this in the documentation. Thanks in advance
  2 Comments
Dhruvesh Patel
Dhruvesh Patel on 28 Jun 2017
Edited: Dhruvesh Patel on 28 Jun 2017
One option could be to use the PWORK Vector . You would need to allocate/reallocate (using malloc/realloc) in your C++ code and give the pointer to this memory to PWORK Vector which will hold on to it throughout the simulation. Refer to (2) of the following answer.
Please provide some example code describing what you intend to archive. It would lead to a more precise answer.
Lukas Abelt
Lukas Abelt on 11 Jul 2017
Hello Dhruvesh,
This is basically what I am currently doing. I am allocating my Array in the mdlStart function, store the pointer in the PWork vector and access this pointer in my mdlOutputs.
I just wanted to get some Information if the Simulink engine allows dynamic Memory (re)allocation during Simulation as some sources I found during my Research on this topic state explicitely, that dynamic Memory (re)allocation during Simulation is not allowed.
Can I assume from your post, that there are no limitations (despite the usual ones) on using malloc/realloc during Simulation?
I am attaching a snippet of my code how I allocate my buffer and store/Access it from the PWorks vector in my current Version. If possible I would like to adapt this code to dynamically allocate a greater buffer if needed (and not just use a big buffer from the beginning)
#define BUFFERSIZE 65535
...
static void mdlStart(SimStruct *S){
...
/* Allocate memory for PWork values */
void *data_buffer = calloc(BUFFERSIZE, sizeof(char));
...
ssSetPWorkValue(S, DATA_BUFFER, data_buffer);
}
...
static void mdlOutputs(SimStruct *S){
...
char *data_buffer = (char *)ssGetPWorkValue(S, DATA_BUFFER);
//Do something with data_buffer
}
//Of course free() the allocated memory in mdlTerminate()
Thank you in advance!
Lukas

Sign in to comment.

Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!