開発環境:e2 studio (Version: 2023-01 (23.1.0))Toolchains:GCC for Renesas RX - 8.3.0.202204FITDemosのrskrx65n_2mb_udp_nonblockingを参考にUDPのエコーサーバーを作成しました。r_t4_rxのDHCPはEnableに設定しており、正常にIPが割り当てられエコーサーバーも正常に動作していました。このアプリに.h、.cファイルを追加していき、プログラムが大きくなってくると、ある時からイーサネットの機能が動かなくなりました。具体的にはDHCPのDiscoveryが送信されなくなりました。この時イーサネットの開始に必要な以下の処理は成功しています。lan_open() →成功tcpudp_get_ramsize() →バッファサイズ正常tcpudp_open() →成功また、メインループは正常に動いていている(LED点滅)ことを確認しています。(.h、.cを削除して処理を削ると、また正常に動作するようになります)イーサネットが機能しなくなる件について、情報をお持ちであったり、心当たりがある方がいらっしゃいましたら教えていただけると幸いです。よろしくお願いします。
キャンディさんこんにちは。
以前に実装して、長らく使っていなかった、RX71M の Ethernet 自前のアプリを自分も試してみました。(T4ライブラリ利用)
Toolchain: rx-elf-gcc.exe (GCC_Build_20200327) 8.3.0.202002-GNURX 20190222
アプリはHTTPサーバーで、前は動作していたと思うのですが、DHCP の取得でタイムアウトします。
アプリは、DHCP がタイムアウトすると、指定の IP アドレス(192.168.0.20)を設定するような実装になっています。
ping は loss=0 で通るのですが、HTTPサーバーは動作していません。
テストしたソースはかなり古く、周辺のコードが改修された為、その影響によるのかもしれません。(現在調査中)
もう少し調べてみますが、DHCP が取得出来ない不具合が同じなのが気になります・・、何か進展がありましたら、自分もポストします。
http://www.rvf-rc45.net/wordpress/?p=3023
※上記ブログ記事は、gcc-6.4.0 を自分でビルドして利用していた頃のものです。
---
自分は、ドライバーのソースを修正して、EDMAC(イーサーネット専用DMAC)のメモリアドレスが32バイト境界になるようにしています。
元ソースは、EDMAC が使う構造体に専用のセクションを割り当てて、必ず32バイト境界になるような実装だったと思います。
hirakuni45さん、調査までしていただいてありがとうございます。NoMaYさんも仰っていたDMA周りに何かあるのかもしれませんね。(この辺りはよくわかっていないのですが…)時間の取れる時に継続調査したいと思います。
キャンディさん
こんにちは、シェルティです。ルネサスの中の人です。件のT4ライブラリの設計者です。
NoMaYさんやhirakuni45さんにご指摘いただいている、EDMAC関連のデータ置き場のアライメントが気になりますね。実はGCC版だとスマートコンフィグレータでこのあたりのアライメントが調整できず、ユーザが自力でリンカスクリプトを調整する必要があります。
キャンディさんが作られた直後はたまたまアライメントが取れてて、コード追加するにつれてアライメントが取れなくなり動かなくなったのでは、と思います。
以下、シェルティがプロジェクト新規作成してみたところですが、B_ETHERNET_BUFFERS_1(32バイトアライメントが必要)とB_TX_DESC_1とB_RX_DESC_1(16バイトアライメントが必要)がアライメントが取れていない位置に配置されています。
アライメントの調整についてはEtherドライバの資料に記載がありますのでご参照ください。
https://github.com/renesas/rx-driver-package/blob/master/source/r_ether_rx/r_ether_rx_vx.xx/r_ether_rx/doc/ja/r01an2009jj0123-rx-ether.pdf
⇒5.1.1 GCC for Renesas RX のセクション設定例
以上です
シェルティさん、ありがとうございます。明日にでも試してみて結果報告します。