MAM的任务就是在一条指令被需要时立刻将下条指令提供给CPU。通常,程序和数据存储器的宽度设计成与处理器字的宽度相同,ARM7系列内核为32位。但为了降低成本,系统经常使用16位宽的存储器和外部存储器,从而造成器件性能的下降。提高系统速度的最好方法就是将Flash存储器加宽到128位。这样,每访问一次存储器就可以提取4条32位的ARM指令或8条16位的Thumb指令。然而,CPU仍然必须等到存储器访问结束后才能提取第一条指令,再无延时地处理紧跟其后的3条(ARM指令)或7条(Thumb)指令。
为了消除延时,Flash存储器分成两组,每组的宽度为128位。当128位被读出并缓存到一个flash组时,之前缓存在另一个flash组的指令被执行。由于每个flash组一次能存储几条指令,两个flash组的指令被需要之间存在几个处理器周期的时间。MAM就利用这段时间来将当前未使用的flash组中的128位数据重装到缓冲区(预取指缓冲区)。当从较慢的flash存储器中读取指令时,可以通过这种方法来增加几个等待周期,而不会影响指令的执行时间。
这种简单的预取指方法(见图2)很有用,它使得CPU的执行速度是普通flash最高速度的4倍(只要程序流程中没有跳转指令)。分支、子程序调用和中断有时会中断执行指令行。这时,随着极短的跳转的出现,相关组的预取指缓冲区的内容无效。
程序分支
当目标地址到达第二个组的底部时,已经启动了重装。如果在下个周期内将完成相应flash组的读操作,则可以立刻访问第二个flash组的预取指缓冲区。反之必须增加一个或几个等待周期,直到完成flash的读操作。
如果程序跳转出预取指缓冲区的范围,CPU停下来执行等待周期,直到数据从“正确”的目标地址复制到缓冲区。只有在这种情况下,相对较长的访问时间生效。然后,下条指令从缓冲区中全速读出,直到下条指令再次碰到中断。
程序也可以往回跳转。程序的循环就是这种情况。通过重复读取flash中的指令可防止循环执行速度的减慢,每个存储器组还另外有一个缓冲区,它存放着执行的最后一条指令。这些分支跟踪缓冲区的宽度也为128位。当一个预取指缓冲区的指令被执行时,另一个组的预取指缓冲区已从flash存储器中装载了新的指令。这时循环指令要执行旧的程序代码,但这些代码已经不在另一个预取指缓冲区中了。但是,旧的程序代码在覆盖之前已被复制到相应的分支跟踪缓冲区,此时恰好可以为程序提供下一条指令(循环)。
数据区
Flash存储器不仅存储程序代码,还可存放不修改或很少修改的数据。这些数据包括常数、表格或文本串。为了存放这类数据,还开辟了一个专门的数据锁存区,这片区域是存储器组的公共部分。当要访问某个地址单元的数据,但数据并不在数据锁存区内时,就触发从flash并行读出下面的4个32位的字。因为只有在每访问完第4个字才能触发一次新的读操作,所以加速了连续访问的速度。但是,如果地址是随机的,则所需数据通常不在数据锁存区内,不能达到加速访问的目的。
实际flash访问的时间
使用了MAM后,ARM内核不是从flash中直接读出指令或数据,而是分别从预取指和分支跟踪缓冲区或数据锁存区中读取指令和数据。将Flash内容装载到缓冲区寄存器的操作与系统时钟同步。时钟频率为20MHz时,数据可从Flash中读出,无需延时。如果系统时钟频率太高,则必须插入等待周期。访问flash时用户可插入的总周期数为1~7个。时钟频率为20MHz时只需要1个周期。时钟频率为40MHz时必须使用2个周期(即要增加1个等待周期)。当时钟频率增加到60MHz时,这也是规定的最高时钟频率,需要3个等待周期。
MAM的使用
MAM的作用可通过不同的频率基准测试出来。MAM的作用取决于系统时钟的大小。因为时钟频率为20MHz时在1个周期内就可将Flash的内容读出,因此此时执行的代码是来自RAM还是Flash以及是否使用了MAM都没有任何的不同(图3)。时钟频率越高,RAM的访问时间越短,ARM内核可继续工作在最高性能。当直接执行Flash中的代码时,时钟频率提高到大于20MHz都不会产生明显的影响。只有存储器的访问时间增加了,性能才受到影响。但是使能MAM能显著提高器件的性能,使ARM内核能以最快的速度运行。与理想情况相比较,只有丢失了指令或数据才会造成时间之间的延迟。
一方面,MAM的使用可以显著增强高时钟频率下的特性,另一方面,也可看到由于Flash和缓冲区访问时间的不同带来的影响。为了满足不同的要求,MAM的使用可选择三种不同的等级:
1.不使用MAM
直接对Flash进行访问;插入预先选好的等待周期。这时,处理器的动作是可预知的,但是如果时钟频率太高,性能会受到影响。
2.MAM部分使能
从预取指缓冲区中连续取指,但是即使最短的分支也会启动对Flash的直接访问。为了使得操作可知,所需的数据都存放在Flash而非数据锁存区中。
3.MAM完全使能
所有访问都是对预取指或分支跟踪缓冲区或数据锁存区执行的操作。如果相关的数据未存放在以上的缓冲区内,将直接访问Flash。在高时钟频率下,操作很难预知。
Flash编程
MAM不影响Flash的编程。当擦除或擦除一个Flash扇区时,数据分配到任何两个存储器区中的任何一个对用户是完全透明的。Bootblock存放着程序和必要的编程算法。这些程序也可被用户程序调用来使能在应用中编程。引导装载程序支持器件的串行编程。
复位后,控制权自动转移给引导装载程序。引导装载程序先检查Flash中是否包含有效的用户程序。Flash是否包含有效的用户程序取决于异常向量表(图4)的内容。ARM异常向量表含有一个保留地址0x14。如果该地址包含剩余向量校验和的2的补码,则所有向量的和等于0。只有满足这个准则,引导装载程序才将控制权传递给Flash向量表中的复位向量。
为了防止在编程完一个Flash扇区后以前的数据从MAM缓冲区寄存器中被读出,在编程周期开始时便将所有预取指和分支跟踪缓冲区以及数据锁存区屏蔽。编程后,直接将Flash中的所有数据读出,直到缓冲区用于再次存放有效信息。
由于编程过程中不能对Flash进行访问,因此ARM内核一直处于等待状态,如果看门狗功能使能,用户必须确保等待时间不能超过预先设置的看门狗周期。