[ZLG-ARM] ARM7 内核高速度下的真实性能分析(转)

[复制链接]
3226|8
 楼主| amazelove 发表于 2009-3-1 19:01 | 显示全部楼层 |阅读模式
当有些厂家的&nbsp;ARM7&nbsp;内核可以跑到75MHz&nbsp;的时候,这种高速度真的让人很兴奋:32bit&nbsp;的&nbsp;MCU&nbsp;价钱仅仅在&nbsp;25&nbsp;元*币左右,集成了各种外设的整体性能却直逼当年的&nbsp;80486&nbsp;PC&nbsp;整机,让人感慨万千。<br /><br />但是,在高速的背后,却有些鲜为人知的细节。在看完厂家的产品说明书后,有人不禁产生了一个疑问:集成的&nbsp;MCU&nbsp;真的可以跑这么快吗?那些存储器的等待周期怎么来理解呢?<br /><br />----------------------------------------------------------------------------------------------------------------------------------------<br /><br />在&nbsp;75MHz&nbsp;下,ARM7&nbsp;的指令周期为&nbsp;13.333ns,即&nbsp;CPU&nbsp;内核每&nbsp;13.333ns&nbsp;内必须要取到一条指令数据并且还要执行完它,这就可以估计出,存储器的访问周期大约是&nbsp;6~8&nbsp;个纳秒左右。这样的话,对存储器的要求是非常高的,代价也是高昂的,更要命的是:&nbsp;由于&nbsp;FLASH&nbsp;存储器的生产工艺限制,无法达到这么快的速度!怎么办?<br /><br />为了解决这个问题,ARM内核使用流水线架构,使用并行技术。例如:在执行一条指令的同时,又取出下一条指令的数据,让指令数据在执行它之前就准备好。如此一来,对存储器的速度要求就降低很多,按照上面的&nbsp;75MHz&nbsp;来说,存储器的访问周期只要达到&nbsp;13.333ns&nbsp;就够了。<br /><br />对于&nbsp;SRAM&nbsp;存储器来说,达到这个要求一点也不困难,但是它的工艺复杂,成本相当高,而且一断电就会丢失数据,所以&nbsp;MCU&nbsp;内的&nbsp;SRAM&nbsp;容量总是很小的,大多数只用来存储变量数据和提供给堆栈来使用。MCU&nbsp;内又集成了不怕断电,成本又低的&nbsp;FLASH&nbsp;存储器,来存放程序代码。但是&nbsp;FLASH&nbsp;存储器是无法达到这个苛刻的速度要求的,它就是以最快的速度来运作,访问周期大约也只能勉强提升到&nbsp;30&nbsp;~&nbsp;40&nbsp;多纳秒左右。如此一来,集成了&nbsp;FLASH&nbsp;存储器的&nbsp;ARM&nbsp;内核想要全速跑代码还是存在问题,如何解决呢?<br /><br />各厂家不约而同地使用了一个最简易的办法&nbsp;:&nbsp;拓展数据线宽度。就是将&nbsp;FLASH&nbsp;存储器的数据线拓宽到&nbsp;128bit&nbsp;甚至&nbsp;256bit&nbsp;。这样的话,在&nbsp;FLASH&nbsp;存储器一个访问周期内,MCU&nbsp;利用总线管理器可以读取&nbsp;16&nbsp;个字节或&nbsp;32&nbsp;字节(即&nbsp;4&nbsp;条或&nbsp;8&nbsp;条&nbsp;ARM&nbsp;指令)的代码数据供给&nbsp;ARM&nbsp;内核执行。因此,ARM&nbsp;内核在执行这几条指令的期间,总线管理器可以让FLASH&nbsp;存储器从容地用一个存储器周期提供下&nbsp;4&nbsp;条或&nbsp;8&nbsp;条指令数据,如此下去,似乎&nbsp;ARM&nbsp;内核就可以全速跑&nbsp;FLASH&nbsp;中的代码了。<br /><br />这是个很巧妙的方法,但不是完美的,因为这种假设&nbsp;CPU&nbsp;代码一路跑下去不拐弯的情况在现实中是不存在的。各种分支、跳转、调用等意外情况将会使代码执行顺序被打乱,不能就指望一条一条的代码会安排的整整齐齐一直顺利执行下去。<br /><br />一旦出现这种情况,总线管理器在&nbsp;FLASH&nbsp;的本次访问周期内提供的几条指令数据就作废了。为了获得正确的下一条指令代码,总线管理器要重新访问&nbsp;FLASH&nbsp;存储器的新地址。但是,由于&nbsp;FLASH&nbsp;本身速度的问题,无法及时提供指令数据,此时总线管理器会强制&nbsp;ARM&nbsp;内核处于等待状态,直到&nbsp;FLASH&nbsp;存储器完成其一个完整的访问周期,其中的指令数据被正确读取出来后,总线管理器才会恢复&nbsp;ARM&nbsp;内核的运作,并提供新的代码数据给内核执行,这就表示本来可以跑&nbsp;3~4&nbsp;条指令的时间,内核却是被强制暂停的,时间被浪费掉了,这就是存储器访问等待周期的由来。<br /><br />假设一种极端情况:FLASH&nbsp;存储器中的每条正常指令后面都是一条跳转指令,那么内核在每执行一条指令后,就会处于等待状态大约有&nbsp;3~4&nbsp;指令的执行时间。估计一下,内核此时的执行速度仅仅是全速的&nbsp;1/3&nbsp;或&nbsp;1/4&nbsp;左右。如果按照主频&nbsp;75MHz&nbsp;来算,此时的运作效率大概和全速&nbsp;20MHz&nbsp;的内核相当。呵呵,很尴尬的结果,是不是?<br /><br />上面假设的极端情况是极其难遇的,但是:用&nbsp;C&nbsp;语言写出来软件编译后,在&nbsp;10&nbsp;~&nbsp;20&nbsp;条指令里面就有一条跳转的可能性是极高的!照此来估算的话,内核的运作速度会比全速的效率低&nbsp;1/10&nbsp;至&nbsp;1/5&nbsp;左右。&nbsp;按照&nbsp;75MHz&nbsp;的内核工作频率来算,它可能仅仅只能跑到&nbsp;60MHz&nbsp;左右。假如软件中采用了大量的&nbsp;32bit&nbsp;整型常数的话,效果和上述极端的情况是一样的:即为了获取当前&nbsp;FLASH&nbsp;访问周期内没有的数据,总线管理器必须抛弃当前的代码数据,并重新启动一次访问周期来读去整型常数数据,然后再重新启动一次访问周期来获得刚才被抛弃的、却又要需要继续执行的代码。<br /><br />由此可以看出,软件编写的好坏对&nbsp;ARM7&nbsp;内核的运行效率影响是多么的巨大!<br /><br />&nbsp;从一些厂家使用了&nbsp;ARM7&nbsp;MCU&nbsp;为主控制器的产品来分析,许多需要高速运行和需要明确指令周期的代码段被重新加载到&nbsp;MCU&nbsp;中的&nbsp;SRAM&nbsp;中来运行,SRAM&nbsp;存储器可以达到单周期访问,即完全配合了&nbsp;ARM7&nbsp;内核的高速度来全速运行。而在更高级的&nbsp;ARM&nbsp;内核中,采用了&nbsp;Cache&nbsp;存储器,尽可能地避免上述的低效的、却又很无奈的行为。<br /><br />由此看来,仅仅看&nbsp;ARM7&nbsp;的内核标称运行速度来判断你的代码能跑多快是不正确的。你需要分析很多综合性的情况才能大概地了解自己写的代码可以大概跑到什么速度。想要再提高,呵呵!努力吧,好好整理自己的软件架构,来配合以&nbsp;ARM7&nbsp;为内核的&nbsp;MCU,这样也许可以达到你的期望值哦!<br /><br />----------------------------------------------------------------------------------------------------------------------------------------<br /><br />本文是在我仔细研究了某&nbsp;(CORTEX&nbsp;M3)&nbsp;-&nbsp;32-bit&nbsp;Microcontrollers&nbsp;&nbsp;后有感而发的。看了厂家的宣传是很让人兴奋,但是,仔细想想后就发现上述的问题。虽然它的指令集号称执行效率提升到了1.25&nbsp;DMIPS/MHz&nbsp;,但这是仅仅纯粹的内核比较。集成到&nbsp;MCU&nbsp;中,就遇到了&nbsp;FLASH&nbsp;存储器的速度问题,而它的&nbsp;FLASH&nbsp;存储器数据宽度是&nbsp;64bit,每次就是读取&nbsp;4&nbsp;条连续的指令数据。<br /><br />ARM7&nbsp;可以将代码加载到&nbsp;SRAM&nbsp;中来全速执行,但是&nbsp;CORTEX&nbsp;M3却使用了一个不同的架构,即代码和数据分离架构,类似8051。虽然极大地降低了成本,却带来了不能逾越的鸿沟:代码无法加载到&nbsp;SRAM&nbsp;中全速运行。而单片机中常用的软件结构:子程序的入口表,划分了很多细小的功能实现代码段,既要查表来获取入口地址常数、又要跳转执行,这在&nbsp;STM32&nbsp;系列单片机的&nbsp;FLASH&nbsp;中会严重拖慢内核的执行效率。所以,这个标称的高速是要打很多折扣的。还有浮点运算如果也是利用查表法在&nbsp;FLASH&nbsp;中搜索的话,运行效率就可想而知了。除非哪天&nbsp;STM32&nbsp;在指令段也加入全速的&nbsp;SRAM&nbsp;,呵呵!这还有可能全速跑代码。<br /><br />因此,同频率的&nbsp;ARM7&nbsp;内核的&nbsp;MCU&nbsp;和&nbsp;某(CORTEX&nbsp;M3)&nbsp;-&nbsp;32-bit&nbsp;Microcontrollers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进行执行速度比赛的话,ARM7&nbsp;内核的MCU&nbsp;远远胜出。而不是那种:广告上猛眼一看,似乎&nbsp;某(CORTEX&nbsp;M3)&nbsp;-&nbsp;32-bit&nbsp;Microcontrollers&nbsp;&nbsp;&nbsp;更加优胜的结果。但是从性价比来说,ARM7&nbsp;就不行了。(CORTEX&nbsp;M3)&nbsp;-&nbsp;32-bit&nbsp;Microcontrollers&nbsp;&nbsp;简单的架构很合适低成本的产品,代替&nbsp;8051&nbsp;是迟早的事情。<br /><br />本人是看不惯厂家的广告中,有浑水摸鱼的感觉,特在此撰文一述,欢迎大家指正。<br />原文地址:http://home.**/?uid-43048-action-viewspace-itemid-334&nbsp;<br />
lianshumou 发表于 2009-3-4 15:49 | 显示全部楼层

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

不要什么某(CORTEX&nbsp;M3),你都已说出来是STM32了!<br />我实际用的结果,&nbsp;同频下比你传说中的ARM7快,
wlq_9 发表于 2009-3-4 16:02 | 显示全部楼层

LZ

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

RE

呵呵,以个人的名义顶一下哈.&nbsp;不为别的,只为楼主的探索精神.
ijk 发表于 2009-3-5 14:59 | 显示全部楼层

Cortex-m0是谁的终结者?

&nbsp;&nbsp;Cortex-m3是ARM7的终结者!这一点我比较相信。<br />&nbsp;&nbsp;但Cortex-m0是谁的终结者?这倒是值得讨论一下。Cortex-m0会终结16位单片机,还是中端到高端的51?<br />
zlgmcu 发表于 2009-3-6 11:05 | 显示全部楼层

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

Cortex-M0在二进制和开发工具上兼容Cortex-M3,好像是从Cortex-M3改进而来的,速度虽然会慢一些,但结构更加轻巧,由此带来功耗和成本的大幅下降。<br /><br />我认为将来基于Cortex-M0的MCU主流工作频率一般不会超过50MHz,而价格会做到5~7个RMB。<br /><br />===============================================================================<br /><br />ARM公司近期发布Cortex-M0内核,号称能耗最低,NXP已取得授权<br /><br />21IC新闻报道:能耗最低的Cortex-M0处理器(ARM)<br /><a href="http://www.21ic.com/np/embed/200902/32705.htm" target=_blank>http://www.21ic.com/np/embed/200902/32705.htm</a><br /><br />ARM官方网站:Cortex-M0<br /><a href="http://www.arm.com/products/CPUs/ARM-Cortex-M0.html" target=_blank>http://www.arm.com/products/CPUs/ARM-Cortex-M0.html</a><br /><br />Cortex-M0内核的巨大优势:<br />●&nbsp;兼容性好:开发工具和二进制跟Cortex-M3兼容<br />●&nbsp;结构简化:仅12K逻辑门,比Cortex-M3还少<br />●&nbsp;功耗极低:达到85微瓦/MHz<br />●&nbsp;成本低廉:硅片面积更小,批量制造更有优势<br />●&nbsp;性能很高:仅比Cortex-M3略低,达到0.9DMIPS/MHz<br /><br />Cortex-M0内核会进一步侵蚀8位/16位MCU市场。NXP已获得ARM公司的Cortex-M0授权,产品将划归到LPC1000系列里面,我们ZLGMCU未来理所当然地会代理该产品线。<br />
machunshui 发表于 2009-3-6 14:00 | 显示全部楼层

楼主分析的不错

楼主分析的不错
machunshui 发表于 2009-3-6 14:09 | 显示全部楼层

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

不过不是说CM3有分支预测功能吗?<br /><br />不知效能如何?
老狼 发表于 2009-3-7 02:39 | 显示全部楼层

楼主的评价不公正呀!

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

本版积分规则

15

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部