T4ライブラリ 高速通信(_process_tcpipの呼び出し間隔について)

いつも皆様にはお世話になります。

T4ライブラリの仕様について、ひとつ質問がありましたのでよろしくお願いします。

現在T4ライブラリを使用して(使用しているマイコン:SH4)複数ポートの接続で

高速通信を行おうと現在プログラムを組んでおり、_process_tcpipの呼び出し間隔を見ると

10ms毎に呼ばれており(t4_dirver.c)、APIの処理が行われる間隔が6~9msかかります。

そこで質問になりますが、この、_process_tcpip関数の呼び出し間隔をこちらで(自分が自作した関数内で)呼び出すことは

問題ないのでしょうか?(もとの(t4_dirver.c)10ms毎に呼び出されていたタイマー割り込み部分の_process_tcpip関数はコメントアウト(無効)にして

自作したタイマー割り込みで呼び出す)

また問題ない場合は最小設定は何ミリ秒になりますでしょうか。

またAPI実行時のタイミングで_process_tcpip関数呼び出しも問題ないんでしょうか。

 

以上質問ばかりになりましたがよろしくお願いします。

  • こんにちは

    質問の回答でなくて申し訳ないですが、使用マイコンがSH4というのは間違いないでしょうか。書込みされているフォーラムがRXですので…念のため。

    RX用
    www.renesas.com/.../m3s-t4-tiny-for-rx.html

    SH、V850、M16C、H8S対応
    www.renesas.com/.../m3s-t4-tiny.html
  • 申し訳ございません。
    使用しているマイコンはSH4です 投稿するフォーラムを間違えました
  • rkshさん

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

    このソフト、私が書きました。(正確には引き継ぎ品のため、ところどころ書きました)

    _process_tcpip()を短い間隔で呼び出していただいて問題ない設計になってます。
    t4_driver.c で tcpudp_get_time()という関数がありそこで10msのカウンタを戻すことにしてあります。
    このカウンタが実時間で10msを刻んでいれば、_process_tcpip()が短くなってもOKです。

    ただ、_process_tcpip()を短くしすぎると今度はmain()にプログラムカウンタが回ってこなくなると思いますので
    システムの動作が維持できる程度に短くするのはとどめておいてください。
    またモータ制御やUART通信など常に動き続ける必要がある処理の割り込み優先度を高く設定して、
    _process_tcpip()が動作する割り込み処理に対して多重割り込みすると良いです。

    また、_process_tcpip()の中身を見ながらデバッグしたほうが良い場合もあると思います。
    もし中身を見ながらデバッグをされる場合はまたご連絡ください。
    ソースコード提供します。

    以上です
  • シェルティ 様
    回答ありがとうございます
    _process_tcpip()をもう少し早くまわして実行したいと思います。
    というのも現在 一個のLANコネクタから5通信同時にクライアント接続を行い、外部のホストに接続して
    約50msでの定周期送受信を行おうと現在プログラム設計(現在は確認作業中)していました。
    _process_tcpip()を1ms程度の間隔で呼び出してみたんですが、通常のデータの送受信ではポーリング処理等に
    問題はなかったのですが、例えば接続先のパソコンのLANに接続していない(LANケーブルが接続されてない)時に
    ARP要求で失敗したときにポーリング処理(main())がおっついていないときが多々あって、ARP要求が解決したら
    SYN送信等失敗してもポーリング処理部に問題はなかったです。ARP要求を送信したときに、受信待機で固まる?
    ことって考えられるんでしょうか。やっぱり中身(、_process_tcpip())を見ながら少しデバッグしたいと思います(LAN通信のことを完全にマスターしていないので、当方ががんばってデバッグしないといけないですけど...)
    マイコンで自分が現在計画している 5ポート同時送受信(約50ms)が可能かもう少し調査してみます

    マイコンから定周期送信(50ms)複数ポート送信している状態で、外部からデータ受信があり応答を返すような
    プログラムを作っていますが、外部から30byteのデータを何回(100~200ms?)かなげていると、
    マイコンから定周期で送信していたデータが送信されないことがあり、ブレイクをとめるとポーリング処理部(main)にもいっていなく、ステップ実行するとイーサネットタイマー(t4_driver.c)の初期設定にいくことがあり
    その後はいつもどおりに ポーリング処理部(main)いくこともありました。

    以上 長文になり申し訳ございません。
  • rkshさん

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

    いくつか問題が絡んでいそうですね。

    5ポート同時送受信は特に問題ないはずです。
    ARP解決ができないとAPI呼び出し時にしばらくAPIから戻ってこなくなります。

    まず第一にですが、実製品応用の場合はAPIはノンブロッキングコール(TMO_NBLK指定)すると良いです。
    こうすることでAPI内部で処理完了を待つことが一切なくなります。
    config_tcpudp.cのtcp_ccep[]構造体の1メンバが1通信端点となっており、通信端点毎にコールバック関数を設定できます。
    処理が完了するとこのコールバック関数が呼ばれるのでそこで続きの処理をしましょう。
    接続完了したら受信、受信完了したら送信、送信完了したら受信、受信完了して受信データ内部に切断コマンドが入っていたら切断、切断完了したら接続待ち、みたいにつくると延々と接続・通信・切断を繰り返すアプリが作れます。

    第二にですが、お使いの環境がSH4マイコン+LANコントローラの構成であるとして、
    Etherコントローラからの割り込み信号出力をSH4マイコン側のINT端子に入れて
    割り込みが入ったら即座に送受信処理を行う(_process_tcpip()を呼び出す)ようにしましょう。

    第三にですが、多重割り込みを使いましょう。
    Etherコントローラからの割り込みから_process_tcpip()を呼び出すとTCP/IP処理が割り込みコンテキスト内で
    実行されることになります。TCP/IPの処理は重たい上にLANコントローラから受信データが次々上がってくる
    状況だといつまでも処理が終わらないことがあります。
    内部的にはLANコントローラからの受信データがなくなる(受信データが全部処理完了する)まで
    ループするように作ってあります。

    ですのでこの間他の処理(たとえばモータを回すための定周期処理やA/Dの取り込み、UART通信など)を
    実行する必要がある場合は、LANコントローラからの割り込み優先度を低く設定し、
    その他処理の割り込み優先度を高く設定し、LANコントローラからの割り込み処理を受け付ける
    割り込み関数内で割り込み許可(多重割り込み許可)してください。

    このあたりを気を付けて作り込めば5ポート同時送受信は特に問題ないはずです。

    以上です
  • 回答遅くなり、申し訳ございません。
    シェルティ さんがおっしゃった様に、多重割込みを使用したプログラム設計を行いました。ありがとうございます。
    最後に質問したいことが有り、高速で通信(例えば10ms程度で100byte程度)をした場合(複数通信)
    例外エラー(SH4でいうと_INT_Illegal_slot_FPU()呼び出し)が発生することはありえるんでしょうか。
    (予想では処理があまりにも早い為、間に合わなかった場合(APIの処理がたまりにたまった場合)どのような
    処理になりますでしょうか。)
    すみませんが宜しくお願い致します。