Arduinoに時計があるのはなぜですか?


9

もちろん、遅延の時間を制御することは便利ですが、他の用途はありますか?

16Mhzクロックで、プログラムの各行は1/16000000秒かかりますよね?

非常に大きなラインでも1/16000000秒しかかかりませんか?

8MHzクロックでは、各ラインは2倍の時間を要しますよね?したがって、「メインループ」全体も2倍の時間がかかります。


3
C命令と機械(アセンブリ)命令を混同している。しかし、アセンブリで直接書いたとしても、プログラムは線形ではないので、それをうまく利用することができます。つまり、割り込みは、名前が示すように、別の命令に移動してから再開することにより、通常のコードフローを中断します。つまり、ある行と次の行の間では、ISRを実行する必要があり、これは非常に長くなる可能性があります
frarugi87

2
チップを8ミリヘルツでクロックする場合、最も単純なコード行でさえも永遠にかかります。私は、あなたが時計を使用することをお勧めメガヘルツ範囲(MHz)で。
Edgar Bonet、2016

各機械語命令の実行に必要なサイクル数は、命令セットマニュアルに記載されています。
Edgar Bonet、2016

私はスリープ状態に行くべきくそ;)、編集済みのおかげ
n0tis

回答:


13

Arduinoに時計があるのはなぜですか?

それはコンピュータやマイクロコントローラなどが機能する方法だからです。

16MHzのクロックでは、プログラムの各行に1/16000000秒かかりますよね?

番号。

非常に大きなラインでも1/16000000秒しかかかりませんか?

番号。

クロックは、マシンコード命令がメモリからフェッチされて実行される速度を定義します。ほとんどの命令は1クロックサイクルかかりますが、一部はそれ以上かかります。

Cコードの1行は、任意の数のアセンブリー命令にコンパイルされ、マシンコード(生の数)に変換されます。これは、行が何を行うかに応じて、1つのアセンブリ命令から数千のアセンブリ命令までのいずれかになります。

8MHzのクロックでは、各ラインは2倍の時間を取りますよね?したがって、「メインループ」全体も2倍の時間がかかります。

チップ内のすべての操作はクロックによって制御されます。クロックが半分の速度である場合、チップは半分の速度で実行されているため、すべての操作に2倍の時間がかかります。


また、割り込み。
njzk2 2016

1
マイナーヒント:オプティマイザがなくても、「... 0アセンブリ命令からのどこでも...」ですが、最適化後はさらに長くなります。
ピーター

2
かわいそうな少年を混同しないでください。彼は現状のまま十分な時間を過ごしている。
Majenko

@Majenko:混乱は必要です。それは難しい。
intelfx 2016

@intelfx "IT"?これはプログラミングであり、ITではありません...
BalinKingOfMoriaは、CMを2016

10

@Majenkoの投稿では回答されていません:はい、8MHzクロックでは、各ラインは2倍の時間を要します。ラインがクロック駆動ではない何か-例えば外部入力-を待たない限り。

@Majenkoの回答に加えて、CPUには、次のステップが開始する前に、命令が完了したことを確認するためのクロックがあります。CPUは多くのトランジスタで構成されています(AtMegaが数百万の範囲内であり、1桁の差があるかどうかを示す参照を見つけました)。

サイクル中、電力はチップを流れ、トランジスタをオン/オフにします。その結果、より多くのトランジスタがオン/オフになります。これが発生している間、チップの一部には「間違った」値があります。これは計算の途中であると考えることができます(1の列と10の列を追加し、 100s列)。これが外界に影響を与えたくないので、(たとえば)出力ピンは、命令が完了するまでラッチされます。指示を完了するのにかかる時間はさまざまですが、製造業者は最悪の状況で最も遅い指示を計算します。

AtMega(Arduinoのチップ)の場合、Atmel(チップを設計した人)は、これは1秒の1 / 20,000,000であると宣言しました-これは20MHzです。

すべてのマイクロプロセッサがすべての命令をサイクルあたり1命令で実行するわけではないことに注意してください。一部の命令は、1、2、または10サイクルかかる場合があります。パイプライン処理により、事態はさらに複雑になります。プロセッサは、あるサイクルで次の命令をフェッチするなどの作業の一部を実行し、次のサイクルで実行する可能性があります。ただし、命令1の実行中に、次の命令をフェッチすることもできます。これを行うには、次に来る命令を推測する必要があります(「goto」に相当するマシンコードの場合-これはループに使用されます)。推測が間違っている場合は、対処する必要があります。それ; 取得した命令を破棄し、次の命令を取得して、サイクルを失います。

命令のパイプライン処理に関するWikipediaのページは、RISCチップのパイプライン処理の例を、命令フェッチ、命令のデコード、実行、メモリアクセス、およびライトバックの5段階で示しています。したがって、実行のある段階で5つの命令を重ねることができます。「書き戻し」フェーズまで、命令は実際には効果がありません。これは組み立てラインと考えることができます。ウィジェットを組み立てるのに7分かかりますが、5つのステージに分解でき、最長のステージは2分かかります。2分に1回、部分的に完成した各ウィジェットは、組み立てラインによって次のステーションに移動されます。あなたは2分ごとに1つのウィジェットを取得します-「時計」は最も遅いステップと同じ速さでのみ刻むことができます。ウィジェットをより速く押し出すと、「ボトルネック」はますます多くのウィジェットをキューに入れます。


AVRには非常に浅いパイプラインがあります。フェッチと実行のみです。次に、条件付きジャンプには1サイクル(ジャンプは行われません)または2サイクル(ジャンプは行われます)のいずれかがかかります。
Edgar Bonet、2016

追加の複雑さ:キャッシュミス。
マルティン・ブラス・ペレス・ピニージャ

私が言及しなかった多くのことがあります:(任意のタイプの)キャッシュ、マルチスレッド、マルチコア...私はおそらくすでに私の投稿を深く掘り下げすぎました。
アマダノン株式会社2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.