gpt4 book ai didi

arm - ARM Cortex M7 什么时候真正需要 CLREX?

转载 作者:行者123 更新时间:2023-12-03 13:51:19 25 4
gpt4 key购买 nike

我在网上找到了几个地方,其中指出每当进入中断例程时“必须”调用 CLREX,我不明白。 CLREX 状态的文档(添加编号以便于引用):

(1) Clears the local record of the executing processor that an address has had a request for an exclusive access.

(2) Use the CLREX instruction to return a closely-coupled exclusive access monitor to its open-access state. This removes the requirement for a dummy store to memory.

(3) It is implementation-defined whether CLREX also clears the global record of the executing processor that an address has had a request for an exclusive access.


我在这里几乎什么都不懂。
我的印象是,按照 example in the docs 的方式写一些东西就足以保证原子性:
    MOV r1, #0x1                ; load the ‘lock taken’ value
try: <---\
LDREX r0, [LockAddr] ; load the lock value |
CMP r0, #0 ; is the lock free? |
STREXEQ r0, r1, [LockAddr] ; try and claim the lock |
CMPEQ r0, #0 ; did this succeed? |
BNE try ; no - try again ------------/
.... ; yes - we have the lock
  • 为什么需要清除“本地记录”?我认为 LDREX/STREX 足以保证从多个中断中原子访问一个地址? IE。 GCC for ARM 使用 LDREX/STREX 编译所有 C11 原子函数,我没有看到 CLREX 在任何地方被调用。
  • 第二段指的是什么“对虚拟商店的要求”?
  • 全局记录和本地记录有什么区别?多核场景是否需要全局记录?
  • 最佳答案

    分别回答(和解释)你的三个问题:

    1. 为什么要清除访问记录?

    当强制执行严格的代码嵌套时,例如处理中断时,通常不需要 CLREX。但是,在某些情况下它很重要。想象一下,您正在为抢占式操作系统内核编写上下文切换,它可以异步挂起正在运行的任务并恢复另一个。现在考虑以下病态情况,涉及使用 LDREXSTREX 操作相同共享资源的两个相同优先级的任务(A 和 B):

    Task A      Task B
    ...
    LDREX
    -------------------- context switch
    LDREX
    STREX (succeeds)
    ...
    LDREX
    -------------------- context switch
    STREX (succeeds, and should not)
    ...

    因此上下文切换必须发出 CLREX 以避免这种情况。

    2. 避免了什么“对虚拟商店的要求”?

    如果没有 CLREX 指令,则有必要使用 STREX 来放弃独占访问标志,这涉及内存事务,因此如果您只想清除标志,它会比所需的速度慢。

    3. 是多核场景的“全局记录”吗?

    是的,如果您使用的是单核机器,则只有一个记录,因为只有一个 CPU。

    关于arm - ARM Cortex M7 什么时候真正需要 CLREX?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51162344/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com