RX65Nでプログラムが大きくなるとイーサネットが動作しくなる

開発環境:e2 studio (Version: 2023-01 (23.1.0))
Toolchains:GCC for Renesas RX - 8.3.0.202204

FITDemosの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を削除して処理を削ると、また正常に動作するようになります)

イーサネットが機能しなくなる件について、情報をお持ちであったり、心当たりがある方がいらっしゃいましたら教えていただけると幸いです。
よろしくお願いします。

Parents
  • キャンディさん、こんにちは。NoMaYと申します。

    ちょっと確認させて欲しいのですが、単にファイルを追加しただけで動かなくなったわけでは無いのですよね?つまり、追加したファイルの中のコードは何かしら実行されているのですよね?それとも、それこそ単純にファイルを追加していっただけで、動かなくなってしまうのでしょうか?

    > このアプリに.h、.cファイルを追加していき、プログラムが大きくなってくると、ある時からイーサネットの機能が動かなくなりました。
    > (.h、.cを削除して処理を削ると、また正常に動作するようになります)

    > 追記:CC-RXで同じプロジェクトを作成すると問題なく動作する


    それでも、ひとまず、コンパイラの最適化の観点から試してみることとして、以下のことがあります。(最適化の名称は厳密では無くて、ちょっと疎覚えですけれども。) なお、どれもプログラムの規模の件とは関係が無いのですけれども、CC-RXで動いていたプログラムがGCC for Renesas RXで動かない、という現象に着眼しますと、まずこのあたりから試し始めると思うのです。

    (1) 最適化オプションを -O0、-O2、-O3、-Og、ぐらいで幾つか変えて試してみる(下げてみたり上げてみたりです)
    (2) 分岐最適化(-mrelax)を指定してたら解除してみる
    (3) リンク時最適化(-lto)を指定していたら解除してみる

    あと、ちょっと発想を変えて、以下を試してみることも考えられます。

    (A) CC-RX側で最適化オプションを -optimize=max にしてみる(そうしたらCC-RXでも動かなくなった、という可能性もあります)


  • NoMaYさん、返信ありがとうございます。

    >ちょっと確認させて欲しいのですが、単にファイルを追加しただけで動かなくなったわけでは無いのですよね?
    >つまり、追加したファイルの中のコードは何かしら実行されているのですよね?
    >それとも、それこそ単純にファイルを追加していっただけで、動かなくなってしまうのでしょうか?
    ファイルを追加しただけでファイル内のコードは実行していません。(関数をコールしていない)

    >(1) 最適化オプションを -O0、-O2、-O3、-Og、ぐらいで幾つか変えて試してみる(下げてみたり上げてみたりです)
    効果はありませんでした。

    以下について試してみようと思います。
    検証結果はまた、報告させていただきます。
    >(2) 分岐最適化(-mrelax)を指定してたら解除してみる
    >(3) リンク時最適化(-lto)を指定していたら解除してみる

  • キャンディさん、こんにちは。NoMaYです。

    > ファイルを追加しただけでファイル内のコードは実行していません。(関数をコールしていない)

    そうだったのでしたか。そういうことですと、たぶん私は次に以下のようなことを試すと思うのです。ただ、それで何か手掛かりが掴めるかどうかというと、私自身が試してみる場合も、何とも分からないことですけれども。(また、試している途中で何かに気付いて作戦を変えることもありそうですけれども。)

    (4) リンク順やリンカスクリプトを弄って、追加したファイルのROM/RAMが、それまで動いていたコードの後ろに追加されるだけになるようにする
    (4') たぶん、dataセクションをどう弄るか、というのがややこしそうです

    もっとも、言うは易し、行うは難し、という感じで、そう試してみるだけでも私自身でも頭を抱えそうですけれども。


    あと、手続き的な考え方の他に、RXマイコンのイーサネット周りでROM/RAMの配置にクセがある点として、イーサネット向けDMAバッファだかが16バイトアラインメントされていないといけない、というのがあったと思いますので、その点も気になるところです。

Reply
  • キャンディさん、こんにちは。NoMaYです。

    > ファイルを追加しただけでファイル内のコードは実行していません。(関数をコールしていない)

    そうだったのでしたか。そういうことですと、たぶん私は次に以下のようなことを試すと思うのです。ただ、それで何か手掛かりが掴めるかどうかというと、私自身が試してみる場合も、何とも分からないことですけれども。(また、試している途中で何かに気付いて作戦を変えることもありそうですけれども。)

    (4) リンク順やリンカスクリプトを弄って、追加したファイルのROM/RAMが、それまで動いていたコードの後ろに追加されるだけになるようにする
    (4') たぶん、dataセクションをどう弄るか、というのがややこしそうです

    もっとも、言うは易し、行うは難し、という感じで、そう試してみるだけでも私自身でも頭を抱えそうですけれども。


    あと、手続き的な考え方の他に、RXマイコンのイーサネット周りでROM/RAMの配置にクセがある点として、イーサネット向けDMAバッファだかが16バイトアラインメントされていないといけない、というのがあったと思いますので、その点も気になるところです。

Children
  • NoMaYさん、ありがとうございます。

    .mapの比較はしたのですが、特におかしな点は無いようでした。
    (見つけられないだけかもしれませんが…)

    DMAバッファの件は私の知識ではどうアプローチしたらよいのかよくわかりませんが…
    時間の取れる時に継続調査したいと思います。