arm - 何时实现 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
在我看来,这里有三个问题:
访问排序。这是设备内存,因此相对于其他设备访问事务保留了事务顺序。我认为这意味着在写入 CR 和读取 CSR 之间不需要 DSB。一个链接的问题和答案是:[ARM CortexA]Strongly-ordered and Device Memory Type 之间的区别
设备内存可以被缓冲。当从 CSR 读取时,是否有可能仍然在进行对 CR 的写入。这意味着电压标志将被清除并且代码将继续。其实flag还没升!
硬件响应时间。写入和最终效果之间是否存在延迟?实际上,这应该始终记录在案 - 对于 STM32,文档明确表示当 CR 寄存器更改时设置了标志。
这里有任何竞争条件的可能性吗?真正让我担心的是缓冲 - 当外围设备读取发生时,外围设备写入仍在进行中。
解决方案
访问排序。
访问是强排序的,您不需要屏障指令来读回相同的寄存器。
设备内存可以被缓冲。是否有可能写入 CR
对的,这是可能的。但这不是因为缓冲,而是因为总线传播时间。在特定操作通过所有网桥之前可能需要几个时钟。
硬件响应时间。写入和最终效果之间是否存在延迟
即使存在延迟,从您的角度来看也并不重要。如果您在 CR 寄存器中设置位并等待状态寄存器中的结果。只需等待状态位具有预期值。
推荐阅读
- php - php 通过字符串变量从 url 加载图像
- themes - Visual Studio 2019 垂直选项卡背景颜色
- autodesk-forge - 如何在不使用扩展的情况下在 Autodesk forge 查看器上显示图标
- signalr - Azure SignalR 服务和偶尔连接的桌面客户端
- javascript - 当在 JavaScript 中从不同国家/地区询问时,如何获取特定国家/地区的国家时区和日期时间?
- yii2-advanced-app - Yii2:我可以在一个搜索模型中使用多个模型吗?
- javascript - 如何从 React.js 中的 IPFS 信息获取图像 url?
- html - 使用 Selenium Python 获取隐藏数据
- smartcontracts - 使用 Truffle 部署的智能合约的反编译字节码包含错误代码
- python - 添加一个填充列的新列,对于前 6 行,用 1 到 6 个数字填充它,这与使用 python 的下 6 行相同