• ベストアンサー

PIC32MXのディレイに関して

Nop命令を使って、Nop命令単位で、ディレイ時間設定したいのですが、 Yahooの「知恵袋」の回答に以下の様な回答を見つけました。 PIC32MXでは、delay関数がないとのことで、その回答理由に プリフェッチキャッシュがある為、命令の実行速度が一定でなく高速化され、また動作クロック30MHz以上ではメモリウェイトが入り単純にNOP命令を並べてのdelayでは時間が測れない為と思われます・・・・ とありました、Nop単位で遅延処理は出来ないのでしょうか? ご存知の方、宜しくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • tadys
  • ベストアンサー率40% (856/2135)
回答No.1

PIC32MXを使ったことはありませんが、下記の資料を読めばある程度のことはわかります。 http://ww1.microchip.com/downloads/en/DeviceDoc/DS61146B_JP_PIC32.pdf >PIC32MXでは、delay関数がないとのこと どんなCPUでも最初から名前の付いた関数などは用意されていません。 用意されているのは関数を作るための仕組みだけです。 delay関数がないのであれば作ればいいのですが、PIC32MXでは以下で述べるような理由で希望した時間にならないことが有ります。 細かい時間の誤差が問題ないのであればdelay関数を作って使用することには問題ありません。 上記資料の「ハイライト」の中に次のような記述が有ります。 1• 128ビット幅のフラッシュメモリで個々の命令フェッチ時間を短縮 2• 256バイトの高速キャッシュメモリは命令およびROMデータ先読みバッファ付き 1から分かること:フラッシュメモリからの命令フェッチ1回で4個の命令をフェッチ出来る。 この時プログラムの組み方により、4個の連続したNOP命令が1回のフェッチで読み出すことが出来ることも有れば、二つのフェッチに分かれることが有ります。 そうすると、同じコードでも実行時間に差が出ます。 これを避けるためにはNOP命令の開始番地を4の倍数に設定するようなプログラムにする必要が有ります。 2:から分かること:キャッシュメモリが付いているのでNOP命令がキャッシュメモリにロードされているのかいないのかで実行時間に差が出ます。 キャッシュメモリの内容はプログラムの実行内容によって変化しますので同じdelay関数を読んでも時間が変わることが有ります。 また、delay関数に関係ないところのプログラムを変更したことでdelay時間が変化することも有ります。 その他:PIC32MXぐらいになると割り込みを使うことが普通です。 delay関数の実行中に割り込みが発生すると時間が大きく変化します。 この問題はdelay関数の実行中は割り込みを禁止することで避けられます。 以上のような理由によりある程度の性能を持つCPUでは1命令単位での精密な時間制御は不可能です。 どれだけのタイミングの誤差が許されるかを検討して対応を考えることになります。 大抵の場合は内蔵のタイマーを使用することで対応できるでしょう。

Piyo_Piyo_
質問者

お礼

tadys さんへ 非常に助かりました。 回答も分かりやすく説明を頂き、有難う御座いました。

関連するQ&A