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となっており、バイトアクセスしている模様(?)

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

    引き続きご協力お願いできれば幸いです。
    以上
  • わわいです
    バイトアクセスで書き込まれているのが原因っぽいですね
    volatileに__evenaccess ついてるのにこれってことはコンパイラのバグの可能性がありますね
Reply Children
  • はい、コンパイラのバグのように思えます。USBドライバに限らず全てのドライバへの影響があると考えなくてはいけないので、、、引き続き情報収集してから今後の対応を検討したいと思います。