初心者です。
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サイクルとあるので大した問題はなさそうです。
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クロックで動作する命令は存在しないので恐らくは勘違いをされていると思います。
fijita nozomu様
三十年以上の前の事なので、記憶違いですね。歳なので思わず、言及してしまいました。