Maybe I'm overthinking this since I've been researching for a couple of hours. I have the concept and rules of reentrancy pretty clear now but since I'm doing this for ARM (Cortex-M4), another question came to mind that is not touched on the reentrancy resources I've found, nor in its rules.
I understand that the following function is reentrant from the rules of reentrancy:
void foo(int x, int y)
{
printf("x = %d - y = %d", x, y);
}
The thing here is that, at least on ARM where I've verified this, x
and y
are passed on registers r2
and r3
and not in foo
's stack. If they were passed in the stack then there would not be any confusion for me because I know that is preserved across function calls, however, since x
and y
are passed in registers, what would happen if a second call to foo
is made from another RTOS task context right after the first call has been made?
void foo(int x, int y)
{ <-------------------------------------------- Second call made here
printf("x = %d - y = %d\n", x, y);
}
Wouldn't that corrupt r2
and r3
values?
I haven't been able to test this because I have no idea how to make it happen.
CodePudding user response:
Whenever the operating system switches to another thread it has to save all the register values from the old thread and load the register values for the new thread.