打印
[ZLG-ARM]

ARM7 内核高速度下的真实性能分析(转)

[复制链接]
2111|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
amazelove|  楼主 | 2009-3-1 19:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当有些厂家的 ARM7 内核可以跑到75MHz 的时候,这种高速度真的让人很兴奋:32bit 的 MCU 价钱仅仅在 25 元*币左右,集成了各种外设的整体性能却直逼当年的 80486 PC 整机,让人感慨万千。

但是,在高速的背后,却有些鲜为人知的细节。在看完厂家的产品说明书后,有人不禁产生了一个疑问:集成的 MCU 真的可以跑这么快吗?那些存储器的等待周期怎么来理解呢?

----------------------------------------------------------------------------------------------------------------------------------------

在 75MHz 下,ARM7 的指令周期为 13.333ns,即 CPU 内核每 13.333ns 内必须要取到一条指令数据并且还要执行完它,这就可以估计出,存储器的访问周期大约是 6~8 个纳秒左右。这样的话,对存储器的要求是非常高的,代价也是高昂的,更要命的是: 由于 FLASH 存储器的生产工艺限制,无法达到这么快的速度!怎么办?

为了解决这个问题,ARM内核使用流水线架构,使用并行技术。例如:在执行一条指令的同时,又取出下一条指令的数据,让指令数据在执行它之前就准备好。如此一来,对存储器的速度要求就降低很多,按照上面的 75MHz 来说,存储器的访问周期只要达到 13.333ns 就够了。

对于 SRAM 存储器来说,达到这个要求一点也不困难,但是它的工艺复杂,成本相当高,而且一断电就会丢失数据,所以 MCU 内的 SRAM 容量总是很小的,大多数只用来存储变量数据和提供给堆栈来使用。MCU 内又集成了不怕断电,成本又低的 FLASH 存储器,来存放程序代码。但是 FLASH 存储器是无法达到这个苛刻的速度要求的,它就是以最快的速度来运作,访问周期大约也只能勉强提升到 30 ~ 40 多纳秒左右。如此一来,集成了 FLASH 存储器的 ARM 内核想要全速跑代码还是存在问题,如何解决呢?

各厂家不约而同地使用了一个最简易的办法 : 拓展数据线宽度。就是将 FLASH 存储器的数据线拓宽到 128bit 甚至 256bit 。这样的话,在 FLASH 存储器一个访问周期内,MCU 利用总线管理器可以读取 16 个字节或 32 字节(即 4 条或 8 条 ARM 指令)的代码数据供给 ARM 内核执行。因此,ARM 内核在执行这几条指令的期间,总线管理器可以让FLASH 存储器从容地用一个存储器周期提供下 4 条或 8 条指令数据,如此下去,似乎 ARM 内核就可以全速跑 FLASH 中的代码了。

这是个很巧妙的方法,但不是完美的,因为这种假设 CPU 代码一路跑下去不拐弯的情况在现实中是不存在的。各种分支、跳转、调用等意外情况将会使代码执行顺序被打乱,不能就指望一条一条的代码会安排的整整齐齐一直顺利执行下去。

一旦出现这种情况,总线管理器在 FLASH 的本次访问周期内提供的几条指令数据就作废了。为了获得正确的下一条指令代码,总线管理器要重新访问 FLASH 存储器的新地址。但是,由于 FLASH 本身速度的问题,无法及时提供指令数据,此时总线管理器会强制 ARM 内核处于等待状态,直到 FLASH 存储器完成其一个完整的访问周期,其中的指令数据被正确读取出来后,总线管理器才会恢复 ARM 内核的运作,并提供新的代码数据给内核执行,这就表示本来可以跑 3~4 条指令的时间,内核却是被强制暂停的,时间被浪费掉了,这就是存储器访问等待周期的由来。

假设一种极端情况:FLASH 存储器中的每条正常指令后面都是一条跳转指令,那么内核在每执行一条指令后,就会处于等待状态大约有 3~4 指令的执行时间。估计一下,内核此时的执行速度仅仅是全速的 1/3 或 1/4 左右。如果按照主频 75MHz 来算,此时的运作效率大概和全速 20MHz 的内核相当。呵呵,很尴尬的结果,是不是?

上面假设的极端情况是极其难遇的,但是:用 C 语言写出来软件编译后,在 10 ~ 20 条指令里面就有一条跳转的可能性是极高的!照此来估算的话,内核的运作速度会比全速的效率低 1/10 至 1/5 左右。 按照 75MHz 的内核工作频率来算,它可能仅仅只能跑到 60MHz 左右。假如软件中采用了大量的 32bit 整型常数的话,效果和上述极端的情况是一样的:即为了获取当前 FLASH 访问周期内没有的数据,总线管理器必须抛弃当前的代码数据,并重新启动一次访问周期来读去整型常数数据,然后再重新启动一次访问周期来获得刚才被抛弃的、却又要需要继续执行的代码。

由此可以看出,软件编写的好坏对 ARM7 内核的运行效率影响是多么的巨大!

 从一些厂家使用了 ARM7 MCU 为主控制器的产品来分析,许多需要高速运行和需要明确指令周期的代码段被重新加载到 MCU 中的 SRAM 中来运行,SRAM 存储器可以达到单周期访问,即完全配合了 ARM7 内核的高速度来全速运行。而在更高级的 ARM 内核中,采用了 Cache 存储器,尽可能地避免上述的低效的、却又很无奈的行为。

由此看来,仅仅看 ARM7 的内核标称运行速度来判断你的代码能跑多快是不正确的。你需要分析很多综合性的情况才能大概地了解自己写的代码可以大概跑到什么速度。想要再提高,呵呵!努力吧,好好整理自己的软件架构,来配合以 ARM7 为内核的 MCU,这样也许可以达到你的期望值哦!

----------------------------------------------------------------------------------------------------------------------------------------

本文是在我仔细研究了某 (CORTEX M3) - 32-bit Microcontrollers  后有感而发的。看了厂家的宣传是很让人兴奋,但是,仔细想想后就发现上述的问题。虽然它的指令集号称执行效率提升到了1.25 DMIPS/MHz ,但这是仅仅纯粹的内核比较。集成到 MCU 中,就遇到了 FLASH 存储器的速度问题,而它的 FLASH 存储器数据宽度是 64bit,每次就是读取 4 条连续的指令数据。

ARM7 可以将代码加载到 SRAM 中来全速执行,但是 CORTEX M3却使用了一个不同的架构,即代码和数据分离架构,类似8051。虽然极大地降低了成本,却带来了不能逾越的鸿沟:代码无法加载到 SRAM 中全速运行。而单片机中常用的软件结构:子程序的入口表,划分了很多细小的功能实现代码段,既要查表来获取入口地址常数、又要跳转执行,这在 STM32 系列单片机的 FLASH 中会严重拖慢内核的执行效率。所以,这个标称的高速是要打很多折扣的。还有浮点运算如果也是利用查表法在 FLASH 中搜索的话,运行效率就可想而知了。除非哪天 STM32 在指令段也加入全速的 SRAM ,呵呵!这还有可能全速跑代码。

因此,同频率的 ARM7 内核的 MCU 和 某(CORTEX M3) - 32-bit Microcontrollers     进行执行速度比赛的话,ARM7 内核的MCU 远远胜出。而不是那种:广告上猛眼一看,似乎 某(CORTEX M3) - 32-bit Microcontrollers   更加优胜的结果。但是从性价比来说,ARM7 就不行了。(CORTEX M3) - 32-bit Microcontrollers  简单的架构很合适低成本的产品,代替 8051 是迟早的事情。

本人是看不惯厂家的广告中,有浑水摸鱼的感觉,特在此撰文一述,欢迎大家指正。
原文地址:http://home.**/?uid-43048-action-viewspace-itemid-334 

相关帖子

沙发
lianshumou| | 2009-3-4 15:49 | 只看该作者

无聊! 虽然存在你说的这些问题,但远没有你这么严重!

不要什么某(CORTEX M3),你都已说出来是STM32了!
我实际用的结果, 同频下比你传说中的ARM7快,

使用特权

评论回复
板凳
wlq_9| | 2009-3-4 16:02 | 只看该作者

LZ

没想过ARM7也是有这种问题的,根源是便宜的FLASH速度上不去!
ARM7也好,cortexM3也好,都有这问题.而解决这个问题的方法,各个厂家有不同的方法.运行速度LZ竟然用ARM7在SRAM运行和cortexM3在FLASH下运行来比较,我服了!
要比就两个都在FLASH下比较,这样更有实际意义.
更实际的是,cortexM3并不比ARM7高多少,只是稍微好一点而也.要想速度有质的飞跃,可以考虑ARM9/11.

使用特权

评论回复
地板
ZLG_Dengz| | 2009-3-4 19:19 | 只看该作者

RE

呵呵,以个人的名义顶一下哈. 不为别的,只为楼主的探索精神.

使用特权

评论回复
5
ijk| | 2009-3-5 14:59 | 只看该作者

Cortex-m0是谁的终结者?

  Cortex-m3是ARM7的终结者!这一点我比较相信。
  但Cortex-m0是谁的终结者?这倒是值得讨论一下。Cortex-m0会终结16位单片机,还是中端到高端的51?

使用特权

评论回复
6
zlgmcu| | 2009-3-6 11:05 | 只看该作者

Cortex-M0会进一步挤占8位和16位MCU市场

Cortex-M0在二进制和开发工具上兼容Cortex-M3,好像是从Cortex-M3改进而来的,速度虽然会慢一些,但结构更加轻巧,由此带来功耗和成本的大幅下降。

我认为将来基于Cortex-M0的MCU主流工作频率一般不会超过50MHz,而价格会做到5~7个RMB。

===============================================================================

ARM公司近期发布Cortex-M0内核,号称能耗最低,NXP已取得授权

21IC新闻报道:能耗最低的Cortex-M0处理器(ARM)
http://www.21ic.com/np/embed/200902/32705.htm

ARM官方网站:Cortex-M0
http://www.arm.com/products/CPUs/ARM-Cortex-M0.html

Cortex-M0内核的巨大优势:
● 兼容性好:开发工具和二进制跟Cortex-M3兼容
● 结构简化:仅12K逻辑门,比Cortex-M3还少
● 功耗极低:达到85微瓦/MHz
● 成本低廉:硅片面积更小,批量制造更有优势
● 性能很高:仅比Cortex-M3略低,达到0.9DMIPS/MHz

Cortex-M0内核会进一步侵蚀8位/16位MCU市场。NXP已获得ARM公司的Cortex-M0授权,产品将划归到LPC1000系列里面,我们ZLGMCU未来理所当然地会代理该产品线。

使用特权

评论回复
7
machunshui| | 2009-3-6 14:00 | 只看该作者

楼主分析的不错

楼主分析的不错

使用特权

评论回复
8
machunshui| | 2009-3-6 14:09 | 只看该作者

不过不是说CM3有分支预测功能吗?

不过不是说CM3有分支预测功能吗?

不知效能如何?

使用特权

评论回复
9
老狼| | 2009-3-7 02:39 | 只看该作者

楼主的评价不公正呀!

1:STM32的程序可以在RAM中运行!
2:如果要想最求速度,坚决不能在没有浮点的处理器中运行浮点程序。
3:STM32的很多指标写的都很真实,貌似楼主很关心运行速度,楼主可以看一下stm32的DSPlib,里面的指标都是真实的,建议兄弟弄块板子,实际跑一下,纸上谈兵意义不大!
4:浮点运算如果也是利用查表法在 FLASH 中搜索?这种查表法很落伍了,哈哈,改进方法你考虑一下。。。。,例如,如何建立高效三角函数表?
5:任何一种CPU,如果应用不当,性能都发挥不出来。这个需要和你的实际应用,软硬件相结合,STM32的 定时器,多DMA,uart,高速AD,用起来,还是很得心应手的。
6:任何一种CPU,软件要想效率高,必须嵌入汇编编程。
7:STM的库写的太一般了,唉!水平有待提高!总有一种感觉,像是做PC机开发的一帮人写的,没有章法,根据实际应用,自己改吧。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

36

帖子

0

粉丝