SH-2A 基板 (9)

グローバル変数の追加/削除によりデータ領域の配置が変化したプログラムをビルド/ダウンロード/実行した場合に挙動がおかしくなる現象が見られたので、オペランド・キャッシュをパージするタイミングを変更しました。
これまでは、「resetprg.c」ファイル中の PowerON_Reset_PC() 関数内の main() 関数呼び出しの直前でパージしていましたが、初期値付き変数を初期化する _INITSCT() 関数呼び出しの直前の位置に移動しました。
具体的には下のリストのようになります。

void PowerON_Reset_PC(void)
{
    set_vbr((void *)((_UBYTE *)&INT_Vectors - INT_OFFSET));

    set_fpscr(FPSCR_Init);

  OCache_All_Purge(); // --- (追加) ---
  Cache_Init();       // --- (追加) ---
    
    _INITSCT();

// --- (中略) ---

    set_cr(SR_Init);
 
    main();

// --- (中略) ---
}

また、新規プロジェクト作成で自動生成されたセクション定義では、PResetPRG セクションと PIntPRG セクションは同一のエリアに置かれるので、両方まとめて、もともとキャッシュの効かない高速内蔵 RAM エリアに割り付けることにしました。
具体的には、次のようになります。

0xFFF88000 PResetPRG,PIntPRG

「シリアル接続 HEW モニタ」により、現状では高速内蔵 RAM の後半 32 Kバイト中の 0xFFF89000 〜 0xFFF8FFFF のエリアは予約されているので、その直前の位置を割り当ててあります。
「ソース非公開」のルネサス製「シリアル接続 HEW モニタ」では不思議に思うことがあって、列挙すると、次のようになります。

  1. クロック動作モードに関わらず FRQCR の内容が 0x1003 になっている
  2. シミュレータのマニュアルでは、キャッシュコントロールのダイアログがあるように記述されているが「シリアル接続 HEW モニタ」ではキャッシュ操作のボタンがない

ハードウェアマニュアルには、クロック動作モードごとの FRQCR レジスタのデフォルトの初期値が記載されていますが、デバッガを起動して FRQCR の値を確認すると、クロック・モードに関わらず 0x1003 となっています。
モード 2、モード 3 の場合はこれでいいのですが、モード 0、モード 1 の場合は、これは不正な値のはずです。
ルネサス製のソフトウェアなのに、マニュアルでは設定禁止となっている値が設定されているのは不思議です。
しかし「ソース非公開」なので、確かめる手段がなく、実際のところ「不思議」というだけで、いいのか悪いのか判断がつきません。
また、キャッシュ操作のボタンがないというのが、もしもキャッシュのサポートがないことを表しているなら、キャッシュ ON にした場合のプログラム実行の怪しい挙動のつじつまが合い、納得できます。
これは使い方が悪いのか、「シリアル接続 HEW モニタ」の不具合なのか判断できませんので、CQ 出版なりルネサスなりに文句を言うべきかどうかも分かりません。
もし「不具合」だとすると、ソース非公開なので、ルネサス側が対応しない限り改善はされないことになります。
その対応の結果が、

「シリアル接続 HEW モニタ上で実行するプログラムではキャッシュ ON にしないでください。 これは仕様です。」

だったら悲しすぎます。
いずれにせよ、本当にキャッシュの問題なのかどうかは分かりませんが、ユーザプログラム内で (本来は必要ない) オペランド・キャッシュのパージをしておけば問題は起きないので、実用上の障害にはなりません。