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
  • 反応ありがとうございます。
    コンパイル結果のコードを貼り付けさせていただきます。
    私はアセンブラコード不慣れなのでマニュアル見ながら細かく確認
    していこうと考えていました。

    ■対象関数(例として1つ)
    \hw\r_usb_hreg_access.c
    -----------------------------------------------------------------
    L.55 void hw_usb_hset_rwupe (usb_utr_t *ptr, uint16_t port)
    L.56 {
    L.57 if (USB_PORT0 == port)
    L.58 {
    L.59 ptr->ipp->DVSTCTR0.WORD |= USB_RWUPE;
    L.60 }
    L.61 }
    -----------------------------------------------------------------

    \r_bsp\mcu\rx71m\register_access\iodefine.h
    -----------------------------------------------------------------
    struct st_usb0 {
    ...(省略)
    union {
    unsigned short WORD;
    } DVSTCTR0;
    ...(省略)
    };

    #define USB0 (*(volatile struct st_usb0 __evenaccess *)0xA0000)
    -----------------------------------------------------------------

    ■CS+6(V6.01.00)/ビルドツールCC-RX V2.08.00】
     最適化なし:
      _hw_usb_hset_rwupe:
    .STACK _hw_usb_hset_rwupe=12
    .LINE "...\hw\r_usb_hreg_access.c",55
    SUB #08H, R0
    MOV.L R1, 04H[R0]
    MOV.W R2, 02H[R0]
    .LINE "...\hw\r_usb_hreg_access.c",59
    MOV.L 04H[R0], R1
    MOV.L 08H[R1], R1
    MOV.W 08H[R1], R2
    BSET #07H, R2
    MOV.W R2, 08H[R1]
    RTSD #08H

     最適化レベル1:
      _hw_usb_hset_rwupe:
    .STACK _hw_usb_hset_rwupe=4
    .LINE "...\hw\r_usb_hreg_access.c",55
    MOV.L 08H[R1], R1
    .LINE "...\hw\r_usb_hreg_access.c",59
    MOV.W 08H[R1], R2
    BSET #07H, R2
    MOV.W R2, 08H[R1]
    RTS

     最適化レベル2:
      _hw_usb_hset_rwupe:
    .STACK _hw_usb_hset_rwupe=4
    .LINE "...\hw\r_usb_hreg_access.c",55
    MOV.L 08H[R1], R1
    MOV.L #00000080H, R2
    .LINE "...\hw\r_usb_hreg_access.c",59
    OR 08H[R1].UB, R2
    MOV.B R2, 08H[R1]
    RTS

    ■CS+4(V4.00.00)/ビルドツールCC-RX V2.05.00】
     最適化レベル2:
      _hw_usb_hset_rwupe:
    .STACK _hw_usb_hset_rwupe=4
    .LINE "...\hw\r_usb_hreg_access.c",55
    CMP #00H, R2
    BNE L12
      L11: ; if_then_bb
    .LINE "...\hw\r_usb_hreg_access.c",59
    MOV.L 08H[R1], R1
    MOV.W 08H[R1], R2
    BSET #07H, R2
    MOV.W R2, 08H[R1]
      L12: ; return
    .LINE "...\hw\r_usb_hreg_access.c",61
    RTS

    ■考察
     CS+6の最適化レベル2だけがBSET命令を使わないコードになっているようで、
     代わりにMOV.Bとなっており、バイトアクセスしている模様(?)

    ■今後について
     アセンブラに不慣れなため、マニュアル見ながら詳しく確認してみたいと思います。
     また、対象のレジスタについてもハードウェアマニュアルなどで再確認してみたいと
     思います。

    引き続きご協力お願いできれば幸いです。
    以上
  • こんにちは

    CC-RXにおけるビット操作命令の生成についてV2.06.00で仕様変更がされていたようです。

    【リビジョンアップ】RXファミリ用C/C++コンパイラパッケージ V2.06.00

    ⇒ 2.7 その他改善

      (1) ビット操作命令の出力

    もしかしてマニュアルのビット操作命令出力の条件に合致したりしてないでしょうか。

    CC-RX コンパイラ ユーザーズマニュアル

    ⇒ 11.5.4 V2.06 以降【V2.05 以前からの変更点】

      (1) ビット操作命令の出力を制御する方法の導入

  • わわい様ありがとうございます。V2.06.00の仕様変更「(1) ビット操作命令の出力を制御する方法の導入」の影響は間違いなさそうです。ビット操作命令出力の条件に合致しており、最適化しているためコンパイラ判断によるものとなっていました。
    とはいえ、evenaccessを指定しているにもかかわらずバイトアクセスになってしまっているのはコンパイラのバグのように思えます。
  • 先ほどの返信、じま様宛てでした。。。失礼しました。
    じま様わわい様ありがとうございます。引き続きお付き合いいただけたら幸いです。
  • FITのUSBドライバのレジスタ制御部分は多くの場所でNGでした。暫定対策としては最適化レベルを2ではなく1にしておこうと思います。
    本件、コンパイラのバグの可能性が高いと思うのですが、この投稿内容はルネサスの開発担当者の方に伝わるものでしょうか?

    今後の進展度合いによってはCS+6の利用は控えて、安定動作できているCS+4のまま開発を進めることも検討しようかと、正直悩んでいるところです。CS+6を利用する場合、すべてのドライバの動作実績や信頼性も白紙に戻ってしまうので、評価しなおす覚悟をしなければ。。。
  • こんにちは

    Renesas社員も本サイトを参照はされていますが、公式見解をここで発表することは無いと考えられます。製品開発に関わる問題であればRenesasの正規問合せ窓口へ連絡して正式回答をもらっておくのが良いと思います。
    開発環境・開発ツールの技術に関するお問合せ
    support.renesas.com/.../new
Reply
  • こんにちは

    Renesas社員も本サイトを参照はされていますが、公式見解をここで発表することは無いと考えられます。製品開発に関わる問題であればRenesasの正規問合せ窓口へ連絡して正式回答をもらっておくのが良いと思います。
    開発環境・開発ツールの技術に関するお問合せ
    support.renesas.com/.../new
Children
No Data