我目前正在使用STM32F303xx系列芯片。它们具有核心耦合内存(CCMRAM),与F4系列上的CCM不同,它允许执行代码。我已将关键例程(例如ISR)放入CCM,并且想知道哪种方法最有效,将中断向量表也放入CCM或普通SRAM中,并卡在该例程中。有人可以向我暗示正确的方向吗?
最佳答案
我不确定这是否直接影响代码执行性能,但关键是总线体系结构,数据和代码的放置位置,是否正在执行DMA操作或将要写入闪存。
闪存,SRAM和CCM分别位于单独的总线上,在SRAM的许多STM32部分上,对于较大的部分,闪存进一步分为多个总线。因此,当从一个执行代码时,可以从另一个同时获取数据。但是,如果将数据和指令放置在同一存储器中,则必须对指令和数据访问进行序列化。同样,如果您有往返于内存的DMA操作,这也可能影响从同一内存进行的数据访问和指令提取。
在大多数情况下,由于闪存加速器的缘故,STM32上的片上闪存执行代码的延迟很少或没有,因此根本没有从CCM中放置代码的 yield 。编程闪存时需要执行的代码是一个异常(exception),因为闪存写/擦除操作使总线在STM32上停滞了很长时间。
为了提高性能,最好将其安排为使DMA,指令提取和数据访问大部分都发生在单独的总线上。还请记住,您不能通过DMA或位带访问CCM。因此,CCM适用于指令或数据(不需要DMA或位带访问),但理想情况下不能同时使用两者。
当使用CCM或SRAM进行代码编写时,您将把代码放入RAM的链接器/启动复杂性增加了,并且由于错误代码或安全漏洞而导致代码损坏的可能性与片上闪存相比几乎没有或没有明显的性能优势。 。任何形式的外部存储器都将显着变慢-部分原因是EMIF的时钟速率,而且还因为它是所有外部存储器的数据和指令总线。