RX用FITのUSBドライバをCS+6環境でコンパイル最適化レベル2以上にしたときの不具合

■経緯について
 CS+4環境で開発済みであり安定動作できているRX71M用FWプログラムがあります。
 このFWを最新のCS+6環境に置き換えるための作業過程で、USBホストドライバで
 不具合事象が発生しました。

■不具合事象
 CS+6(V6.01.00)/ビルドツールCC-RX V2.08.00環境でビルドしたFWでは、
 USBメモリの認識ができなくなってしまったことが判明。再現率100%

■調査状況について
 ・再現率100%のため、切り分け調査を開始
 ・切り分け調査した結果、USBホストドライバの一部ソースコードの最適化
  コンパイルが影響していることが判明。

■確認済み環境
 CS+4(V4.00.00)/ビルドツールCC-RX V2.05.00:問題なし
 CS+6(V6.00.00)/ビルドツールCC-RX V2.07.00:不具合事象あり
 CS+6(V6.01.00)/ビルドツールCC-RX V2.08.00:不具合事象あり

■USBHドライバの対象ソースコード
 \rx_fit\FITModules\r_usb_basic\src\hw
  - r_usb_creg_access.c
  - r_usb_hreg_access.c

■最適化レベル毎の再現性
 最適化レベル2(-optimize=2) コード・サイズ重視の最適化(-size) : NG(不具合再現)
 最適化レベル2(-optimize=2) 実行性能重視の最適化(-speed)   : NG(不具合再現)
 最適化レベル1(-optimize=1) コード・サイズ重視の最適化(-size) : OK
 最適化レベル1(-optimize=1) 実行性能重視の最適化(-speed)   : OK
 最適化レベル1(-optimize=1) コード・サイズ重視の最適化(-size) : OK
 最適化レベル0(-optimize=0)                                             : OK

■不具合の出るコードの例と暫定対策の例
 \rx_fit\FITModules\r_usb_basic\src\hw
  - r_usb_hreg_access.c
  void hw_usb_hset_rwupe (usb_utr_t *ptr, uint16_t port)
  {
      if (USB_PORT0 == port)
      {
      #if 0 // ★NG 元のコード
          ptr->ipp->DVSTCTR0.WORD |= USB_RWUPE;
          #else // ★OK こちらの書き方なら問題なし
          ptr->ipp->DVSTCTR0.WORD = ptr->ipp->DVSTCTR0.WORD | USB_RWUPE;
          #enfif
      }
  }

■今後の調査について
 引き続き、根本原因を究明し、対策の検討を進めたいと考えています。
 ・コンパイラのエラッタ確認(既知なのかどうか)
 ・ルネサスが公開している最新ドライバ(FITモジュール)の確認
 ・最適化によるアセンブラコードの違いを確認
 ・場合によってはソースコードを修正して対応する
 ・その他全てのドライバの確認(共通問題の可能性が高い)

何か情報お持ちの方がいましたら教えていただきたく、よろしくお願いいたします。

以上

Parents
  • 業務多忙のため細かいご報告できず申し訳ございません。簡単に状況報告させていただきます。
    ・FW全体を最適化レベル2+USBドライバ修正(st_usb0に__evenaccess追加) ⇒ OK(評価不十分ですが一応OK)
    ・FW全体を最適化レベル1+USBドライバ修正(st_usb0に__evenaccess追加) ⇒ NG(USBメモリ接続するとフリーズ)
    となってしまいました。とりあえず、USBドライバだけの問題ではないようで、、引き続き調査してみます。

    今後、コンパイラ(CC-RX)の最新バージョンを使う場合、既存の(古い)ドライバはもうそのままでは使えないであろうという雰囲気がしてきました。。。
Reply
  • 業務多忙のため細かいご報告できず申し訳ございません。簡単に状況報告させていただきます。
    ・FW全体を最適化レベル2+USBドライバ修正(st_usb0に__evenaccess追加) ⇒ OK(評価不十分ですが一応OK)
    ・FW全体を最適化レベル1+USBドライバ修正(st_usb0に__evenaccess追加) ⇒ NG(USBメモリ接続するとフリーズ)
    となってしまいました。とりあえず、USBドライバだけの問題ではないようで、、引き続き調査してみます。

    今後、コンパイラ(CC-RX)の最新バージョンを使う場合、既存の(古い)ドライバはもうそのままでは使えないであろうという雰囲気がしてきました。。。
Children
  • ※すみません。先ほどの報告に誤りがありました。
    ■状況報告(訂正版)
    ・FW全体を最適化レベル2+USBドライバ修正(st_usb0に__evenaccess追加) ⇒ OK(評価不十分ですが一応OK)
    ・FW全体を最適化レベル1+USBドライバ修正(st_usb0に__evenaccess追加) ⇒ NG(起動中フリーズ、USB未接続でもフリーズ)
    となってしまいました。とりあえず、USBドライバだけの問題ではないようで、、引き続き調査してみます。
    (FITだけでなくFIT以外のドライバも多くありますので・・・)

    ■今後について
    ・上記の調査を続けます。
    ・コンパイラ(CC-RX)の最新バージョンを採用する場合、既存の(古い)ドライバはもうそのままでは使えないことがわかりましたので、原因や影響範囲をしっかり把握したうえで、相応の評価を進めることを検討してみます。
    ・最終的には・コンパイラ(CC-RX)またはCS+6を使うのをやめるという結論になるかもしれませんが。。