RX72M RSK での TCP/IPプロトコルスタック [M3S-T4-Tiny] を使用した ping 疎通確認

こんにちは、KATA_KANと申します。

RX72M RSK において、スマートコンフィグレータでFITのTCP/IPプロトコルスタック [M3S-T4-Tiny] を導入し、

RX72M RSK に実装されている2つのEthernetコネクタに対し、ping疎通を行いたいのですが、上手く行きません。

CH0(ECAT-IN)側に、IPアドレス:192.168.1.3

CH1(ECAT-OUT)側に、IPアドレス:192.168.1.10

PC(Windows10)側に、IPアドレス:192.168.1.100

を設定し、PC側から各CHにpingを送り、疎通を確認したいです。

スマートコンフィグレータで、r_t4_rx、r_ether_rx などを組み込み、コンフィグもそれらしく行ってみたのですが、

そもそも、LANケーブルを挿しているにも関わらず、Ethernet コネクタのLEDが点滅すらしていない為、

根本的に何か間違っているのではないかと感じています。

添付は、現状のソフトウェアコンポーネント設定のレポートと初期化を行っているmain関数(FreeRTOSから実行)なります。

report_20220303_110520.pdf

ビルド環境は、e2studio 7.8.0/CCRX v3.04.00 です。

大変恐縮ですが、ご助言を頂けますと幸いです。

PS. FreeRTOSカーネル側にも、IPアドレスの設定項目がある為、FreeRTOSとM3S-T4-Tinyを同時に使う場合は別途設定が必要だったりするのでしょうか?

  • > NoMaYさん

    はじめまして、こんにちは。

    ご提示いただいたリンクの先のコンフィグを追加したところ、問題なくビルドが出来るようになりました!

    他ツールでも、日本語パスで影響出ることが多いので、基本的に日本語のユーザ名を使いたくないのですが、会社の管理上仕方なく使っていた為、どうしようかと思っていましたが、おかげで助かりました!ありがとうございました!

  • > 他ツールでも、日本語パスで影響出ることが多いので、基本的に日本語のユーザ名を使いたくないのですが
    ですよねー。

    きっとeclipseの開発者はLinuxと同じノリでuserフォルダに入れる仕様にしたのだろうけど、
    まさかWindowsがユーザ名をマルチバイトでも何でもアリの仕様にしていたとは思わなかったのでしょう。

  • >シェルティさん

    ご助言ありがとうございます!

    まず、e2studio を 2022-01版にしてみました(NoMaYさんアドバイスありがとうございました!)

    そのうえで、新規でFreeRTOS(kernel only) 10.4.3-rx-1.0.1 を組みこんだプロジェクトを作成し、上記ガイドに従い、各種FITの導入及び前述のサンプルプログラムを、FreeRTOSのタスクとして起動し、同様にpingを確認しようとしたのですが、案の定すんなりとはいきませんでした。

    ^^>>>user_cb<<< ch:1,eventID = ETHER_EV_LINK_ON

    とエコーバックのメッセージは出るので、リンクの認識はしていると思うのですが、pingは通ってくれません。

    シングルタスクで動かしているつもりなので、ノンブロッキングにする必要はないと思っていたのですが、ノンブロッキングにしないとpingが通らなかったりするのでしょうか?

    引き続きアドバイスを頂けますと幸いです。

  • KATA_KANさん

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

    なるほど、少しまたこちらでFreeRTOSを入れた現物を作ってRX72M RSKの実機で動作確認してみます。FreeRTOSを活用した版のガイドを作ることができると思います。3/16に何かしら回答いたします。

    >>シングルタスクで動かしているつもりなので、ノンブロッキングにする必要はないと思っていたのですが、ノンブロッキングにしないとpingが通らなかったりするのでしょうか?

    いえ、pingのパケットはEtherの割込みをトリガとして割込みコンテキストの中で処理されるのでping応答するはずですね。そのうえで、マルチタスクでTCPのAPIをそれぞれブロッキングで呼び出してもそれぞれping応答とは非同期に正常動作します。(シングルタスクでTCPのAPIをブロッキングで呼び出しても、ももちろんTCPのAPIとpingは非同期に正常動作します(ノンブロッキングでももちろん動きます))

    https://github.com/renesas/rx-driver-package/blob/6dd094bd787cf0e7af2e62ca9421e7f939e06d71/source/r_t4_driver_rx/r_t4_driver_rx_vx.xx/r_t4_driver_rx/src/t4_driver.c#L316

    設計上うまくいくはず、なのですが、実際に現物で組んでみると想定外の何かが起きていたりしますね。また現物を確認して報告いたします。

    以上です

  • KATA_KANさん

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

    FreeRTOS環境でも動作確認OKでした。いくつか不整合はありましたが、非FreeRTOS環境と同じ手順でTCP/IP実装できます。以下ガイドです。

    1. e2 studioで新規プロジェクト作成
     -> RTOSにFreeRTOS(kernel only)を選び、RTOS Versionに10.4.3-rx-1.0.1を選ぶ
     -> Target Board に RSKRX72M を選ぶ
      -> Target Board 選択時に "Download additional boards" を押して最新版のBDF(Board Description File)をダウンロードしておく
     -> Hardware Debugは持っているエミュレータを選択(RSKRX72M同梱なのはE2 Lite)
     -> 終了ボタン
     設定値を以下に示す

    2. スマートコンフィグレータの画面が出る(出ない場合は、プロジェクトエクスプローラで *.scfg をダブルクリックする)
     -> 初回起動時はRX Driver Packageのダウンロードが促されるので最新版をダウンロードしておく
     -> クロックタブでクロック設定値を確認。変更しなくてもOKだが念のため動作OKの状態の設定値を以下に示す

     -> コンポーネントタブで プラスマーク付きの青色キューブアイコンを押し、 r_t4_rx v210 を登録
      -> r_t4_rx の依存コンポーネント(Etherドライバ r_ether_rxも含む)が登録される
      -> r_t4_rx の "Channel number your system has" の値を 1 から 2 に変更 ※1
      -> r_ether_rx の設定を以下に合わせる ※1

    # Configurationsの各項目にカーソルを合わせるとボード毎の設定値が表示されるが、RSKRX72Mの値は間違っているので注意。改善予定。本ガイドのスクリーンショットでの値を使用すること。

      -> 端子タブで、ETHERC_MII0の端子設定を行う # ワーニングが出ているがOK。※1

      -> 端子タブで、ETHERC_MII1の端子設定を行う # ワーニングが出ているがOK。※1

      -> スマートコンフィグレータ上でコード生成ボタンを押す (e2 studio 2021-10以降はこの操作は不要。クリーンビルド時に必要に応じて自動でコード生成する)

    3. main() を 2ch 対応のRX64M用のサンプルで置き換え
     www.renesas.com/.../rx-family-tcpip-embedded-system-m3s-t4-tiny-introduction-guide-firmware-integration-technology
     以下3ファイルを作成中のプロジェクトの\srcフォルダにコピーする。
      \r20an0051xx0210-rx-t4-fit\FITDemos
      \rskrx65n_2mb_tcp_blocking.zip
      \rskrx65n_2mb_tcp_blocking\src\tcp_blocking
       ・main.c
       ・echo_srv_tcp_blocking.c
       ・echo_srv.h
     代わりに元からあったmain()を持っているファイルを削除する。プロジェクト名.c のファイルが存在するはず。
     main()の関数名は、main_task()に変更する
     また、t4_driver.c の 80行目がバグっているので直す
     誤:#include "FreeRTOS_usr_cfg.h"
     正:#include "FreeRTOSConfig.h"
     github.com/.../21
     
    4.デバッガ接続
     e2 studio 画面上部左側の虫アイコンを押す
     エミュレータから給電する設定になっているので、ボードにACアダプタから給電している場合はACアダプタを外す。
     e2 studio 画面上部メニューバーのRenesas Views -> デバッグ -> Renesas Debug Virtual Consol を開く
     ボードの2chのLANコネクタをDHCP有効なネットワークのハブまたはルータに接続
     e2 studio 画面上部の再開ボタンを2回押す
     Renesas Debug Virtual Consolに以下のようなログが出ればOK。
     同じネットワークに接続されたPCからDHCP.ipaddrにping送信することで導通確認可能

    ^^>>>user_cb<<< ch:1,eventID = ETHER_EV_LINK_ON
    ^^>>>user_cb<<< ch:0,eventID = ETHER_EV_LINK_ON
    ^^>>>user_cb<<< ch:1,eventID = DHCP_EV_INIT
    ^^>>>user_cb<<< ch:0,eventID = DHCP_EV_INIT
    ^^>>>user_cb<<< ch:1,eventID = DHCP_EV_LEASE_IP
    DHCP.ipaddr[4] 10.166.39.36
    DHCP.maskaddr[4] 255.255.252.0
    DHCP.gwaddr[4] 10.166.36.1
    DHCP.dnsaddr[4] 10.166.255.133
    DHCP.dnsaddr2[4] 10.200.33.1
    DHCP.macaddr[6] 74:90:50:00:79:79
    DHCP.domain[0]

    ^^>>>user_cb<<< ch:0,eventID = DHCP_EV_LEASE_IP
    DHCP.ipaddr[4] 10.166.38.161
    DHCP.maskaddr[4] 255.255.252.0
    DHCP.gwaddr[4] 10.166.36.1
    DHCP.dnsaddr[4] 10.166.255.133
    DHCP.dnsaddr2[4] 10.200.33.1
    DHCP.macaddr[6] 74:90:50:10:FE:77
    DHCP.domain[0]


    ※1: 将来ボードに合わせて自動設定されるよう改善予定。

    以上です

  • >シェルティさん

    ガイド作成ありがとうございます!

    ガイド通りに作成したところ、OSなしの場合と同様FreeRTOSありでもping導通が出来ました!

    私の方では、以下のようにFreeRTOSの機能でタスクを作成し、自動生成されたタスク関数(ethernet_task())内で、サンプルプログラムmain.c内のmain()をethernet_main() に変更した関数を呼んでいた為か上手くいきませんでした。(他にもヒープサイズの設定変更やセクションの変更が必要になりました)

    FreeRTOSの使い方の問題のような気がしますので、こちらでお聞きするのも筋違いかもしれないのですが、main_task() 以外のタスクから呼んでも同じように動作可能でしょうか?

  • KATA_KANさん

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

    うまく動いてよかったです。KATA_KANさんが試されたようにスマートコンフィグレータで生成したethernet_task()でも動作するはずですね。動作しない理由は「セクションの変更」にありそうです。非常に分かりづらいハードの制約なのですが、Ether専用のDMAがRXマイコンには入っておりまして、その転送先のアドレスが32バイトのアライメントが取れていないといけません。具体的には以下セクション設定において、B_ETHERNET_BUFFERS_1が32バイトアライメントが取れてないといけません。コンパイル時にHardwareDebugフォルダに生成されるマップファイル(*.map)でB_ETHERNET_BUFFERS_1が配置されているアドレスを確認いただけますか。

    ガイド通りに作るとセクションは以下のようになります。

    Etherのバッファ(B_ETHERNET_BUFFERS_1)とディスクリプタ(B_RX_DESC_1, B_TX_DESC_1)は内蔵拡張RAM(0x00800000)に移動させてしまうのがおすすめです。

    ちなみに、ディスクリプタの先頭も16バイトのアライメントが必要です。バッファに続けてセクション配置しておけば特に気にすることはないですが、順番を手動で変えたりする際に結構はまりますね。この制約は多くのEtherコントローラ内蔵のルネサスマイコンに共通です。

    すごく単純化した説明ですが、このEtherコントローラは送受信ディスクリプタに書いてある番地に(から)DMA転送される(する)というカラクリになっています。メモリウィンドウでディスクリプタとバッファを開いておきリアルタイムモニタをONにしておくと、受信したパケットがB_ETHERNET_BUFFERS_1に流れてきて転送完了するとEther割込みが発生します。このあたりのカラクリも余裕があればハードウェアマニュアルを見ながら動作を勉強されると良いかもしれません。

    もし上記対応で動作しない場合、違う原因があるかもしれません。その場合はまたこちらで実機動作確認してみようと思います。

    以上です

  • >シェルティさん

    まさにドンピシャのご指摘でした!

    セクションを上記のように変更したところ、上手くpingが通るようになりました。ありがとうございました!

    セクションのエラーが出ていた為、B_ETHERNET_BUFFERS_1以降をアライアンスを気にせずR_8の後ろに直接割り振るようにしたのが良くなかったです…よくわからないで変更するのはいかんですね。

    ひとまず一通りの土台を動かすことが出来たので、ここから自前のロジックを組み込んで動かしていこうと思います。重ね重ねありがとうございました!

  • ×アライアンス 〇アライメント です。うろ覚えなのがバレますねorz

  • KATA_KANさん

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

    ご連絡ありがとうございます。また何か課題が出ましたら教えてください。できる限り支援いたします。

    以上です