This forum may not be the best to ask the question, but the answers on the other forums (that i know) were generally with respect to C for desktop pc (where memory management is different from that in embedded) and this forum has knowledgeable embedded people. hence...
I was worried about the following situation:
void function1() { ... //other variables char* ptr = myary; ... ptr = ReadNandFlash("myfile"); ... } char* ReadNandFlash(char* Filename) { FILE* file; char temp_ary[256]; file = fopen(Filename, "r"); if(file == NULL) { return NULL; } while(!feof(file)) { fread(temp_ary, sizeof(char), 256, file); } fclose(file); return ary; }
will the 'temp_ary' be destroyed as only the pointer value is returned back to the function1()?
Data on the stack will live until it is reused, which is likely to happen on the next function call. Regarding this, there is no difference between a PC or an embedded environment. Interrupts and other tasks use their own stack. Nevertheless, this is a risky situation where later additions to the code may destroy the data, because the programmer is not aware where the data is stored. Making the array static, as Franc suggested, will of course work and decrease stack usage, which normally is kept short on embedded systems. For clarity, it seems to be advisable to turn things round: Introduce the array earlier in the call chain (static or on stack), and pass pointer to it and size to "ReadNandFlash".
Martin
For clarity, it seems to be advisable to turn things round: Introduce the array earlier in the call chain (static or on stack), and pass pointer to it and size to "ReadNandFlash".
Totally this
Yes - when using the stack for temporary storage, then that storage should obviously be in a part of the stack that the active call tree owns - which is why it is safe to have a buffer on the stack and send a pointer to that buffer to a function that gets called.
But it is not safe to call a function that returns a pointer to a buffer in that functions stack space.
The location of the buffer must be selected so that the lifetime of the buffer isn't shorter than the need for the buffer.
char buf[100]; snprintf(buf,sizeof(buf),"%u",value);
The above have a local buffer and sends a pointer to that buffer to another function - i.e. the safe route to play with stack-allocated buffers.
Not necessarily!
Remember that this is marked as a Non-Specific (Generic) topic. Not all compilers - notably, not all Keil compilers - use the stack for automatic variables...
void function1() { ... //other variables char* ptr = myary; ... ptr = ReadNandFlash("myfile"); ... }
What if we make the function1 a critical section, so that nothing can "interrupt" the function1. I guess it would always work safely?
Your code doesn't show where that myary buffer is.
And it has two assigns to the pointer but never seems to make use of the memory (myary) that the pointer points to.
Hi Andrew,
thank you for this clarification - I never ran across such a compiler.
myary is local to function1(). Sorry for that.
View all questions in Keil forum