初心者です。
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クロックで動作する命令は存在しないので恐らくは勘違いをされていると思います。