我正在项目中使用带有Cortex-m3内核的STM32f103芯片。根据手册3.3.1. Cortex-M3 instructions,使用单个LRD指令加载32位字需要2个CPU周期才能完成(假设目标不是PC)。
我的理解是,这仅适用于从内部存储器(闪存或内部SRAM)读取
通过FSMC从外部SRAM读取时,必须花费更多周期才能完成读取操作。在读操作期间,CPU是否停止,直到FSMC能够将数据放在一起?换句话说,访问外部存储器时会丢失CPU周期吗?
谢谢。
编辑1:还假设所有访问都对齐32位访问。
答案 0 :(得分:1)
STM32F1xx FSMC具有可编程等待状态 - 如果您的存储器未设置为零,则确实需要额外的周期。外部存储器的数据总线是16位或8位,因此32位访问也需要额外的周期。写入FIFO也可以导致插入等待状态。
另一方面,Cortex-M是一种哈佛架构内核,在不同总线上具有不同的存储器,因此可以同时进行指令和数据提取,从而最大限度地减少处理器停滞。
答案 1 :(得分:1)
LDR
和STR
说明不可中断。 FSMC与AHB桥接,并且可以以更慢的速度运行,如您所知。对于读取,管道将停止,直到数据准备就绪,这可能导致最坏情况中断延迟增加。根据配置,写入可能会或可能不会使管道停止。参考手册说有一个双字写缓冲区,但似乎只能用于缓冲突发存储器。如果您正在使用具有突发接口的CRAM(PSRAM),则后续写入可能在下一条指令执行之前未完成,但后续读取将停止(更长时间)以允许写入在启动读取之前完成。
如果使用LDM
和STM
指令执行多次读取或写入,则这些指令是可中断的,并且它是实现定义的,它们是从头开始重新启动还是在返回时继续。我无法找出ST如何选择实现此行为。在任何一种情况下,每次单独的公交交易都不应该被中断。
关于处理64位值的LDRD
和STRD
,我发现this discussion引用了ARM-ARM中的以下内容:
“... LDRD,... STRD,...指令作为序列执行 单词对齐的单词访问。保证每个32位字访问 是单拷贝原子。该体系结构不需要子序列 从序列中进行两次或多次单词访问是单拷贝的 原子“。
因此,似乎LDRD
和STRD
的功能可能与LDM
和STM
的功能相同。