RA6M5 CPUにてWDTを試しているがカウントがうまくいかない

RA6M5 CPUの開発で WDT制御を試みています。

ルネサス様のWDTサンプルプログラム(wdt_ek_ra6m5_ep)を動作させると
意図したカウント周期でカウントが行われてリセット条件に到達すれば当然
リセットが発生するのですが、
当方で作成したプログラムでは、リセット条件に到達するとリセットは
発生するものの、なぜだかカウント周期がサンプルプログラムと比較して
異常に遅いです。

※試しに WDTデバイスのレジスタ(WDTCRなど)や、カウントに関わる
 クロック発生回路のレジスタ(SCKDIVCRなど)も
 サンプルプログラムと当方プログラムで全く同じにしてみましたが
 状況は変わりませんでした。
※ちなみに、使用ボードのクロック速度(PCLKB)は50MHzです)
※"異常に遅い"とは PCLKB=50MHzのとき、CPU仕様としてWDTは
 リセットまでに最大2.6秒ほどまで待てるかと思いますが、
 ( 0x3FFF ÷ (50MHz / 8192) ≒ 2.6秒)
 現状当方プログラムは200秒以上経ってからリセットがかかるように
 なっていて、単純に考えてカウント周期が100倍?以上になっており、
 クロック設定が明らかにおかしい様子です。


当方プログラムは WDT以外にも FreeRTOS+TCPや FreeRTOS+FATなども
実装しており、誰かが悪さしているのかもしれませんが
現時点では見当もついていません。

そこでWDTを使用する際に、WDTやクロック発生回路のレジスタ機能以外に
考慮しなくてはならない要素など、何かご存じのことがあれば
どなたかご教授いただけないでしょうか。

〇環境
・e2studio:v2021-04
・FSP:V3.0.0

以上、よろしくお願いいたします。

Parents
  • 問題解決いたしました。

    先週 NoMaY様にご指摘いただいた供給クロック設定について見直しましたが、
    異常は見つけられませんでした。
    途方に暮れていたのですが、ふと「カウンタ速度が遅いのではなく、カウンタが
    高速周期的に止まっているのではないか」ということに思いつきました。

    そこでWDTやクロック周り以外を確認した結果、作成プログラムが使用している
    外部ライブラリが省電力のため(?)、高速周期で WFI命令を実行して CPUを
    停止していました。
    そしてそのライブラリ内の WFI命令を取りやめたところ、期待した時間で
    リセットできるようになりました。


    懸念事項を一つずつ確認していった結果、ようやく辿り着くことができました
    多くのご指摘くださったNoMaY様、本当にありがとうございました。

  • ososさん、こんにちは。NoMaYです。

    解決して良かったです。

    その一方で、今回の件で頭に浮かんできたことを経て、私には、ひとつ新たな知見の習得になりましたね。

    (1) ウォッチドッグタイマのオプション的機能として低消費電力モード中に停止させる機能は良くあるものな気がする

    (2) それはそれで良いけれど実はいとも簡単に命令一発で低消費電力モードに遷移出来る(CortexならWFI、RXならWAIT、等)

    (3) 運悪く割り込み禁止中に暴走して命令列の隙間へ飛んでその後にたまたまそんな命令を実行したらデッドロックしそう

    (4) そんな気がしてRX651/65Nのハードウェアマニュアルを見直したらWAIT命令では自動的に割り込み許可になるのでした

    (5) 他方Cortexでは?と思いマニュアルを探して読んでみたのですがちょっと良く分からなかったです、、、
    ただ、ループで頻繁にWFIを使うのはArmが推奨しているようでした(以下の引用での赤文字は私によるもの)

    ARMv7-M Architecture Reference Manual
    developer.arm.com/documentation/ddi0403/ee

    B1.5.19 Wait For Interrupt



    Note
    Arm recommends that software always uses the WFI instruction in a loop, and does not assume that the processor either enters low-power state, or remains in low-power state, after any particular execution of the WFI instruction. This is because:
    - The architecture defines WFI as a NOP-compatible hint, that the processor can ignore.
    - A processor can exit the low-power state spuriously, or because of debug, or for some IMPLEMENTATION-DEFINED reason.
    ● Some implementations of Wait For Interrupt drain down any pending memory activity before suspending execution. This increases the power saving, by increasing the area over which clocks can be stopped. The Arm architecture does not require this operation, and software must not rely on Wait For Interrupt operating in this way.


    思うに、そう出来るなら、低消費電力モード中にも停止させない、という設定の方が良いのかも知れないです。

  • NoMaY様

    FSPのデフォルトでは CPU停止時に WDTカウンタを停止する設定が
    選択されていますが、
    仰る通り Armv7-Mの仕様的には WFI命令を多用しても不思議でない感じですので
     WDTを使用する際は意識的に CPU停止時にも WDTカウンタは停止させない
    設定にした方が無難のようですね。
    (もちろん FSP使用時に限った話ではありませんし、すべて自作コードで
     開発する場合は自由にすればよいのでしょうが)

    大変勉強になりました

Reply
  • NoMaY様

    FSPのデフォルトでは CPU停止時に WDTカウンタを停止する設定が
    選択されていますが、
    仰る通り Armv7-Mの仕様的には WFI命令を多用しても不思議でない感じですので
     WDTを使用する際は意識的に CPU停止時にも WDTカウンタは停止させない
    設定にした方が無難のようですね。
    (もちろん FSP使用時に限った話ではありませんし、すべて自作コードで
     開発する場合は自由にすればよいのでしょうが)

    大変勉強になりました

Children
No Data