首页 > 解决方案 > 何时实现 Cortex 写入设备

问题描述

在 Cortex M0(在我的例子中,在 STM32L073 上)上写入设备寄存器时,会出现一个问题,即在 a) 对设备内存的访问顺序和 b) 确定对外围配置的更改实际上已经完成到任何依赖项变为有效的程度。

举一个具体的例子,将内部稳压器更改为不同的电压。您将更改写入 PWR->CR 并从 PWR->CSR 读取状态。我看到这样的代码:

Write to PWR->CR to set the voltage range
Spin until (PWR->CSR & voltage flag) becomes zero

在我看来,这里有三个问题:

  1. 访问排序。这是设备内存,因此相对于其他设备访问事务保留了事务顺序。我认为这意味着在写入 CR 和读取 CSR 之间不需要 DSB。一个链接的问题和答案是:[ARM CortexA]Strongly-ordered and Device Memory Type 之间的区别

  2. 设备内存可以被缓冲。当从 CSR 读取时,是否有可能仍然在进行对 CR 的写入。这意味着电压标志将被清除并且代码将继续。其实flag还没升!

  3. 硬件响应时间。写入和最终效果之间是否存在延迟?实际上,这应该始终记录在案 - 对于 STM32,文档明确表示当 CR 寄存器更改时设置了标志。

这里有任何竞争条件的可能性吗?真正让我担心的是缓冲 - 当外围设备读取发生时,外围设备写入仍在进行中。

标签: armembeddedrace-conditionlatencycortex-m

解决方案


访问排序。

访问是强排序的,您不需要屏障指令来读回相同的寄存器。

设备内存可以被缓冲。是否有可能写入 CR

对的,这是可能的。但这不是因为缓冲,而是因为总线传播时间。在特定操作通过所有网桥之前可能需要几个时钟。

硬件响应时间。写入和最终效果之间是否存在延迟

即使存在延迟,从您的角度来看也并不重要。如果您在 CR 寄存器中设置位并等待状态寄存器中的结果。只需等待状态位具有预期值。


推荐阅读