Embedded 当通过FSMC访问外部存储器(SRAM)时,CPU是否会暂停

Embedded 当通过FSMC访问外部存储器(SRAM)时,CPU是否会暂停,embedded,stm32,cortex-m3,Embedded,Stm32,Cortex M3,我正在一个项目中使用一个带有Cortex-m3内核的STM32f103芯片。根据手册,使用单个LRD指令加载32位字需要2个CPU周期才能完成(假设目标不是PC) 我的理解是,这仅适用于读取内部存储器(闪存或内部SRAM) 当通过FSMC从外部SRAM读取时,必须花费更多的周期才能完成读取操作。在读取操作期间,CPU是否会暂停,直到FSMC能够将数据放在一起?换句话说,在访问外部存储器时是否会丢失CPU周期 多谢各位 编辑1:还假设所有访问都是对齐的32位访问 STM32F1xx FSMC具有可

我正在一个项目中使用一个带有Cortex-m3内核的STM32f103芯片。根据手册,使用单个LRD指令加载32位字需要2个CPU周期才能完成(假设目标不是PC)

我的理解是,这仅适用于读取内部存储器(闪存或内部SRAM)

当通过FSMC从外部SRAM读取时,必须花费更多的周期才能完成读取操作。在读取操作期间,CPU是否会暂停,直到FSMC能够将数据放在一起?换句话说,在访问外部存储器时是否会丢失CPU周期

多谢各位


编辑1:还假设所有访问都是对齐的32位访问

STM32F1xx FSMC具有可编程的等待状态-如果您的内存未设置为零,则确实需要额外的周期。外部存储器的数据总线为16位或8位,因此32位访问也需要额外的周期。写入FIFO也会导致插入等待状态


另一方面,Cortex-M是哈佛体系结构的核心,在不同的总线上有不同的内存,因此指令和数据获取可以同时进行,从而在一定程度上减少处理器的停滞。

LDR
STR
指令是不可中断的。FSMC是从AHB桥接而来的,并且可以以更慢的速度运行,正如您已经知道的。对于读取,管道将暂停,直到数据准备就绪,这可能会增加最坏情况下的中断延迟。写入可能会或可能不会暂停管道,具体取决于配置。参考手册说有两个字的写缓冲区,但它似乎只能用来缓冲突发存储器。如果使用带突发接口的CRAM(PSRAM),则后续写入可能不会在执行下一条指令之前完成,但后续读取将暂停(更长时间),以便在启动读取之前完成写入

如果使用
LDM
STM
指令执行多个读取或写入,则这些指令是可中断的,实现定义为它们是从开始重新启动还是在返回时继续。我还没有找到ST是如何选择实现这种行为的。在任何一种情况下,每个单独的总线事务都不应该被中断

关于处理64位值的
LDRD
STRD
,我从ARM中找到了以下引用:

“…LDRD,…STRD,…指令作为 字对齐字访问。每个32位字访问保证 是单拷贝原子的。体系结构不需要子序列 将序列中的两个或多个字访问合并为单个副本 原子的。”


因此,看来
LDRD
STRD
的功能可能与
LDM
STM
的功能相同。

简短回答:是的。还有什么可能?好的,这是否意味着从外部存储器访问32位是原子的?因为CPU在这个过程中被暂停了?我不确定你所说的“原子”到底是什么意思。你的意思是关于中断吗?是的,CPU在等待FSMC时会停止为中断服务吗?内存读取被认为是“快速”且不可中断的。嗨,Clifford,谢谢你的回答。据我所知,ROM闪存位于专用IBU上,因此可以独立获取指令。比方说,当通过FSMC访问外部存储器时,管道被馈电,CPU仍在暂停。对吗?读/写操作会被IRS中断吗?非常感谢您的详细回答。不应中断每个单独的总线事务。这就是我要找的。使用
LDRD
STRD
访问两个单词(64位)怎么样?这两个说明也不可中断?在答案中添加了关于LDRD和STRD的详细信息。简而言之,不,这些指令执行两个32位访问,每个访问都是原子的,但整个操作不是原子的。