|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM处理器运行速度很快,当系统时钟为60Mhz时,一条指令的执行时间只需十几纳秒(ns)。Flash存储器的速度无法满足ARM处理器对指令的需求。ARM通过将内部flash部件的总线宽度扩展成128位宽度,来解决这个问题,虽然Flash的一次读写操作仍要50ns左右,但是一次操作可以获取4条ARM指令(或者八条Thumb指令),平均一条指令只有几十ns,和处理器相当。# Q' p: \! S0 O8 U' u% B$ U& D
$ |) I) B, k: J& ^
用存储器加速模块(MAM)来管理128位宽度的Flash存储器。3 u* u" ^; Q/ l+ g8 Q" r
8 W# A/ H% U4 @, H. z& @
1.MAM结构
: M* ^7 K. [* `+ n8 e i- \% ?6 L0 t3 R g: D- d
Flash存储器被分为两组,每个Flash组包含预取指缓存和分支跟踪缓存。
& y a, z7 S5 S
0 c W) U2 U- d- s2 G! E 预取指缓存区保存有将要执行的指令。而分支跟踪缓存区保存有程序跳转后可能执行到的指令。( C s! H2 j* W; h+ m( l) G
+ X8 G |1 f U+ i f% i 当程序连续执行代码时,通常一个Flash组包含当前正在取指的指令和包含该指令的整个Flash行,而另一个Flash组则包含或正在预取指下一个连续的代码行。
. J. @( k1 o4 {- x! f) U
$ ?. i$ ^* `% j 当程序向前跳转时,尝试从预取指缓存区取指。当程序向后跳转时,尝试从分支跟踪缓存区取指。3 h9 Z; V, @4 ?9 L1 p1 n
如果程序跳转出缓存的范围,CPU将要停止,等待若干个周期,直到正确的指令从Flash中被读出。9 s7 v. V/ [0 y
" f f! t5 G, g$ c, z Flash中除了存储指令之外,还可用来存储不修改或者很少修改的数据,所以在MAM模块中设计有数据缓冲区。数据缓存区可以提高顺序读取数据的操作速度。但是对随机读取操作几乎没有加速效果。
- N+ R$ j9 Y1 K
: x6 a E3 E$ L4 F7 ^! I Flash编程不受存储器加速模块控制,而作为一个独立的功能进行处理。“Boot Block”扇区包含了可被用户程序调用的Flash编程算法(即IAP代码)和一个可对Flash存储器进行串口编程的装载程序(即ISP代码)。+ g# ] ?) a: p9 s
' o1 N/ M5 z& S1 }0 W% k4 P
虽然MAM可以大大提升指令和数据的获取速度,但是系统的功耗也会增加。
: I( h, Y O- }1 ^5 |7 a) @/ H* B! f8 N& y6 c9 p
2.MAM的定值问题4 m. U6 D$ o- Z/ G
; X. w( H9 Z! J; D (1)当改变MAM定时值时,必须先将MAMCR设置为0关闭MAM,然后将新值写入MAMTIM。最后将需要的操作模式的对应值(1或2)写入MAMCR,再次打开MAM;
N& w5 n/ e6 g3 ] }
% v) w- w W5 w, ^& E (2)对于低于20MHz的系统时钟,MAMTIM设定为001,将Flash访问时间设定为1CCLK ;对于20MHz到40MHz之间的系统时钟,建议将Flash访问时间设定为2CCLK;高于40MHz的系统时钟,建议使用3CCLK。依此类推,总之要确保Flash的访问周期不小于50ns,否则会导致操作错误。
9 _- r7 u2 C9 X) H& d; w1 E, n3 N6 @4 z) l4 G P, D. I
对定值的操作C代码如下:
7 ]: p& d8 J: |0 l4 P% |9 B7 t% ?# @$ w/ X) ~
. . .
0 w' ]( i9 u* b0 [ MAMCR = 0;
3 ?7 b# p ^5 H1 {4 a if Fcclk < 20000000
# e. t8 l6 e3 m5 |' j- q6 \, N) N' m MAMTIM = 1;
5 k; l) e6 ]( I0 m. l else
3 d, R" g5 c9 H4 j& Z! j" C& h9 j if Fcclk < 40000000
+ h5 ]/ M+ B6 c3 O6 b0 T6 j MAMTIM = 2;
+ ^3 V, R, q9 A9 Q0 [ else; U6 g% k1 ]6 @) w2 O
MAMTIM = 3;
3 \* J0 C& V5 ]; X* c+ ^5 l+ n9 L MAMCR = 2;" p" {1 |2 f3 Z P' m3 s g
/ R2 [' g6 V; \& p& M" y6 Y. q- e# Z
' Y/ s+ j: c- u7 w1 s5 d" V
MAM的任务就是在一条指令被需要时立刻将下条指令提供给CPU。通常,程序和数据存储器的宽度设计成与处理器字的宽度相同,ARM7系列内核为32位。但为了降低成本,系统经常使用16位宽的存储器和外部存储器,从而造成器件性能的下降。提高系统速度的最好方法就是将Flash存储器加宽到128位。这样,每访问一次存储器就可以提取4条32位的ARM指令或8条16位的Thumb指令。然而,CPU仍然必须等到存储器访问结束后才能提取第一条指令,再无延时地处理紧跟其后的3条(ARM指令)或7条(Thumb)指令。4 P; B8 [" b& F5 n5 a! R
为了消除延时,Flash存储器分成两组,每组的宽度为128位。当128位被读出并缓存到一个flash组时,之前缓存在另一个flash组的指令被执行。由于每个flash组一次能存储几条指令,两个flash组的指令被需要之间存在几个处理器周期的时间。MAM就利用这段时间来将当前未使用的flash组中的128位数据重装到缓冲区(预取指缓冲区)。当从较慢的flash存储器中读取指令时,可以通过这种方法来增加几个等待周期,而不会影响指令的执行时间。
& J6 M, Z5 `0 }* q: |这种简单的预取指方法(见图2)很有用,它使得CPU的执行速度是普通flash最高速度的4倍(只要程序流程中没有跳转指令)。分支、子程序调用和中断有时会中断执行指令行。这时,随着极短的跳转的出现,相关组的预取指缓冲区的内容无效。 3 `' w9 H9 ~" p; M4 i! c. |4 c
& k ]1 m' ~: i; M4 W
程序分支 i4 ^; c8 i! z+ f- B
当目标地址到达第二个组的底部时,已经启动了重装。如果在下个周期内将完成相应flash组的读操作,则可以立刻访问第二个flash组的预取指缓冲区。反之必须增加一个或几个等待周期,直到完成flash的读操作。
* M* U& m3 s) e2 e, B如果程序跳转出预取指缓冲区的范围,CPU停下来执行等待周期,直到数据从“正确”的目标地址复制到缓冲区。只有在这种情况下,相对较长的访问时间生效。然后,下条指令从缓冲区中全速读出,直到下条指令再次碰到中断。- @8 h5 W- K# A# P- k& t
程序也可以往回跳转。程序的循环就是这种情况。通过重复读取flash中的指令可防止循环执行速度的减慢,每个存储器组还另外有一个缓冲区,它存放着执行的最后一条指令。这些分支跟踪缓冲区的宽度也为128位。当一个预取指缓冲区的指令被执行时,另一个组的预取指缓冲区已从flash存储器中装载了新的指令。这时循环指令要执行旧的程序代码,但这些代码已经不在另一个预取指缓冲区中了。但是,旧的程序代码在覆盖之前已被复制到相应的分支跟踪缓冲区,此时恰好可以为程序提供下一条指令(循环)。
& e4 i ^7 b; u' O* n: Q {4 K2 J+ j7 B* q/ M+ O4 P
, y' g9 A3 v9 ~5 \) p) D( e4 o数据区
* c8 b; ~7 W& x GFlash存储器不仅存储程序代码,还可存放不修改或很少修改的数据。这些数据包括常数、表格或文本串。为了存放这类数据,还开辟了一个专门的数据锁存区,这片区域是存储器组的公共部分。当要访问某个地址单元的数据,但数据并不在数据锁存区内时,就触发从flash并行读出下面的4个32位的字。因为只有在每访问完第4个字才能触发一次新的读操作,所以加速了连续访问的速度。但是,如果地址是随机的,则所需数据通常不在数据锁存区内,不能达到加速访问的目的。2 C" E6 s3 y) b/ l9 J+ f3 L$ Z; |
实际flash访问的时间
4 n: u( P! A* c2 W使用了MAM后,ARM内核不是从flash中直接读出指令或数据,而是分别从预取指和分支跟踪缓冲区或数据锁存区中读取指令和数据。将Flash内容装载到缓冲区寄存器的操作与系统时钟同步。时钟频率为20MHz时,数据可从Flash中读出,无需延时。如果系统时钟频率太高,则必须插入等待周期。访问flash时用户可插入的总周期数为1~7个。时钟频率为20MHz时只需要1个周期。时钟频率为40MHz时必须使用2个周期(即要增加1个等待周期)。当时钟频率增加到60MHz时,这也是规定的最高时钟频率,需要3个等待周期。
$ O) Y* n8 @ n+ Y. @; z4 o. k* U: T' d" m: A* E6 }3 e) V" n
MAM的使用: |4 I- K" S# U2 c& l9 y+ f8 r
MAM的作用可通过不同的频率基准测试出来。MAM的作用取决于系统时钟的大小。因为时钟频率为20MHz时在1个周期内就可将Flash的内容读出,因此此时执行的代码是来自RAM还是Flash以及是否使用了MAM都没有任何的不同(图3)。时钟频率越高,RAM的访问时间越短,ARM内核可继续工作在最高性能。当直接执行Flash中的代码时,时钟频率提高到大于20MHz都不会产生明显的影响。只有存储器的访问时间增加了,性能才受到影响。但是使能MAM能显著提高器件的性能,使ARM内核能以最快的速度运行。与理想情况相比较,只有丢失了指令或数据才会造成时间之间的延迟。
- \8 v4 W! j1 J3 J$ @' m一方面,MAM的使用可以显著增强高时钟频率下的特性,另一方面,也可看到由于Flash和缓冲区访问时间的不同带来的影响。为了满足不同的要求,MAM的使用可选择三种不同的等级:8 I: F; U0 `3 K- {' d. Q+ i
1. 不使用MAM
* z* U3 d$ N4 S. w% G: S) f直接对Flash进行访问;插入预先选好的等待周期。这时,处理器的动作是可预知的,但是如果时钟频率太高,性能会受到影响。
+ d0 a- {' _% x9 ^ ?( U a+ k4 N2. MAM部分使能- ]8 u, E+ {, Y
从预取指缓冲区中连续取指,但是即使最短的分支也会启动对Flash的直接访问。为了使得操作可知,所需的数据都存放在Flash而非数据锁存区中。
0 G( v, n) D) ^+ w3. MAM完全使能
. F1 t) F3 E& {5 J所有访问都是对预取指或分支跟踪缓冲区或数据锁存区执行的操作。如果相关的数据未存放在以上的缓冲区内,将直接访问Flash。在高时钟频率下,操作很难预知。% ]8 V; B2 \5 f" a2 U) H
* F( A. v* h, _1 J
7 Z* V, z5 h( N4 I# x5 T* \8 K
# m! g; U: O) Z* C
Flash编程
% }4 m$ c5 c: M$ y+ [0 bMAM不影响Flash的编程。当擦除或擦除一个Flash扇区时,数据分配到任何两个存储器区中的任何一个对用户是完全透明的。Boot block存放着程序和必要的编程算法。这些程序也可被用户程序调用来使能在应用中编程。引导装载程序支持器件的串行编程。) E" C+ p, v5 l# v. K# O# D
复位后,控制权自动转移给引导装载程序。引导装载程序先检查Flash中是否包含有效的用户程序。Flash是否包含有效的用户程序取决于异常向量表(图4)的内容。ARM异常向量表含有一个保留地址0x14。如果该地址包含剩余向量校验和的2的补码,则所有向量的和等于0。只有满足这个准则,引导装载程序才将控制权传递给Flash向量表中的复位向量。9 N q" {2 y) D Y' N
为了防止在编程完一个Flash扇区后以前的数据从MAM缓冲区寄存器中被读出,在编程周期开始时便将所有预取指和分支跟踪缓冲区以及数据锁存区屏蔽。编程后,直接将Flash中的所有数据读出,直到缓冲区用于再次存放有效信息。
8 x% ?" C% I# x
8 H8 p6 q, _4 |* \/ q
6 [4 h& t, _' ^% \4 C+ M由于编程过程中不能对Flash进行访问,因此ARM内核一直处于等待状态,如果看门狗功能使能,用户必须确保等待时间不能超过预先设置的看门狗周期。 |
|