gptのコールバック反応時間

初心者です。

GPTタイマ(1周期:200ns)をPWMモードで利用しています。コールバックの中で、メモリに対する書き込み処理を行います。
ロジックアナライザで上記の処理のタイミングを測ると、GPTの立ち上がりタイミングからメモリの書き込み処理までの間に500ns程のタイムラグが生じており、間に合っていません。
どのようにすれば、応答時間を短くすることができるでしょうか。初心者故、GPTタイマの使い方がそもそも間違っているのか、GPTタイマの限界なのか、見当もついていません。お力添えの程よろしくお願いします。

ターゲットはS7G2です。

  • 5MHzの速度で割り込み処理されたいということですか?

    S7G2 は 240MHzのCortex-M4だそうですが、200nsの期間では 48クロック分の命令しか実行できないので大したことはやれそうにないですね。

    > どのようにすれば、応答時間を短くすることができるでしょうか。

    割り込み処理の内容を軽くするだとか、割り込みをやめてポーリングにするだとか方法はいくつか考えられます。

  • 早速のご回答有難うございます。

    言葉足らずで、状況をうまく説明できておらず、申し訳ありません。

    GPTのcallbackの最初の命令がメモリへの書き込み(2バイト)なのですが、このメモリ書き込み信号とGPTのクロックを計測しています。クロックの立ち上がりから約500ns経過後にメモリの書き込みが行われており、そもそも1クロック内でコールバック処理が始まりもしない状況なのです。この500nsという値は、試行錯誤でクロックを徐々に遅くし、1クロック内で処理が始まるようにするためにはクロックの周期500nsにまで落とす必要があった事から、500nsという数値を出しています。

    >> どのようにすれば、応答時間を短くすることができるでしょうか。

    上記については、クロックの立ち上がりからcallbackを起動するまでの処理時間を短くしたいという意図で書きました。

    上記が内部でどのように行われているか、知識がありませんが、GPTタイマにcallbackを書いても、IRQを用いて、IRQのcallbackに処理を書いても状況は改善しませんでした。

    >割り込みをやめてポーリングにする

    仰っている意図と同じか、心もとないですが、callbackを利用するのではなく、クロックのポートを観察して、前値=LOWかつ今回値=HIGHの条件判断で、メモリ書き込みを行う処理を書きました。やはりメモリに書き込みに行くまでに、約500nsの遅延が発生しております。

    上記で、「メモリ書き込み」と申している、メモリは「memory mapped io」で、計測している信号はCS(Chip Select?)です。

  • ライブラリか何かで提供されてる割り込み処理の中から呼ばれるよう登録したコールバック関数が割り込み処理の中から呼ばれるまでに 500ns 掛かっているということだと思います。その辺りをスリム化すればレスポンスの向上は期待できますね。

     ポーリングでも 500ns の遅延が起こるということですが、恐らくは割り込み処理が先に呼ばれてそれが終了するまでに 500ns 程掛かっているのではないかと思います。割り込み処理を禁止してみてはどうでしょうか。

  • 最近の高性能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サイクルとあるので大した問題はなさそうです。

  • fujita nozomuさん240MHz動作のCPUでは500nS間にメモリ書き込み例えば単独でmovとかa=1とか何行ぐらい処理できるのですか、それにより500nS間でソフトで対応するのが良いのかハードウェアを組まなければならないのかになると思いますが、興味深いところですので横槍で申しわけありませんが、ひと昔前でしたら1命令が1uSレベルの世界でしたからついでに教えていただけないですか、マニュアルを見ればわかりますかね。

  • fujita nozomu 様

    ご返事ありがとうございます。先の投稿以来、ログインができず、お返事が遅れまして申し訳ありません。

    ポーリング方式に於いて「割り込みを禁止する」というのは、GPTタイマのcallbackをNULLにしておくという事でしょうか。callbackをNULLにしても遅延は変わりませんでした。

    ポーリング方式ではなく、callbackを用いる方法についてですが、
    ターゲットボードが独自だと議論の前提が確かにならないので、Renesas SK-S7G2でも試しました。
    同様の遅延が発生します。
    プログラムは以下のように、単純なものです。g_timer6のGTIOCAとP805を計測し、遅延は700nsでした。

    #include "hal_data.h"
    void hal_entry(void)
    {
        g_timer6.p_api->open(g_timer6.p_ctrl,g_timer6.p_cfg);
    }

    void callback(timer_callback_args_t *p_args) {
        g_ioport.p_api->pinWrite(IOPORT_PORT_08_PIN_05, IOPORT_LEVEL_HIGH);
        g_ioport.p_api->pinWrite(IOPORT_PORT_08_PIN_05, IOPORT_LEVEL_LOW);
    }

    ただし、モード:PWM、周期:2μs、デューティ:50%

  • 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さん

    このメモリ書き込み信号と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さん

    コールバック

    アナログ入出力を5MHzのレート

    うーむ、うなりますね、ほとんど無理でしょう、

    240MHzを過信してはいけません

    マニュアルにDMACの項目がありますから勉強してみてください。