代码之家  ›  专栏  ›  技术社区  ›  Lou

什么时候手臂皮层M7需要CLREX?

  •  3
  • Lou  · 技术社区  · 6 年前

    我在网上找到了几个地方,上面写着每当进入中断程序时必须调用clrex,我不明白。文件 CLREX 状态(添加编号以便于参考):

    (1)清除执行处理器的本地记录,表明某个地址已请求独占访问。

    (2)使用 CLREX 使紧密耦合的独占访问监视器返回其开放访问状态的指令。这就消除了对内存虚拟存储的需求。

    (3)实施定义是否 克莱克斯 还清除正在执行的处理器的全局记录,即某个地址已请求独占访问。

    我什么都不懂。

    我的印象是沿着这条线写些东西 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
    
    1. 为什么要清除“本地记录”?我以为 LDREX / STREX 足以保证从多个中断对地址进行原子访问吗?即,用于arm的gcc使用 LDREX公司 / 链球菌 我不明白 克莱克斯 在任何地方被召唤。

    2. 第二段指的是什么“虚拟商店的要求”?

    3. 两者之间有什么区别 全球的 记录和 地方的 记录?多核场景是否需要全局记录?

    2 回复  |  直到 6 年前
        1
  •  4
  •   cooperised    6 年前

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

    一。为什么要清除访问记录?

    当强制执行严格的代码嵌套时,例如在处理中断时,则 CLREX 通常不需要。然而,有些情况下,这很重要。假设您正在为抢占式操作系统内核编写上下文开关,该内核可以异步挂起正在运行的任务并恢复另一个任务。现在考虑以下病理情况,涉及两个同等优先级的任务(a和b)使用 LDREX STREX 以下内容:

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

    因此上下文开关必须发出 克莱克斯 为了避免这个。

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

    如果没有 克莱克斯 指令,则需要使用 链球菌 要放弃独占访问标志,它涉及内存事务,因此如果您只想清除该标志,则会比需要的速度慢。

    三。是多核场景的“全球记录”?

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

        2
  •  1
  •   Graeme    6 年前

    事实上 CLREX 不是 对于m7上的异常/中断,它似乎只是出于兼容性的原因才被包括在内。从 documenation (Version c) 以下内容:

    CLREX支持与其他ARM Cortex处理器的兼容性 如果发生异常,则强制独占存储区失败 在load exclusive指令和匹配的store exclusive指令之间 同步操作中的指令。在Cortex-M处理器中, 本地独占访问监视器在 异常边界,因此使用clrex的异常处理程序是可选的。

    因此,CORTEX-M处理器在异常/中断进入/退出时清除本地独占访问标志,这就否定了大多数(所有?)的用例 克莱克斯 是的。

    关于您的第三个问题,正如其他人所提到的,您认为全局记录用于多核场景是正确的。可能仍然有 克莱克斯 在多核处理器上,取决于实现定义的对本地/全局标志的影响。

    我可以理解为什么会有这样的困惑,因为m7文档的初始版本不包括这些句子(更不用说arm网站上其他各种版本的通用文档了)。即使现在,我也无法链接到最新版本。默认情况下,页面显示“版本A”,您必须通过下拉框手动更改版本(希望以后会有所更改)。

    更新

    作为对评论的回应,一个附加的文档 link 为了这个。这是手册的一部分,描述了在特定说明文档之外使用这些说明的情况(自第一次修订以来也一直存在):

    如果出现以下情况,处理器将删除其独占访问标记:

    • 它执行CLREX指令。

    • 它执行strex指令,而不管写入是否成功。

    • 出现异常。这意味着处理器可以解决不同线程之间的信号量冲突。

    在多处理器实现中:

    • 执行CLREX指令只删除处理器的本地独占访问标记。

    • 执行strex指令或异常将删除处理器的本地独占访问标记。

    • 对可共享内存区域执行strex指令还可以删除 系统。