Hi, Can anybody give an insight whether this is good or not in embedded environment? I have a function which call itself when a condition is false, see code sample below:
void Test(void) { U8 temp; U8 temp1; U16 temp2; U16 temp3; if(some_extern_flag) { //Exit to this function } else { Test(); //Call me again } }
Does it create memory leak when called many times, say 5 times the flag is false, it will call itself 5x? This function doesn't called from either ISR or other function, just within it. Will this create a problem later on?
thanks gp
the '51 C is due to the architecture of the processor not a very good candidate for recursive functions.
instead of what you show, do something like this
... while test(); ... // test will return '1' if unsuccesful, '0' id succesful bit test(void) { }
Erik
the above specifically relates to the '51
Another thing is that the above case may not result in any recursion, depending on if the specific compiler supports optimization for tail-end recursion, i.e. when the function is calling itself directly before exiting. Then the recursive call can be replaced with a jump to the start of the function, basically modifying the function into:
void Test(void) { U8 temp; U8 temp1; U16 temp2; U16 temp3; for (;;) { if(some_extern_flag) { //Exit to this function return; } else { continue; // Instead of recursion, just restart our loop. } break; } }
Can anybody give an insight whether this is good or not in embedded environment?
That code is not good in any environment. It's just plain silly. There are valid uses for recursion, some even applicable to embedded systems. But that thing's far from being in that category.
If you wanted to run a loop, run a loop. Don't bastardize recursion to do its job.
Thank you guys. Your individual input is very helpful.
Thanks once again. I've got an idea now, thanks to you Per.