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 Reply Children
No Data