T4ライブラリ _process_tcpip 多重割込みについて

いつもお世話になっております。

T4ライブラリ _process_tcpip の呼び出しについて、

疑問点が湧いてきましたので、ご意見をお聞かせください。

現在RX65NへFreeRTOS + FITモジュールを使用してT4ライブラリを導入しています。

T4ライブラリの_process_tcpipについて呼び出し元を調査していたところ、

・CMT1(10ms周期) 割り込み コールバック

・EDMAC0 EINT0 割り込み コールバック  

の2ルートで呼び出されている様でした。

(意図して上記設定としています。)

気になったのは「EDMAC0 EINT0 割り込み コールバック」なのですが、

コールバックにより、t4_driver.cのlan_inthdrという関数が呼び出されいるのですが、

この関数内で多重割込みが許可されています。

T4ライブラリ内を確認すると、


void _process_tcpip(void)
{
~~~~
    if (_process_flag == 0)
    {
        _process_flag = 1;

~~~~~

        _process_flag = 0;
    }
~~~~
 
    return;
}

という実装になっていました。

この場合、


if (_process_flag == 0)
{            ⇐ここで他要因による割り込み
_process_flag = 1;


 1を書く前に多重割込みが入るとフラグが書換えられず、

他要因による_process_tcpipが走ってしまう可能性があります。

こちらが調査して分かりましたので、

現状CMT1の割り込み優先度をEDMAC0の割り込み優先度よりも低くすることで対策していますが、

このような認識で問題ないでしょうか?

(CMT1割り込みの場合は多重割込みが無効状態ですので、上記のような考慮は不要と考えています。)

またT4ライブラリの案内として、上記のような内容はありましたでしょうか。

(見落としていましたら、申し訳ありません。。。)

ご意見いただけますと、幸いでございます。

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

Parents
  • にゃあ少佐

    こんにちはシェルティです。T4ライブラリの設計者です。

    >>このような認識で問題ないでしょうか?

    本件ですが、_process_tcpip()が多重で呼び出されたら直ちに壊れるわけではなく、矢印で示していただいた箇所で多重で割り込んでも特に問題は引き起こしません。よって割込みの優先度を調整しなくても問題ないです。

    >>T4ライブラリの案内として、上記のような内容はありましたでしょうか。

    いえ。ないです。上記のように多重に呼び出しても特に問題は引き起こさないので以下マニュアルの_process_tcpip()の項目にも特に何も書いていないです。

    https://github.com/renesas/rx-driver-package/blob/master/source/r_t4_rx/r_t4_rx_vx.xx/r_t4_rx/doc/ja/r20uw0031jj0111-t4tiny.pdf

    あと、hirakuni45さんもおっしゃられていますが、FreeRTOS+TCPやミドルウェア・OSベンダの有償TCP/IPスタックを使う選択肢もあるように思います。もし理由があれば教えていただけるとありがたいです。T4は2000年頃に原型を作ったものでして、当時の設計のままなので、ちょっと中身が古いです。TLSを増設する方法も自分で考える必要があります。

    以上です

Reply
  • にゃあ少佐

    こんにちはシェルティです。T4ライブラリの設計者です。

    >>このような認識で問題ないでしょうか?

    本件ですが、_process_tcpip()が多重で呼び出されたら直ちに壊れるわけではなく、矢印で示していただいた箇所で多重で割り込んでも特に問題は引き起こしません。よって割込みの優先度を調整しなくても問題ないです。

    >>T4ライブラリの案内として、上記のような内容はありましたでしょうか。

    いえ。ないです。上記のように多重に呼び出しても特に問題は引き起こさないので以下マニュアルの_process_tcpip()の項目にも特に何も書いていないです。

    https://github.com/renesas/rx-driver-package/blob/master/source/r_t4_rx/r_t4_rx_vx.xx/r_t4_rx/doc/ja/r20uw0031jj0111-t4tiny.pdf

    あと、hirakuni45さんもおっしゃられていますが、FreeRTOS+TCPやミドルウェア・OSベンダの有償TCP/IPスタックを使う選択肢もあるように思います。もし理由があれば教えていただけるとありがたいです。T4は2000年頃に原型を作ったものでして、当時の設計のままなので、ちょっと中身が古いです。TLSを増設する方法も自分で考える必要があります。

    以上です

Children
  • 少佐と大佐を間違えないように確認していたら呼び捨てになってしまいました。にゃあ少佐さん、すみません。

  • シェルティさん

    わざわざ気にかけていただき、ありがとうございます。。。
    お返事が遅くなってしまいました。

    T4ライブラリについて、
    懸念していたようなことが起きないこと、理解いたしました。
    教えていただきありがとうございます。

    特に割り込み優先度に条件はないとのことですので、
    他実装との兼ね合いで決定したいと思います。

    選定理由については、

    hirakuni45さんへのリプライでも書いたので、省略いたします。

    今回T4ライブラリを採用させていただいた案件では、
    10年以上前の製品のCPU及びPHY ICのEOL対応が目的となっています。

    要求としてもローカルなネットワーク上でModbus TCP通信できれば十分となっています。
    ですので機能的に、T4ライブラリで必要十分となっています。


    T4ライブラリの新規採用ではありますが、
    新製品ではないため、あまり他には例の無いパターンかと思います。

  • にゃあ少佐さん

    シェルティです、こんにちは。

    選定理由についてありがとうございます。なるほどModbus TCP通信をローカルネットワークで実現されるのですね。確かにT4がリーズナブルなように思いますね。T4自体はここ20年来似たユースケースでいろんなお客様の量産製品に組み込んで実製品に使ってもらえています。Modbus TCP応用も結構な頻度で聞くユースケースですね。また何か不明点ありましたらご質問いただければと思います。

    以上です