Answers:
就我所知,THUMB指令从本质上讲并不比ARM指令慢,但是功能上却更为有限。如果您的代码仅需要THUMB指令的功能,则它将比ARM占用更少的空间,但是指令数量相同,并且在其他条件相同的情况下,它们以相同的速度运行。如果您的代码需要更多的功能,则执行所需的THUMB指令要比ARM指令多,并且需要更长的时间(其他情况相同)(请参见下文)
由于较小的指令尺寸,THUMB在微控制器中很受欢迎,原因有二:
出于第二个原因,当您的代码不需要ARM指令集的功能时,THUMB代码实际上运行得更快。这是因为可以在一个I / O周期(而不是两个)中从闪存中获取指令。根据您的Flash接口的速度,第二条读取可能会导致每条指令产生一个或多个等待周期,而您的CPU只是停滞而无法执行任何操作。
如果您可以在执行之前将代码复制到RAM(对于最近的ARM微控制器,我通常将其视为32位),那么这将不再是一个问题,这里唯一需要考虑的是代码密度。为此,许多工具将尝试查找对于给定功能更有效的表示形式。如果编译器可以用较少的指令产生THUMB代码,它将产生结果,但是如果ARM导致较少的指令,您将得到ARM。如果我没记错的话,这是Keil的默认模式。
对于您的特定芯片(AT91SAM7S32),文档提到闪存控制器具有预取缓冲区,该缓冲区可以预测访问以使事情更高效,从而可以改善ARM指令的执行。但是,它还指出,预取是一个“双32位”缓冲区,可以“优化16位访问”,最适合“以Thumb模式运行”,这似乎表明它并非旨在加速ARM指令,但允许您的内核在THUMB模式下运行得更快。
从图中可以看出,芯片上的闪存实际上具有32位数据总线。预取器似乎可以通过读取整个32位,为CPU提供16位(在THUMB模式下)并缓存整个32位来工作。在下一个周期中,当CPU从高速缓存中读取后16位时,闪存控制器将读取后32位并将其进行高速缓存。这样,即使闪存速度比CPU核心速度稍慢,THUMB代码也可以运行而无需等待更多时间。第19.2.2节“读取操作”具有更多详细信息。
由于您的闪存是32位总线(据我所知),如果您的CPU和闪存时钟相同,则THUMB仅会为您提供ARM上的代码密度。如果您希望您的CPU内核比闪存运行更快(请注意,我没有查看该芯片的所有时序;我认为CPU可以运行得更快,因为它们允许您设置等待状态),这要比预取速度要快由于减少了实际的闪存访问,因此THUMB的优势。但是,该速度优势是每条指令的优势。如果THUMB指令与ARM指令的数量足够大,它将超过每个指令的速度,从而导致ARM具有更快的每个例程速度。