ARM C 中的可重入函数是否有可能损坏寄存器值?

Is register value corruption a possibility on reentrant functions in ARM C?

可能是我想多了,因为我已经研究了几个小时。我现在很清楚重入的概念和规则,但由于我是为 ARM (Cortex-M4) 做这件事,我想到了另一个问题,这个问题没有涉及我发现的重入资源,也没有触及它的规则。

根据可重入规则,我了解到以下函数是可重入的:

void foo(int x, int y)
{
    printf("x = %d - y = %d", x, y);
}

这里的问题是,至少在我已经验证过的 ARM 上,xy 通过寄存器 r2r3 而不是在 foo 的堆栈中。如果它们是在堆栈中传递的,那么对我来说不会有任何混淆,因为我知道这是在函数调用中保留的,但是,由于 xy 是在寄存器中传递的,如果在第一次调用后立即从另一个 RTOS 任务上下文对 foo 进行第二次调用,会发生什么情况?

void foo(int x, int y)
{ <-------------------------------------------- Second call made here
    printf("x = %d - y = %d\n", x, y);
}

那不会破坏 r2r3 值吗?

我无法测试这个,因为我不知道如何实现它。

每当操作系统切换到另一个线程时,它必须保存旧线程的所有寄存器值并为新线程加载寄存器值。