第5章存储器加速模块

5.1简介

当LPC1700系列Cortex-M3微控制器从Flash运行程序代码时,存储器加速模块的设计极大地提高了处理器性能,同时也节省了整个系统功率。存储器加速模块还改进了访问Flash存储器数据的速度和功率。你知道吗?Flash存储器的简介可以为你提供更多相关信息!

5.2操作

存储器加速模块将需要的下一个Cortex-M3指令及时锁存以防止CPU取指暂停。LPC1700系列Cortex-M3微控制器只使用一组Flash存储器。存储器加速模块组中含有8个128位的缓冲区,以可配置的方式用于存放指令和数据。要了解更多关于Flash存储器的技术细节,不妨看看Flash存储器的编程三

缓冲区数组中的每一个128位值包含4条32位指令、8条16位指令或两种指令的某些组合。在连续执行代码的过程中,缓冲区通常包含着当前的指令和当前指令的整个Flash行,或包含之前请求地址的一个Flash数据行。缓冲区根据它们所用作的用途(如指令缓冲区或数据缓冲区)和它们完成访问的时间来进行标记。该信息用于实现缓冲区替换策略。

Cortex-M3在代码存储器空间为指令访问(ICode)和数据访问(DCode)提供了单独的总线。这些总线和通用DMA控制器的主机端口,均由AHB多层矩阵进行仲裁。任何对Flash存储器地址空间的访问都会反映到存储器加速模块中。如果同时对CPU发出Flash指令取指和Flash数据访问请求时,多层矩阵会令数据访问占据优先权。这是因为暂停数据访问总是会减慢执行速度,而暂停指令取指通常则不会减慢系统执行速度。当Flash数据访问完成时,任何之前早已在处理的Flash取指或预取指都要重新启动。关于存储器加速模块更多的操作细节,可以参考flash存储器模块

Flash读操作和某些其它方面的存储器加速模块操作的时间是可编程的,这在本章节的后面进行描述。分支和其它程序流的变化会导致前面所讲述的连续指令取指出现中断。存储器加速模块中的缓冲区替换策略尽量保留可重新使用的信息,直至信息再次被使用。如果在不使用正常Flash编程接口(通过Boot ROM函数调用)的情况下而直接写Flash存储器时,存储器加速模块会产生一个数据中止信号。如果指令取指不符合缓冲区数组的现存内容要求,或该Flash行的预取指的指令还没有启动时,CPU会暂停执行,而此时相关的128位Flash行的取指将会启动。如果预取指已启动但仍未结束时,CPU暂停的时间会更短,因为所要求的Flash访问已在处理当中。想知道Flash存储器与EEPROM的区别?FLASH存储器和EEPROM存储器的区别这篇文章一定会让你茅塞顿开!

通常,只要对预取指的地址进行访问,或对其后继地址也不在另一个缓冲区的缓冲区进行访问时,Flash预取指开始。为了小化CPU暂停时间,可执行数据访问来中止正在进行中的预取指操作。虽然预取指Flash行由Flash存储器锁存,但是直到CPU执行到预取指Flash行所包含的地址时,存储器加速模块才会捕获该缓冲区的行。如果内核需要的指令地址既不在缓冲区、也不在预取指的Flash行中,那么预取指令行将被丢弃。某些特别情况存在这种可能性:CPU会请求对已包含在指令缓冲区的地址进行数据访问,数据将直接被从缓冲区中读出,就好象指令缓冲区是一个数据缓冲区。相反,当CPU请求的指令地址位于现存的数据缓冲区时,则可对数据缓冲区应用该指令,且能将该数据缓冲区改变为指令缓冲区。这就使得可在存储器加速模块作出下一次要覆写哪一个缓冲区的决定时能对缓冲区作出不同的处理。如果对存储器的未来演进感兴趣,Flash存储器:技术演进与发展将为你揭开迷雾。