FIT R_SCI_RXモジュールでprintfをfrom inside interrupt routine内から行えるかどうか考えてみるスレッド

こんにちは。NoMaYです。

最近、以下のスレッドに関わったのですが、そういえばFITのR_SCI_RXモジュールでは送信リングバッファを使えますので、仕組み上は、割り込みルーチン内からでもprintfを使うことが出来ても良さそうな気がします。ということで、いつものように、ちょっと好奇心からスレッドを立ててみました。いつものように、ぼちぼちと続きます。

Config_ICUでのIRQの設定について
community-ja.renesas.com/cafe_rene/forums-groups/beginners/f/002-2095199602/9604/config_icu-irq

本当は、割り込みルーチン内からデバッグコンソールへ出力する方法を考えたいところですけれども、以下の理由で今回は保留です。

(1) 割り込み駆動方式でデバッグコンソールへ文字書き込みする方法が無い(少なくとも公開されている情報では出来ない)
(2) ポーリング方式でデバッグコンソールへ文字書き込みする方法では割り込みルーチン内で使うには性能上の懸念がある

[追記]

こんなことを考えたのも、以前に別スレッドにURLを書いた個人事業主?さんが、こういう記事を執筆されていましたのを、たまたま見掛けたからかも知れません。

RAファミリprintfデバッグ3方法
2022年10月7日 WithHappy
happytech.jp/wordpress/2022/10/07/ra-family-printf-debug-3-method/
 

  • こんにちは。NoMaYです。

    脱線ついでのその4ですけれども、先ほどの件でemWin(及び関連ドライバ)が動き出すところより前の筈のところでやってみても再現するのであれば、(リンクサイズ制限の事情で)emWinを外してCC-RXでビルドしたら再現するのか試してみました。結果は、e2 studioでは再現しましたが、同じabsファイルでもCS+では再現しませんでしたね。

    以下、e2 studioとCS+の画面コピーです。






     

  • こんにちは。NoMaYです。

    脱線ついでのその5ですけれども、e2 studio+GNURXに戻してから、自前でMTU1とMTU2を組み合わせてICLK同期の32ビットカウンタを作って試してみました。結果は、自前のカウンタでは、おかしなところはありませんでした。

    以下、e2 studioの画面コピーです。



     

  • こんにちは。NoMaYです。

    脱線ついでのその6ですけれども、e2 studioでトレースデータの時間表示のモードを差分表示から積算表示にしてみたところ、期待値と異なる値が表示されている箇所はトレース機能の時間カウンタがラップアラウンドする箇所っぽいです。どうも時間カウンタは20ビット幅ではないかと推測されるのですが、そうだと仮定して手元で手計算してみると、以下の通り、期待値と同じ値が得られました。私はe2 studioの計算ミス不具合のような気がします。

    正しい?(と推測される)手計算の結果 (時間カウンタは20ビット幅だと推測される(最大値は(2^20-1)=(1048576-1)))

    上側の赤枠箇所: (1048576 +  81478) - 1010053 = 120001
    下側の赤枠箇所: (1048576 + 113523) - 1042098 = 120001

    e2 studionoが表示している計算結果

    上側の赤枠箇所: 計算式不明(推測不能) = 1059334 (前の投稿の画面コピーを参照して下さい)
    下側の赤枠箇所: 計算式不明(推測不能) = 1059634 (前の投稿の画面コピーを参照して下さい)

    以下、e2 studioの画面コピーです。


     

  • こんにちは。NoMaYです。

    ちなみに、幾つか前の投稿のMTU1とMTU2を組み合わせて作ったICLK同期の32ビットカウンタの以下の読み出し処理ですが、せいぜい今回の局面ぐらいしか考えていませんので、ガッツリと使う場合には、タスク切り替えや(多重割り込み含めて)割り込みに対して安全となるよう、getpsw(),clrpsw_i(),setpsw_i()で大域的に割り込み不可にする処理を追加する必要があります。

    uint32_t timer_gettick(void)
    {
        uint32_t cycles;

        /* Stop the lower 16-bit counter (it makes also the upper 16-bit counter stop) */
        R_Config_MTU2_Stop();

        /* Combine two 16-bit counters to form 32-bit counter value */
        cycles =  ((uint32_t)(MTU2.TCNT) & 0xffff);
        cycles |= ((uint32_t)(MTU1.TCNT) << 16);

        /* Resume the lower 16-bit counter (it makes also the upper 16-bit counter resume) */
        R_Config_MTU2_Start();

        return cycles;
    }

     

  • こんにちは。NoMaYです。

    これも脱線なのですけれども、e2 studioでE1/E2LiteでのRXマイコンのオンチップトレースでデータクオリファイトレース機能を使用して、別スレッドの案件のTMR0割り込みを100μs間隔で発生させることに関してトレースしてみました。(デバッグ用出力ポートは、別スレッドの案件とは違って、RX65N Envision Kitのボード上のLEDが接続されているポートです。)

    以下、e2 studioの画面コピーです。


     

  • こんにちは。NoMaYです。

    脱線ついでなのですけれども、e2 studioでE1/E2LiteでのRXマイコンのオンチップトレースでデータクオリファイトレース機能を使用して、別スレッドの案件のIRQ割り込みの遅延を計る、ということをしてみました。昨日、e2 studioを動かしていて、どうもトレース機能の時間カウンタの差分表示に計算ミス不具合があるようでしたので、今日は、トレース機能の時間カウンタのプリスケーラを使うようにして、おかしな値が目立たないようにしました。

    試したプログラムでは以下のようなことをしています。

    (1) P32をIRQ2-DS端子割り込み入力として定義しておきながらもP32ポート出力としても使用出来るように小細工をする
    (2) TRM0タイマ割り込みで100μs毎に割り込みを発生させる
    (3) TRM0タイマ割り込み処理では発生回数を数えて5ms毎にP32出力の0/1を反転させると同時にdebug変数に0/1を書く
    (4) IRQ2-DS端子割り込みで立ち上がりエッジに割り込みを発生させる
    (5) IRQ2-DS端子割り込み処理にてdebug変数に0x96969696を書く
    (6) debug変数への書き込みをトレースする

    (4') デジタルノイズフィルタはPCLK/64(≒0.94MH≒=1.07μs)として3回一致(2.1μs~3.2μsぐらい)で有効と判定される

    ソースは以下の画面コピーの1枚目の通り、トレース結果は2枚目と3枚目の通り、でした。別スレッドの案件では、IRQ割り込みの受付(というかどうもIRQ割り込みのみ)が3~4ms程も遅延することがあるようだったのですが、手元ではそのようなことは見受けられない、ということが分かったところです。

    以下、e2 studioの画面コピーです。




     

  • こんにちは。NoMaYです。

    また脱線ついでなのですけれども、e2 studioでE1/E2LiteでのRXマイコンのオンチップトレースでトレース機能の時間カウンタのプリスケーラの値として、以下の画面コピーの通り、1/1、1/16、1/256、1/4096、を選択出来るのですが、48MHz、120MHz、240MHz、のCPU動作周波数に対して、時間カウンタが20ビット幅だとして、カウンタが1周する時間を計算してみました。

    時間カウンタが20ビット幅だとしてカウンタが1周する時間

    1/1 1/16 1/256 1/4096
     48MHz 21.845ms 349.52ms 5.592s 89.478s
    120MHz  8.738ms 139.81ms 2.236s  35.791s
    240MHz  4.369ms  69.90ms 1.118s  17.895s

     
    以下、e2 studioの画面コピーです。
     


    [関連リンク]

    データクオリファイトレースが出来るかとか、タイムタグは付けられるかとか、トレース出来るフレーム数とか、細かいところはちょっと分かりませんけれども。

    オンチップデバッギングエミュレータ比較(RX編)
    www.renesas.com/jp/ja/software-tool/on-chip-debuggers-rx

    トレース出来るフレーム数は、以下のPDFファイルだと分かりますね。

    オンチップデバッガ 機能概要
    www.renesas.com/jp/ja/document/mat/chip-debuggers-performance-property

    [追記]

    以下によると、RX100シリーズはタイムタグが付けられない、ということになっているけれども、上のPDFファイルから推測すると、RX140グループではタイムタグが付けられる、かも知れないような気もするのだけれども。それはそれとして、他には、以下によると、RX200シリーズはタイムタグが24ビット幅である、という記載がありました。

    top > RX > デバッグ・ツール編 > ウインドウ・リファレンス > 説明 > トレース パネル
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.08.00/CS+.chm/DebugTool-RX.chm/Output/db_P_trace.html

    [追記2]

    以下によると、プリスケーラが使えるのは、RX71M, RX66x, RX65x, RX64M, RX671, RX72T, RX72M, RX72Nグループのみ、という記載がありました。

    top > RX > デバッグ・ツール編 > 機能 > 実行履歴の収集 > トレース動作の設定をする > 【E1】の場合
    tool-support.renesas.com/autoupdate/support/onlinehelp/ja-JP/csp/V8.08.00/CS+.chm/DebugTool-RX.chm/Output/db_kinou_func_trace3.html