■経緯について 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モジュール)の確認 ・最適化によるアセンブラコードの違いを確認 ・場合によってはソースコードを修正して対応する ・その他全てのドライバの確認(共通問題の可能性が高い)
何か情報お持ちの方がいましたら教えていただきたく、よろしくお願いいたします。
以上
こんにちは
CC-RXにおけるビット操作命令の生成についてV2.06.00で仕様変更がされていたようです。
【リビジョンアップ】RXファミリ用C/C++コンパイラパッケージ V2.06.00
⇒ 2.7 その他改善
(1) ビット操作命令の出力
もしかしてマニュアルのビット操作命令出力の条件に合致したりしてないでしょうか。
CC-RX コンパイラ ユーザーズマニュアル
⇒ 11.5.4 V2.06 以降【V2.05 以前からの変更点】
(1) ビット操作命令の出力を制御する方法の導入