はじめまして。ふざけたHNですみません。どこにポストしてよいかわからず、本フォーラムにポストさせていただきました。
◆環境CS+ for CC V7.00.00CC-RX 2.08.00RSKRX231an-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.cR_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となって内部ループバックがうまく動作してくれません。何か重大な勘違いがあるのかもしれませんが、見当がつきません。
識者の方々、ご教示お願い致します。
hogohogeさん、こんにちは。NoMaYと申します。ひとつ気になることがあります。UMに以下の文章があるのですが、これは、ひょっとして、I/Oレジスタは常にリトルエンディアンアクセス(或いはビッグエンディアンアクセス)固定ということかもしれません。もしそうだとすると、FITのソースに__evenaccessの記述が欠けていることが原因かもしれません。ただ、自分自身、これをどうやって検証すれば良いか分かっていないこともあり、不確かな話でもあります、、、どうやって調べればよいのかな、、、RX230グループ、RX231グループ ユーザーズマニュアル ハードウェア編Rev.1.20 2018.09www.renesas.com/jp/ja/doc/products/mpumcu/doc/rx_family/r01uh0496jj0120-rx231.pdf109P「2.5.2 I/O レジスタアクセスI/Oレジスタはビッグエンディアン、リトルエンディアン設定に関わらず、固定アドレスに配置されています。したがってI/Oレジスタへのアクセスは、エンディアン変更の影響を受けません。I/O レジスタの配置については、各章のレジスタの説明を参照してください。」