我知道这可能是一个奇怪的用法。我只想知道我是否可以在禁用 SCU 的情况下使用 LDREX/STREX。
我正在使用双核 Cortext-A9 SoC。两个核心以 AMP 模式运行:每个核心都有自己的操作系统。虽然内存控制器是共享资源,但每个内核都有自己的内存空间。一个人无法访问另一个人的内存空间。由于不需要缓存一致性,因此未启用 SCU。同时,我还有一个共享内存区域,两个内核都可以访问。共享内存区域是非缓存的,以避免缓存一致性问题。
我在这个共享内存区域中定义了一个自旋锁。此自旋锁用于保护共享资源访问。现在,自旋锁的实现很简单,如下所示:
void spin_lock(uint32_t *lock)
{
while(*lock);
*lock = 1;
}
void spin_unlock(uint32_t *lock)
{
*lock = 0;
}
其中,锁是共享内存中的一个变量,因此两个内核都可以访问该锁。
这个实现的问题是访问锁不是独占的。这就是为什么我想使用 LDREX/STREX 来实现自旋锁。请允许我重申我的问题:
我可以在不启用 SCU 的情况下使用 LDREX/STREX 吗?
谢谢!