我目前正在玩STM32F303xx系列的芯片。它们的特点是核心耦合存储器(CCMRAM),它允许执行代码,不像在F4系列中发现的CCM。我已经把关键的例程(例如ISR)放入CCM中,并想知道什么是最有效的设置,将中断向量表也放入CCM或正常的SRAM中,并且有点卡在那个SRAM中。有人能告诉我正确的方向吗?
发布于 2018-10-04 12:56:33
我不确定它是否直接影响代码执行性能,但关键是总线体系结构,以及您将数据和代码放置在何处,以及您是在执行DMA操作,还是要写入闪存。
闪存、SRAM和CCM分别位于一个单独的总线上,在许多STM32部件上都是SRAM,对于较大的部分,闪存被进一步划分为多个总线。因此,当从一个代码执行时,可以从另一个代码中并发地获取数据。但是,如果将数据和指令放在相同的内存中,则必须序列化指令和数据访问。同样,如果您对内存有DMA操作,这也会影响数据访问和从同一内存获取指令。
在大多数情况下,由于闪存加速器的原因,芯片上的闪存在STM32上执行代码的延迟很小或根本没有延迟,所以在CCM中放置代码可能没有什么好处。在编程闪存时需要执行的代码是一个例外,因为flash写/擦除操作使总线在STM32上停顿了相当长的时间。
为了提高性能,最好将其安排为DMA、取指令和数据访问,它们大部分都发生在不同的总线上。请记住,您不能DMA或位带访问CCM.因此,CCM对指令或数据(在不需要DMA或比特带访问的情况下)很好,但理想情况下,两者不能同时进行。
当CCM或SRAM被用于代码时,您就有了在RAM中放置代码的额外链接器/启动复杂性,以及由于代码错误或安全缺陷而导致代码损坏的可能性,与片上闪存相比几乎没有或没有显著的性能效益。任何类型的外部内存都要慢得多--部分原因是EMIF的时钟速率,也是因为它是所有外部存储器的数据和指令的一条总线。
https://stackoverflow.com/questions/52645291
复制相似问题