因为嵌入式应用领域的多样性,每一个系统都具有各自的特点。在进行系统程序设计的时候,一定要进行具体分析,充分利用这些特点,扬长避短。
结合ARM架构本身的一些特点,在这里讨论几个常见的要点。
1.ARM 还是 Thumb?
在讨论 ARM 还是 Thumb 之前,先说明 ARM 内核型号和 ARM 结构体系之间的区别和联系。
如图-1所示,ARM 的结构体系主要从版本 4 开始,发展到了现在的版本 6,结构体系的变化,对程序员而言最直接的影响就是指令集的变化。结构体系的演变意味着指令集的不断扩展,值得庆幸的是 ARM 结构体系的发展一直保持了向上兼容,不会造成老版本程序在新结构体系上的不兼容。
图-1 ARM 结构体系和处理器家族的演变发展
在图中的横坐标上,显示了每一个体系结构上都含有众多的处理器型号,这是在同一体系结构下根据硬件配置和存储器系统的不同而作的进一步细分。 需要注意的是通常我们用来区分 ARM 处理器家族的 ARM7、ARM9 或 ARM10,可能跨越不同的体系结构。
在ARM的体系结构版本4与5中, 还可以再细分出几个小的扩展版本: V4T、V5TE和V5TEJ,其区别如图-2中所示,这些后缀名也反映在各自拥有的处理器型号上面,可以进行直观的分辨。V6 结构体系因为包含了以前版本的所有特性,所以不需要再进行分类。
图-2 结构体系特征
上面介绍了整个 ARM 处理器家族的分布,主要是说明在一个特定的平台上编写程序的时候,一定要先弄清楚目标的特性和一些细微的差别,特别是需要具体优化特征的时候。
从 ARM 体系结构 V4T 以后,最大的变化是增加了一套 16 位的指令集——Thumb。到底在一个具体应用中要否采用 Thumb呢?首先我们来分析一下 ARM和 Thumb 各自的特点和优势。先看下面一张性能分析图:
图-3 ARM 和 Thumb指令集的比较
图中的纵坐标是测试向量 Dhrystone 在 20MHz 频率下运行 1 秒钟的结果, 其值越大表明性能越好;横坐标是系统存储器系统的数据总线宽度。结果表明:
(a) 当系统具有32 位的数据总线宽度时,ARM 比 Thumb有更好的性能表现。
(b) 当系统的数据总线宽度小于32 位时,Thumb比 ARM 的性能更好。
由此可见, 并不是32位的ARM指令集性能一定强于16位的Thumb指令集,要具体情况具体分析。考察个中的原因,其实不难发现,因为当在一个 16 位存储器系统里面取1 条 32位指令的时候,需要耗费2 个存储器访问周期;比之 32位的系统,其速度正好大概下降一半左右。而 16 位指令在 32 位存储器系统或16 位存储器系统里的表现基本相同。正是存储器造成的系统瓶颈导致了这个有趣的差别。
除了在窄带宽系统里面的性能优势外, Thumb 指令的另外一个好处是代码尺寸。同样一段 C 代码,用 Thumb 指令编译的结果,其长度大约只占 ARM 编译结果的 65%左右,可以明显地节省存储器空间。在大多数情况下,紧凑的代码和窄带宽的存储器系统,还会带来功耗上的优势。
当然,如果在 32 位的系统上面,并且对系统性能要求很高的情况下,ARM是一个更好的选择。毕竟在这种情况下,只有 32 位的指令集才能完全发挥 32位处理器的优势来。
因此,选择 ARM 还是 Thumb,需要从存储器开销和性能要求两方面加以权衡考虑。