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 上,x
和 y
通过寄存器 r2
和 r3
而不是在 foo
的堆栈中。如果它们是在堆栈中传递的,那么对我来说不会有任何混淆,因为我知道这是在函数调用中保留的,但是,由于 x
和 y
是在寄存器中传递的,如果在第一次调用后立即从另一个 RTOS 任务上下文对 foo
进行第二次调用,会发生什么情况?
void foo(int x, int y)
{ <-------------------------------------------- Second call made here
printf("x = %d - y = %d\n", x, y);
}
那不会破坏 r2
和 r3
值吗?
我无法测试这个,因为我不知道如何实现它。
每当操作系统切换到另一个线程时,它必须保存旧线程的所有寄存器值并为新线程加载寄存器值。
可能是我想多了,因为我已经研究了几个小时。我现在很清楚重入的概念和规则,但由于我是为 ARM (Cortex-M4) 做这件事,我想到了另一个问题,这个问题没有涉及我发现的重入资源,也没有触及它的规则。
根据可重入规则,我了解到以下函数是可重入的:
void foo(int x, int y)
{
printf("x = %d - y = %d", x, y);
}
这里的问题是,至少在我已经验证过的 ARM 上,x
和 y
通过寄存器 r2
和 r3
而不是在 foo
的堆栈中。如果它们是在堆栈中传递的,那么对我来说不会有任何混淆,因为我知道这是在函数调用中保留的,但是,由于 x
和 y
是在寄存器中传递的,如果在第一次调用后立即从另一个 RTOS 任务上下文对 foo
进行第二次调用,会发生什么情况?
void foo(int x, int y)
{ <-------------------------------------------- Second call made here
printf("x = %d - y = %d\n", x, y);
}
那不会破坏 r2
和 r3
值吗?
我无法测试这个,因为我不知道如何实现它。
每当操作系统切换到另一个线程时,它必须保存旧线程的所有寄存器值并为新线程加载寄存器值。