CPU频率在Arduino板中代表什么?

时间:2017-01-18 18:51:01

标签: arduino cpu microcontroller frequency

我是Arduino和微控制器的新手。

我正在研究这些规格,发现即使是同一块电路板也可能有不同的频率,输入电压不同(3.3V对5V)。所以问题是,频率代表什么?它是否表示它能够运行多少行汇编代码?或者它能够输出的最大PWM频率?

另一个问题是,如果我正在寻找特定项目的电路板,我如何确定我需要先验的频率,而不是尝试一切,看看哪一个有效?

让我更加困惑的是,当涉及到计算机CPU时,低频CPU似乎实际上比高频率CPU(例如英特尔)运行得更快。那么我怎么知道微控制器的运行速度有多快?

2 个答案:

答案 0 :(得分:3)

频率指的是CPU时钟的频率。假设您的Arduino Uno以16 MHz运行,即16,000,000赫兹。 这意味着每秒有1600万个时钟周期。 CPU执行程序的字节代码。一个汇编程序指令实际上可以执行任意数量的CPU周期,通常在1到4个周期之间进行简单的操作,并且稍微重复算术和写入内存。因此,它粗略估计每秒可以运行多少“汇编程序行”(即字节码指令)。一个更好的测量是“MIPS”值,“每秒百万条指令”。 CPU的其他基准类型更准确。

如果您参考AVR微处理器架构的数据表,您可以看到每个指令所需的周期:(链接:http://www.atmel.com/images/Atmel-0856-AVR-Instruction-Set-Manual.pdf

clock timings

因此对于ADD Rd, Rr指令,AVR CPU需要1个时钟周期。

以台式机Intel CPU为例。如今,它们的时钟频率为2 GHz或更高,与Arduino的AVR CPU每秒1600万次循环相比,每秒20亿次。所以Intel CPU击败了Arduino。再说一次,Arduino是为完全不同的东西而设计的 - 它是一个低开销的小型微控制器,不运行操作系统等。这种CPU(和架构)的用例只是不同,这使得比较它们是不合理的。还有许多其他因素在起作用,例如多核CPU(4个Intel CPU核心与1个AVR)和命令流水线,内存/ RAM的速度等。在每次使用中将CPU与另一个CPU进行比较真的很难 - 虽然可能,但对于“通用计算”,台式机CPU(AMD,Intel,x64架构)远远超过了仅仅Arduino AVR CPU的处理能力。

我希望这可以解决一些困惑。

答案 1 :(得分:1)

我认为你有一个混乱可能是芯片特定的,我现在不打算查一下但我记得看到这个,芯片规格可能会说这个输入电压范围它可以处理这个频率,为此电压范围不能。我认为sparkfun 3.3是8mhz,5.0是16mhz或类似的东西。无论如何,通常情况并非如此,但它是一个逐个芯片供应商的供应商的东西,这就是为什么你必须阅读数据表。与arduinos或avrs无关,只是一般的芯片设计。

您如何知道微控制器的运行速度有多快?这是一个非常有问题的问题,取决于你对快速的定义。如果它只是我可以使用的时钟频率,那么"只需阅读数据表"对于那部分,然后根据您的电路板设计选择可用的,如果您没有任何外部时钟,那么您的选择可能会或可能不会更有限,您可能有也可能没有可用于倍增的pll时钟源。

如果你对fast的定义是我能以多快的速度完成这项任务,那么每秒有多少whatevers,或者完成某项特定任务所需的挂钟时间。那是一个基准问题,有很多变量,实际上没有真正的答案。是的,x86可以拥有更低的时钟并且运行速度比其他一些x86更快,历史上新的可以比相同的二进制文件更旧的每个时钟的东西,你必须将编译调整到更新的芯片然后你可能会把你的一些mips带回mhz。但这部分是因为您使用的是不同的芯片设计,只是说同一种语言(机器代码)。你可以让一个高个子的人比一个短小的人更快地背诵一首诗,既可以使用英文也可以使用同一首诗,与短小或高大无关,只是他们是不同的人。

有不同的avr核心变体,但不能与不同的x86架构相提并论。因此,在比较一个微小的与一个xmega时,你可能可以让xmega运行更快"只是因为它有更多的寄存器或更大的地址空间等,在相同的时钟速率,但每秒的指令可能并没有真正的不同,可能是,但我的猜测不是那么多。

然后是编译器,编译器在如何"快速"中起着重要作用。您的代码运行,更改编译器或编译器版本或编译器设置,并且从相同的高级源代码(例如C)生成的机器代码可能会有很大差异,因此会对"速度"的代码。以dhrystone为例,非常容易证明在相同的芯片/电路板上具有相同的精确源代码,相同的时钟速率等可以基于使用不同的编译器,版本或命令行设置以极其不同的速度执行,有点证明基准的教父在提供任何有意义的信息方面基本没用。

微控制器使问题变得更糟,因为你经常运行闪存中的程序,许多,不是全部,但很多都能够分频或乘法或同时兼顾时钟,但闪存并不总是为全系列。您可能有一个以8mhz内部时钟启动的芯片,但您可以使用pll将其乘以80mhz。但是闪存仅限于16mhz芯片就不那么罕见了,因此在8mhz闪存可以提供一个项目说每个cpu时钟的指令,但是在20mhz时你必须设置等待状态,尽管cpu的运行速度要快得多你只能以16mhz的速度喂它,所以它会等待更多,然后当它得到一些东西时动作很快,它是否真的更快"或正在提高你的速度。当然,在这个幻想芯片中我只能在16mhz以下,你可以将它保持为零等待状态,所以它真的更快,不一定是其他因素的两倍,但绝对快于8mhz。刚刚达到或超过16mhz虽然你的性能受到了惊人的影响,而不到16mhz。在不到32mhz的情况下,虽然它比刚刚下降得快,然后在超过32mhz的另一个等待状态设置并且再次慢得多,即使时钟基本相同等等。

然后就是获取,cpu如何实际获取,就像每个获取事务获取一堆数据的arm一样,即使它分支到0x1004并且在那个地址也不会执行所有这些数据有一个分支到0x2008核心可能从0x1000到0x100F获取0x10字节,然后提取0x1004字/指令,解码它找到它是一个分支然后从0x2000读取0x10字节。基本上读取0x20字节来查找2条指令。如果两个指令都在0x10字节,则取两个指令,如果一个处于0x100C,则另一个指令正好,另一个指令处于性能命中的0x2000处。获取此内部信息并将其应用于应用程序,并将其全部跳转,更改一行代码或添加或删除单个nop到引导程序(导致程序在地址空间中更改的对齐)可能导致从性能的微小到大的变化,交换两个辅助函数是你的程序的源代码,在文本中,一旦编译就使它们落在不同的地址空间中,在没有实际改变函数本身的情况下几乎没有主要的性能影响。

因此,在一个方面,性能首先是一个愚蠢的任务,在另一个方面,重要的是你使用在你正在使用的硬件上使用的编译器编写的程序,它的速度和它一样快通过更改编译器设置或代码或两者,您可以采取一些措施使该目标上的编译器上的代码更快。理想情况下,您构建最终的固件,性能测试,并且永远不会重新构建,就好像您构建一两年后,它可能在不同的主编译器上使用不同的编译器或编译器版本,并且所有投注都取决于性能。

你如何选择一块板,多少闪光灯,内存,功能,时钟频率。很多只是试验和错误的经验,幸运的是,你可以真正尝试数百块电路板,所有电路板都需要花费几美元到10或20块,不同的CPU架构,不同的芯片供应商等等。有很多编译器选择甚至可用的语言,基本上有太多容易获得的选择,不像当时的部件相当便宜,但你可能不得不建立自己的板,在asm编写代码,也许甚至创建自己的汇编程序等。拥有一台价值数百到数千美元的rom程序员。因此,请使用您拥有的AVR并使用其功能,使用编译器和/或写入或两者兼而有之。做实验,看看是否有获取效果。如果你有时间选择混乱那些看到会发生什么。

当然,所有这一切都始于从供应商那里阅读芯片文档。