谢谢你提到我...
您不要在资源本身上使用 ldrex/strex 对。像 swp 或 test and set 或您的指令集支持的任何东西(对于 arm,它是 swp,最近是 strex/ldrex)。您在 ram 上使用这些说明,这是所有相关方都同意的一些 ram 位置。共享资源的进程使用内存位置来争夺对资源的控制权,无论谁获胜,然后才能实际寻址资源。您永远不会在外围设备本身上使用 swp 或 ldrex/strex,这是没有意义的。我可以看到内存系统没有给你一个专有的好的响应(EXOKAY),这是你摆脱 ldrex/strex 无限循环所需要的。
您有两种共享资源的基本方法(也许更多,但这里有两种)。一个是你使用这个共享内存位置和共享资源的每个用户,争夺对内存位置的控制权。当您获胜时,您可以直接与资源交谈。完成后放弃对共享内存位置的控制。
另一种方法是您只允许一个软件与外围设备通信,其他任何软件都不允许与外围设备通信。任何希望在外围设备上做某事的人都要求一个资源为他们做这件事。就像每个人都可以共享汽水机,而汽水机在柜台后面,只有汽水机员工才能使用汽水机。然后你需要一个计划,要么让人们排队,要么让人们拿一个号码并被叫来装满他们的饮料。除了与外围设备通信的单一资源外,您还必须提出一个方案,例如 fifo,以本质上使请求串行化。
这些都在荣誉系统上。您期望没有其他人与不应该与外围设备交谈的外围设备交谈,或者没有赢得与外围设备交谈的权利的人。如果您正在寻找硬件解决方案来阻止人们与之交谈,那么,使用 mmu,但现在您需要管理谁赢得了锁以及他们如何让 mmu 畅通无阻(不使用荣誉系统)并重新阻止以某种方式
在您可能有一个中断处理程序和一个共享资源的前台任务的情况下,您有一个或另一个可以接触资源,而另一个请求请求。例如,资源可能是中断驱动的(例如串行端口),并且您让中断处理程序直接与串行端口硬件对话,如果应用程序/前台任务想要完成某些事情,它会填写请求(将某些内容放入fifo/buffer) 中断然后查看请求队列中是否有任何内容,如果有,则对其进行操作。
当然有,禁用中断和重新启用关键部分,但如果你想让你的中断有一些时间/延迟的概念,这些是可怕的......了解你在做什么,它们可以用来解决这个应用程序+ isr 两个用户问题。
非缓存内存空间上的 ldrex/strex:
我的 extest 可能有更多关于何时可以使用和不能使用 ldrex/strex 的文本,不幸的是,arm 文档在这方面并不是那么好。他们告诉你停止使用 swp,这意味着你应该使用 strex/ldrex。但是然后切换到硬件手册,它说您不必支持单处理器系统上的独占操作。这说明了两件事,ldrex/strex 用于多处理器系统,并用于在多处理器系统上的处理器之间共享资源。这也意味着单处理器系统不一定支持 ldrex/strex。然后它变得更糟。ARM 逻辑通常停在处理器内核的边缘,L1 高速缓存包含在此边界内,它不在 axi/amba 总线上。或者,如果您购买/使用 L2 缓存,则 ARM 逻辑会在该层的边缘停止。然后你进入芯片供应商特定的逻辑。这就是您阅读硬件手册的逻辑,因为它说您不需要支持单处理器系统上的独占访问。所以问题是特定于供应商的。更糟的是,到目前为止,我发现 ARM 的 L1 和 L2 缓存确实支持 ldrex/strex,所以如果你有缓存,那么 ldrex/strex 将在供应商代码不支持它们的系统上工作。如果您没有缓存,那么当您在这些系统上遇到麻烦时(那是我写的最重要的东西)。所以如果你有缓存,那么 ldrex/strex 将在供应商代码不支持它们的系统上工作。如果您没有缓存,那么当您在这些系统上遇到麻烦时(那是我写的最重要的东西)。所以如果你有缓存,那么 ldrex/strex 将在供应商代码不支持它们的系统上工作。如果您没有缓存,那么当您在这些系统上遇到麻烦时(那是我写的最重要的东西)。
具有 ldrex/strex 的处理器足够新,可以通过 copressor 读取访问大量配置寄存器。埋在里面有一个“支持swp指令”位来确定你是否有交换。cortex-m3的人没有遇到没有swap和没有ldrex/strex的情况吗?
linux内核中的错误(还有许多其他对arm硬件和文档的误解)是在支持ldrex / strex的处理器上选择ldrex / strex解决方案而不确定它是否是多处理器,所以你可以(我知道两个实例)进入一个无限的 ldrex/strex 循环。如果您修改 linux 代码以使其使用 swp 解决方案(两种解决方案都有代码),它们 linux 将工作。为什么我所知道的互联网上只有两个人谈论过这个问题,因为你必须关闭缓存才能让它发生(据我所知),谁会关闭两个缓存并尝试运行 linux?成功关闭缓存实际上需要相当多的工作,需要对 linux 进行修改才能使其正常工作而不会崩溃。
不,我不能告诉你系统,不,我现在不知道,也从未为 ARM 工作过。如果您知道在哪里查找以及如何解释这些内容,那么这些内容都在 arm 文档中。