内核耦合存储器 (CCM)、中断和 STM32F3xx

Core Coupled Memory (CCM), Interrupts and STM32F3xx

我目前正在研究 STM32F303xx 系列芯片。它们具有核心耦合存储器 (CCMRAM),与 F4 系列上的 CCM 不同,它允许执行代码。我已将关键例程(例如 ISR's)放入 CCM 并想知道什么是最有效的设置,将中断向量 Table 也放入 CCM 或普通 SRAM 并且我有点卡在那个上。有人可以在正确的方向上提示我吗?

我不确定它是否直接对代码执行性能有任何影响,但关键是总线架构,以及放置数据和代码的位置,以及您是在执行 DMA 操作还是将写入闪存。

闪存、SRAM 和 CCM 各自位于单独的总线上,在许多 STM32 部件上是 SRAM,对于较大的部件,闪存进一步分为多个总线。因此,当从一个执行代码时,可以同时从另一个获取数据。但是,如果您将数据和指令放在同一内存中,则指令和数据访问必须序列化。同样,如果您有 DMA 操作 to/from 内存,它也会影响同一内存中的数据访问和指令获取。

在大多数情况下,由于 闪存加速器,从 STM32 上的片上闪存执行代码的延迟很小或没有延迟,因此可能没什么收获从根本上将代码放在 CCM 中。在闪存编程时需要执行的代码是一个例外,因为闪存 write/erase 操作在 STM32 上使总线停滞很长一段时间。

为了提高性能,最好将其安排为 DMA、指令获取和数据访问大部分都发生在不同的总线上。还请记住,您不能通过 DMA 或位带访问 CCM。因此,CCM 适用于指令或数据(不需要 DMA 或位带访问),但最好不要同时使用。

当 CCM 或 SRAM 用于代码时,您会增加 linker/start-up 将代码放入 RAM 的复杂性,并且可能会因错误代码或安全漏洞而导致代码损坏,而性能优势很少或没有显着优势到片上闪存。任何类型的外部存储器都会明显变慢 - 部分原因是 EMIF 的时钟速率,还因为它是用于所有外部存储器的数据和指令的单一总线。