一旦ブレーク(BP or pause)しないとイーサネット割り込み来ない

ごめんなさい。詳細は後で記入します。

  • すみません。元々のアカウントは突然ログインできなくなった(English Communityしかログインできない)ので、別アカウントで。

    具体的には、RX56Nで、ほかのプロジェクトで正常に通信できるソースコードを現在のプロジェクトに移植しました。同じMCU、同じクロック、CPU周りの回路も同じ。だが、Ethernet通信はできません。プログラム走る途中にIDEのPAUSEボタンを押する、あるいはブレークポイントを入れて中断させて、再開すると、通常に通信できました。

    ブレークポイントの場所はR_Ether_T4_Initialize関数のあとです。R_Ether_T4_Initialize関数を呼ぶ前にブレークポイントを入れて止まらせても効果がありません。

    よろしくお願いいたします。

  • huangda1982さん、こんにちは。NoMaYと申します。

    これはデバッグするしかない、のだろうと思うのですけれども、状況の確認として、投稿のタイトルの、イーサネット割り込み来ない、ということに関しては、割り込み要求フラグも立っていないのでしょうか?

  • 一旦停止すると直るので、割り込み要求フラグは確認はできませんでした。割り込み処理関数の中にログ出力をしていますが、一旦停止しないと出力されません。ログ出力はRenesas Debug Virtial Consoleへ出力しています。出力がないので、割り込み来ていないじゃないかと思っています。

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

    > 一旦停止すると直るので、割り込み要求フラグは確認はできませんでした。

    その一旦停止した時に、I/Oレジスタウィンドウなどで割り込み要求フラグが立っているか見て頂ければ良いですよ。

    立っていた場合は以下のようなことへ話が進むと思うのです。

    ・割り込みマスクフラグはどうなっている?
    ・PSWのIPLの値はどうなっている?
    ・割り込み要求レベルの値はどうなっている?

    立っていない場合は以下のようなことへ話が進むと思うのです。

    ・立つようにする処理があるはずであるが実行されているか?
    ・実行されているのであればその後暫くは立つ可能性のある状態にある筈である(すみません、うまく表現出来ません)
    ・言い換えると、立つようにする処理を実行したのに、その後にその処理を駄目にする何かが行われているのかも
    ・駄目にしている原因は何か

    類似の案件として以下のようなことは普通にあるので何か答えがすぐ見付かるようなことでも無さそうな気がします。

    ・ステップ実行している限りは動作するがGoさせると動作しない
    ・Run/Breakさせている限りは動作するがBreakポイントを外してGoさせると動作しない

  • 通信できないのは、ETHERデバイスが有効していないことがわかりました。ETHERデバイスの有効は10msタイマの中、結局割り込み処理実行されいないせいです。

    一旦停止した時I/Oレジスタウィンドウを見ると、タイマ割り込み要求FLAGは立っています。
    PSWのIは1 == 割り込み有効
    PSWのIPLは0 < タイマのレベル(5)

    T4用タイマをCMT0からCMT1に変更すると、正常に通信できました。ログで確認すると、CMT0の割りこみは来ないらしい。しかも、毎回BREAK→RUNでCMT0の割りこみ処理関数が一回のみ実行される。

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

    > CMT0の割りこみは来ないらしい。しかも、毎回BREAK→RUNでCMT0の割りこみ処理関数が一回のみ実行される。

    これは以下のことですか?また、移植元のソースでもETHER通信用に使われているのは同じくCMT0でしょうか?それからCMT0の割り込みマスクフラグの方はどうなっていましたでしょうか?

    (1) CMT0割り込みのエントリ関数には来ない(ここでエントリ関数というのは割り込みベクタテーブルにアドレス登録されている関数とします)
    (2) しかしCMT0のコールバック関数には毎回BREAK→RUN後に一回のみ来る

  • CMT0割り込みのエントリ関数には来ない。T4はr_sys_timer_tx→r_cmt_rx経由でタイマを使います。r_cmt_rxの一個目の利用者はCMT0を使う、二個目の利用者はCTM1を使う、… 具体的レジスタ設定はr_cmt_rxがやってくれたので、CMT0とCTM1はまったく同じです。

    移植元はr_cmt_rxのほかの利用者がありませんので、CMT0です。今回、Dummyのr_cmt_rx利用者を作って、CMT1にさせたのです。

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

    > (1) CMT0割り込みのエントリ関数には来ない(…略…)
    > (2) しかしCMT0のコールバック関数には毎回BREAK→RUN後に一回のみ来る

    不思議ですね、、、コールバック関数から順次呼び出し元へ戻っていくことは出来ないのでしょうか?(一般的なことしか手助け出来なくて申し訳ないです、、、)

    あるいは、私は此処で引っ込んで、もっとFITのETHERモジュールに詳しい人からのリプライを待って頂くのが良いかも知れませんね。(ETHERモジュールに詳しいというよりもCMTモジュールに詳しい人の方なのかも知れません。)

  • 今まで助けてくれた大変ありがとうございました。最近ソース自動生成を頼ん、あまりレジスタ設定などを見なくなりました。NoMaYさんのリマインドでレジスタ設定を見ました。問題をCMT0のところに特定できましたのNoMaYのおかけです。

    一旦問題回避できましたので、プロジェクトを進めます。CMT0割り込みが来ないのはもちろん続いて調査しますので、何かわかったらまたここに報告させていただきます。