Arduino:digitalread()およびdigitalwrite()のより高速な代替手段?


13

Arduinoの関数を呼び出すに最速の選択肢は何ですかdigitalread()とはdigitalwrite()?AVR固有またはチップ固有のソリューションが許容されます。


3
これとあなたの最後の質問を読んで、あなたはかなり早く何かをしたいようです。私はそれが何であるか、どのくらいの速さで詳細を提供することが役に立つと思う。
オリグレイザー

@Oli、良いアイデア、ありがとう。現在のプロジェクトは、RCトランスミッターのチューニングシステムです。それはうまく機能しますが、他のプロジェクトに同じフレームワークを使用できるように、RC PWM信号のデコードを効率的にしたいと思います。ここで私はこれまで持っているものの過去記事です: eastbay-rc.blogspot.com/2011/11/...
マーク・ハリソン

回答:


18

デジタルポートに直接アクセスしてください!

私がテストした3つの方法は

  • digitalWrite(pin、LOW); digitalWrite(pin、HIGH);
  • CLR(PORTB、0); SET(PORTB、0);
  • PORTB | = _BV(0); PORTB&=〜(_BV(0));

[...]

enter image description here

ご覧のとおり、digitalWriteの完了には約56サイクルかかりますが、ポートの直接アドレス指定には2サイクルかかります。これは、多くのIO操作を行うプログラムの時間の大きな違いです!



2

上記のように、デジタルポートに直接アクセスします。しかし、スタイルで!

ハードコードされた値をハードウェアレジスタに直接書き込むと、読みやすさと移植性が低下します。

Githubで、HWAと呼ばれるツールを公開しました。このツールを使用すると、C ++コンパイラを必要とせず、高効率のバイナリコードを生成するハードウェアへのオブジェクト指向インターフェイスを使用できます。

HWAがあります:https : //github.com/duparq/hwa


1
「高効率のバイナリコード」は、実際の測定値よりもはるかに信頼できると思われます。
ドミトリーグリゴリエフ

2

Arduino.SEの人々はすでにこれについて議論し、テストしています。digitalWriteFast()結局のところ、レギュラーよりも大幅に改善されているわけではありませんdigitalWrite()。ただし、ダイレクトポートアクセスはの約35〜40倍高速ですdigitalWrite()


0

ChipKit Uno32を使用します。AVRベースのArduinoよりもはるかに高速です。また、タイミングの問題にも対処します。


1
ここでは、少なくとも現在のハードウェアの限界に達し、より高速なものが必要であると判断するまでは、より高速なハードウェアを購入することが最良の答えだとは思いません。
ジョンL

1
なぜダウン投票するのですか?彼は、私が提供しただけでなく、最速のソリューションを望んでいました。誰もがより高速なArduinoベースのソリューションを提案できますか?
レオンヘラー

12
ChipKitはarduinoではなく、arduino互換のプラットフォームだからです。これは、ポートの切り替えは高速ですが、一部のライブラリが書き直される可能性が高いことを意味します。イーサネット、XBee、SDカードライブラリはすぐに動作しない場合があります。さらに、Markは、新しいプラットフォーム(doh)ではなく、digitalRead / Writeの代替関数呼び出しを明確に要求します。
ハンス

2
ハードウェアを変更することは決して良い解決策ではありません。少なくとも、良い学習を逃し、ハードウェアの効率的な使用方法を学習することはありません。
Rick_2047

1
@ Rick_2047「決して」とは言いません-要件が新規または拡張された場合、または数量が増加した場合、代替案を検討することは理にかなっています。しかし、ソフトウェアの全体的な非効率性で盲目的にハードウェアを投げることは洗練されていないことに同意します-より高性能なシステムが独自のオーバーヘッドを追加し、時にはタスクによっては単純なシステムよりも遅くなることがあるため、動作しないこともあります 使用するプラットフォームまたは使用することを想定しているプラ​​ットフォームについて学ぶことに勝るものはありません。
クリスストラットン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.