CC-RX #pragma bit_order left

はじめまして。ふざけたHNですみません。
どこにポストしてよいかわからず、本フォーラムにポストさせていただきました。

◆環境
CS+ for CC V7.00.00
CC-RX 2.08.00
RSKRX231
an-r01an2805ju0110-rx-rscan.zip/FITDemos/rscan_demo_rx231

◆CS+プロジェクト作成方法
新規に空のR5F52318AxFPアプリケーションを作成して
rscan_demo_rx231/demo/
rscan_demo_rx231/r_bsp/
rscan_demo_rx231/r_config/
rscan_demo_rx231/r_rscan_rx/
を再帰深さ8でファイルカテゴリにドロップ。

◆プロパティ
●共通オプション
命令セット・アーキテクチャ   RXv2アーキテクチャ(-isa=rxv2)
データのエンディアン      Little-endianデータ(-endian=little)
                     と
                Big-endianデータ(-endian=big)
                   でコード生成を比較
ビットフィールドメンバの並び順 右から割り付け(-bit_order=right)
●コンパイル・オプション
Cソース・ファイルの言語    C(C89)(-lang=c)
最適化レベル          0(-optimize=0)
アセンブリ・ソース・ファイルを出力する
                はい(-output=src)

◆試行
r_rscan_rx/src/r_rscan_rx.c
R_CAN_SendMsg()

  msg_regs[i].PTR.BIT.DLC = p_txmsg->dlc;
のコード生成を
-endian=littleと-endian=bigで比較しました。

◆期待値
r_rscan_rx/src/r_rscan_rx_private.h

#pragma bit_order left
としているため、両者に差異はないはずです。

◆結果
●-endian=little
;  939 msg_regs[i].PTR.BIT.DLC = p_txmsg->dlc;
  .LINE "..\r_rscan_rx\src\r_rscan_rx.c",939
  MOV.L  1CH[R0], R1
  MOVU.B 08H[R1], R1
  SHLL    #04H, R1
  MOV.L  14H[R0], R2
  SHLL    #04H, R2
  ADD    04H[R0].L, R2
  MOVU.B  07H[R2], R3
;       ~~
  AND    #0FH, R3
  OR      R1, R3
  MOV.B  R3, 07H[R2]
;        ~~
●-endian=big
;  939 msg_regs[i].PTR.BIT.DLC = p_txmsg->dlc;
  .LINE "..\r_rscan_rx\src\r_rscan_rx.c",939
  MOV.L  1CH[R0], R1
  MOVU.B 08H[R1], R1
  SHLL    #04H, R1
  MOV.L  14H[R0], R2
  SHLL    #04H, R2
  ADD   04H[R0].L, R2
  MOVU.B 06H[R2], R3
;        ~~
  AND   #0FH, R3
  OR     R1, R3
  MOV.B  R3, 06H[R2]
;         ~~
#include <assert.h>等しているためオリジナルとは行がずれています。

◆疑問
-endian=bigでのビルドではDLCが8ではなく0となって
内部ループバックがうまく動作してくれません。
何か重大な勘違いがあるのかもしれませんが、
見当がつきません。

識者の方々、ご教示お願い致します。

Parents
  • hogohogeさん、こんにちは。NoMaYと申します。

    ひとつ気になることがあります。UMに以下の文章があるのですが、これは、ひょっとして、I/Oレジスタは常にリトルエンディアンアクセス(或いはビッグエンディアンアクセス)固定ということかもしれません。

    もしそうだとすると、FITのソースに__evenaccessの記述が欠けていることが原因かもしれません。ただ、自分自身、これをどうやって検証すれば良いか分かっていないこともあり、不確かな話でもあります、、、どうやって調べればよいのかな、、、

    RX230グループ、RX231グループ ユーザーズマニュアル ハードウェア編
    Rev.1.20 2018.09
    www.renesas.com/jp/ja/doc/products/mpumcu/doc/rx_family/r01uh0496jj0120-rx231.pdf
    109P

    2.5.2 I/O レジスタアクセス
    I/Oレジスタはビッグエンディアン、リトルエンディアン設定に関わらず、固定アドレスに配置されています。したがってI/Oレジスタへのアクセスは、エンディアン変更の影響を受けません。I/O レジスタの配置については、各章のレジスタの説明を参照してください。

Reply
  • hogohogeさん、こんにちは。NoMaYと申します。

    ひとつ気になることがあります。UMに以下の文章があるのですが、これは、ひょっとして、I/Oレジスタは常にリトルエンディアンアクセス(或いはビッグエンディアンアクセス)固定ということかもしれません。

    もしそうだとすると、FITのソースに__evenaccessの記述が欠けていることが原因かもしれません。ただ、自分自身、これをどうやって検証すれば良いか分かっていないこともあり、不確かな話でもあります、、、どうやって調べればよいのかな、、、

    RX230グループ、RX231グループ ユーザーズマニュアル ハードウェア編
    Rev.1.20 2018.09
    www.renesas.com/jp/ja/doc/products/mpumcu/doc/rx_family/r01uh0496jj0120-rx231.pdf
    109P

    2.5.2 I/O レジスタアクセス
    I/Oレジスタはビッグエンディアン、リトルエンディアン設定に関わらず、固定アドレスに配置されています。したがってI/Oレジスタへのアクセスは、エンディアン変更の影響を受けません。I/O レジスタの配置については、各章のレジスタの説明を参照してください。

Children
  • NoMaY様、hogohogeと申します。
    早速のご返信ありがとうございます。

    ご指摘のありました__evenaccessですが、
    r_rscan_rx_private.h内のすべての構造体および共用体に__evenaccess宣言を付加したところ、生成されるアセンブラソースもbigとlittle endianで差異が無くなり、big endianで内部ループバックが動作致しました。

    的確なご指摘大変ありがとうございます。
    SHからの移行でbig endian必須なもので、助かりました。
  • hogehogeさん、NoMaYさん

    こんにちは、シェルティです。

    私はRXマイコン関連のデバイスドライバ群(RX Driver Package)開発や
    関連ルール(FIT: Firmware Integration Technology)整備を推進しております。

    RSCANの開発元に確認し、__evenaccess追加が正しいことを確認しました。
    また次版で改定することも確認しました。次版のリリース時期は計画中です)

    お手数をおかけして申し訳ありません。
    またRXマイコン関連のデバイスドライバ群で不整合を見つけたらご連絡いただけますと幸いです。

    RX Driver Package最新版は以下から入手可能です。
    www.renesas.com/.../rx-driver-package.html

    以上です
  • シェルティ様
    はじめまして。hogohogeと申します。

    お忙しい中、迅速なご対応ありがとうございます。

    よろしくお願い致します。