方才在 STM32 的相关文档中找到了能够在 RAM 中跑代码的描绘。因而,下面临 STM32 的一些描绘内容是过错的。STM32 是能够在 SRAM 中跑指令代码的。为了不让网友对后边其他的跟帖产生误解,原文不做修正。
当有些厂家的 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 为内核的 MCU ,参数表上常常标明 SRAM 的拜访速度为全速,等候周期为 0,而 FLASH 却没有清晰阐明速度是多少,只是告知你 CPU 内核在跑到什么频率段的时分,FLASH 存储器的等候周期应该设置为几个周期,这便是原因了。
由此看来,只是看 ARM7 的内核运转速度来判别你的代码能跑多快是不正确的。你需求剖析许多综合性的状况才干大约地了解自己写的代码能够大约跑到什么速度。想要再进步,呵呵!尽力吧,好好收拾自己的软件架构,来合作以 ARM7 为内核的 MCU,这样或许能够到达你的期望值哦!
—————————————————————————————————————————————-
本文是在我细心研讨了STM32 (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 和 STM32 (CORTEX M3) – 32-bit Microcontrollers 进行履行速度竞赛的话,ARM7 内核的MCU 远远胜出。而不是那种:广告上猛眼一看,好像 STM32 (CORTEX M3) – 32-bit Microcontrollers 愈加优胜的成果。可是从性价比来说,ARM7 就不行了。STM32 (CORTEX M3) – 32-bit Microcontrollers简略的架构很适宜低本钱的产品,替代 8051 是早晚的工作。
自己是看不惯厂家的广告中,有趁火打劫的感觉,特在此撰文一述,欢迎我们纠正。
我之前还没看过 LM3S6965 的材料。方才去看了一下,它的确是将 SRAM 和 FLASH 分配在一致空间中的,SRAM 内既能作为数据区运用,也能够跑代码。这是比较自在的组织,它的这种架构能够让代码全速运转。
CORTEX M3 架构供给了愈加灵敏的挑选来协助 MCU 厂家来节约本钱,既能够为本钱恰当下降功用,也能够寻求速度而恰当添加本钱,应该是更先进的