我知道这可能是一种奇怪的用法。我只是想知道我是否可以在禁用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;
}
其中,lock是共享内存中的变量,因此两个内核都可以访问此锁。
此实现的问题是访问锁定不是独占的。这就是我想使用LDREX / STREX实现自旋锁的原因。请允许我重申我的问题:
我可以在没有启用SCU的情况下使用LDREX / STREX吗?
谢谢!
答案 0 :(得分:2)
所以...你的问题的直接答案是,是的,它是可能的 - 只要内存系统中的其他内容实现共享内存区域的独占监视器。如果没有,那么您的STREX将始终返回OK(而不是EXOK),可以在结果寄存器中观察到失败。
但是,为什么不启用SCU? 显然,您要做的事情要求至少在该区域内对两个操作系统之间的内存进行连贯的查看。使用PIPT数据缓存,您不会看到缓存行的任何别名,具体取决于它们在每个图像中的映射方式。
答案 1 :(得分:1)
总的来说,答案是否定的。这里有两个问题:
1)您不能在未缓存的内存上使用加载/存储专用。独家运营仅在" normal"幂等记忆。
2)ARM手册没有说明独占显示器如何与内存一致性一起工作,但任何理智的实现基本上都会将显示器置于缓存线采集机制中。如果您禁用了缓存行侦听,则很可能会使监视器在您的芯片上无法正常运行。
答案 2 :(得分:1)
你唯一的(形成不良)问题,
我可以在没有启用SCU的情况下使用LDREX / STREX吗?
在理想的ARM领域,是的,可能。也就是说,有可能在某个地方,有一天你可以做到这一点。我想你的意思是,
我可以在没有启用SCU 的情况下使用LDREX / STREX 吗?
不幸的是,ARM ARM是一个政治/官僚文件。阅读“强烈建议”,“难以置信”,“未知”和可以时,您必须格外小心。所有程序员都希望ldrex/strex
适用于所有内存。事实上,如果BUS控制器(通常是AXI-NIC)实现了监视器,那么支持备受喜爱的swp
指令就没有问题。 StackOverflow上有各种帖子,人们希望将swp
替换为ldrex/strex
。
在您阅读并重新阅读ARM ARM的双重发言(它是为程序员编写,但也为硅实现者编写)之后,很明显监视逻辑可能已实现在缓存中。高速缓存控制器必须实现脏线广播。 Dirty line broadcasts与'监视器'非常相似,而您的“预留颗粒”很可能是缓存行大小(共同发生的情况)。
ARM ARM是针对可能希望实现Cortex-A CPU的人员编写的通用文档。编写它是为了使他们的手(创造力)不依赖于在缓存中实现监视器。
因此,您需要阅读特定Cortex-A9 SOC的具体文档。 可能仅支持具有缓存内存的ldrex/strex
。实际上,建议在执行pld
之前发出ldrex
以确保内存在缓存中,这意味着您需要激活系统中的SCU。我想你担心SCU会增加延迟的一些额外周期吗?
我认为其中一些信息让很多非常聪明的人感到困惑。请注意可能和 之间的区别。 StackOverflow上的每个人可能都希望在总线控制器(或核心存储器芯片)中实现监视器的情况。但是,对于大多数真正的芯片,情况并非如此。
可以肯定的是,如果您希望将来的代码/操作系统移植到更新或不同的Cortex-A CPU,即使您的芯片组支持缓存子系统之外的“全局监视器”,也不应该做出这种假设。