初心者です。
GPTタイマ(1周期:200ns)をPWMモードで利用しています。コールバックの中で、メモリに対する書き込み処理を行います。ロジックアナライザで上記の処理のタイミングを測ると、GPTの立ち上がりタイミングからメモリの書き込み処理までの間に500ns程のタイムラグが生じており、間に合っていません。どのようにすれば、応答時間を短くすることができるでしょうか。初心者故、GPTタイマの使い方がそもそも間違っているのか、GPTタイマの限界なのか、見当もついていません。お力添えの程よろしくお願いします。
ターゲットはS7G2です。
最近の高性能CPUはキャッシュRAMを使用しています、そのためコールバック割り込み等は想像以上に時間を消費します、というのがページングで実行領域のプログラムをRAMにコピーする時間が必要になるからで、非常に速度の速い処理をするには割り込みではなくページフォルトが発生しないように、限られた範囲でループを回すということだと思います、これまでの経験なので、調べたわけでもないので、参考程度ですが。
> 最近の高性能CPUはキャッシュRAMを使用しています、そのためコールバック割り込み等は想像以上に時間を消費します
S7G2 のマニュアルを見てみると
https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/renesas-synergy-platform-mcus/s7g2-240-mhz-arm-cortex-m4-cpu
240MHz動作でのキャッシュミス時のリードサイクルは 3サイクルとあるので大した問題はなさそうです。
IKUZO 様
ご返事が有難うございます。先の投稿以来、ログインができず、お返事が遅れまして申し訳ありません。
>ひと昔前でしたら1命令が1uSレベルの世界
はい。私も「一昔前」はCPU6502が1MHzで動いて、大多数の命令が1クロックで動作していました。
命令セットのマニュアルを見つける事が出来なかったのですが。
700ns×240MHz=168
割り込みやポーリング方式を前提にしても、時間が掛かり過ぎに思え、私のe2 Studioの使い方や設定が間違っているのではと、思う次第です。
> ポーリング方式に於いて「割り込みを禁止する」というのは、GPTタイマのcallbackをNULLにしておくという事でしょうか。
割り込みコントローラを設定して割り込みを禁止することや、__disable_irq()を使用することです。コールバック関数は関係ありません。
> ポーリング方式ではなく、callbackを用いる方法についてですが、> ターゲットボードが独自だと議論の前提が確かにならないので、Renesas SK-S7G2でも試しました。同様の遅延が発生します。
割り込み処理のスリム化等行わなければ違いはないと思います。
> プログラムは以下のように、単純なものです。g_timer6のGTIOCAとP805を計測し、遅延は700nsでした。
500nsより遅くなっていますがGPIOへの操作にコストが掛かっているように見えます。
> 私も「一昔前」はCPU6502が1MHzで動いて、大多数の命令が1クロックで動作していました。
6502は 1命令の実行に最低 2クロックを要し、1クロックで動作する命令は存在しないので恐らくは勘違いをされていると思います。
Urkさん
Urk said:このメモリ書き込み信号とGPTのクロックを計測しています。クロックの立ち上がりから約500ns経過後にメモリの書き込みが行われており、そもそも1クロック内でコールバック処理が始まりもしない状況なのです。
このスレッドで興味深いのがどんなアプリケーションを作成しているのかということですね
ナノセコンドオーダーで調整しなければ上手くいかないというような状況は私の場合は余り想定してませんので
少し疑問なのがそのようなナノセコンドオーダーで調整できたとして、CPUに十分な余裕を持たせることができれば問題ないとは思いますが、なにか方向が間違っているような気がします(fujitaさんに怒られそうな気がしますが)
割り込みでトリガしてソフトウェアで書き込むというのはプロの世界?では普通に行うことですかね
割り込みでトリガしてDMACを利用するというのが普通ではないですか、それで大変興味深く伺っています。
fujita nozomu様
ご助言有難うございます。
>割り込みコントローラを設定して割り込みを禁止
についてですが、具体的には「External IRQ Driver」を追加するということでしょうか。ドライバを追加、プログラム中で、open(),disable()を呼び出した範囲では、動作は変わりませんでした。
>__disable_irq()を使用
こちらの関数を呼び出したところ、従来動作していたcallbackが呼び出されなくなりました。GPTのcallbackはIRQで実装されているという事でしょうか。
fijita nozomu様
三十年以上の前の事なので、記憶違いですね。歳なので思わず、言及してしまいました。
IKUZO様
ご助言有難うございます。初心者なもので、そもそも入口が間違っている可能性は大です。
アナログ入出力を5MHzのレートで行いたいだけです。入出力しているタイミングで行いたい条件判断は若干ありますが、ステップ数はわずかです。200nsの間に入力した値を配列にセット(もしくは配列から値を読みだして出力)するだけなので、callbackで処理できると思い、今は迷路にはまっています。
Urk said:コールバック
で
Urk said:アナログ入出力を5MHzのレート
うーむ、うなりますね、ほとんど無理でしょう、
240MHzを過信してはいけません
マニュアルにDMACの項目がありますから勉強してみてください。
そうなんですね。そういう意味では、240MHzを信じておりました。クロックで生じた割り込みで、プログラムカウンタやレジスタ等を退避して割り込みルーチン(callback)に飛び込むのに、数百nsも要するとは思いませんでした。
DMACについて勉強します。
DMAを用いて、試作プログラムが動き出しました。クロックの立ち上がりから、memory mapped された アナログ出力に70ns程の遅れで書き込みに行くことを確認できました。一桁違います。
表題の「gptのコールバック反応時間」が問題になるようなら、DMAを用いるべし、という結論ですね。
fujita nozomu様、IKUZO 様 貴重なご助言を頂きました。大変助かりました。有難うございます。