e2 studioの式ビューの表示が間違っていたので調べてみようと思います(expression view is wrong)

こんにちは。NoMaYです。

最近、以下のスレッドに関わったのですが、e2 studioの式ビューの表示が間違っていたので調べることにしました。

__sectop(), __secend()でセンションの値を取得することができません。
community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rl78/f/forum18/9544/__sectop-__secend/46666#46666

以下、そのスレッドのe2 studioの画面コピーです。(e2 studio 2022-07+CC-RL V1.11+最適化無しでビルド)

サンプルプログラムのe2 studio FWUpdateSample projectのフォルダ
r11an0227ej0312-rl78-lora/samples/project/e2studio/rl78g23-128pfpb_sx126x/FWUpdateSample/


以下、同じくそのスレッドでe2 studioのDebugger Consoleで確認してみた時の値です。

rl78-elf-gdb内では正しく認識されていますね。(高度に専門的な話になるけれども、rl78-elf-gdb側のMIコマンドの値返却処理がバグっている?、のかなぁ、、、)

p dsec_table
$2 = {{rom_sectop = 0x11e1 " ", <incomplete sequence \230>, rom_secend = 0x1506 " \006ク\004\061スク\002ィ\004\\\001\b\\\340\b1^", <incomplete sequence \230>, ram_sectop = 0xf4759 <R_RFD_Init> ""}, {rom_sectop = 0x1506 " \006ク\004\061スク\002ィ\004\\\001\b\\\340\b1^", <incomplete sequence \230>, rom_secend = 0x15b2 " \004\230\001掌", ram_sectop = 0xf4a7e <R_RFD_EraseCodeFlashReq> ""}, {rom_sectop = 0x15b2 " \004\230\001掌", rom_secend = 0x1709 <R_RFD_EraseDataFlashReq> " \004\230\001\360\f\020ク\002ネ", ram_sectop = 0xf4b2a <R_RFD_SetExtraBootAreaReq> ""}, {rom_sectop = 0xc96 "マx", rom_secend = 0x11e1 " ", <incomplete sequence \230>, ram_sectop = 0xf4c81 <R_CFlash_ResetFW> ""}}

[関連リンク]

RL78/G23, RL78/G14 Firmware Update over LoRaWAN® Sample Application
PDF
www.renesas.com/jp/ja/document/apn/firmware-update-over-lorawan-sample-application-rev312

LoRa(R)-based Wireless Software Package(V3.12)
ZIP
www.renesas.com/jp/ja/document/scd/lorar-based-wireless-software-packagev312
 

  • サンプルプログラムのZIPファイルにCS+プロジェクトも入っていたので試してみると、CS+では正しく表示されました。

    以下、CS+の画面コピーです。(CS+ V8.08+CC-RL V1.11+最適化無しでビルド)

    サンプルプログラムのCS+ FWUpdateSample projectのフォルダ
    r11an0227ej0312-rl78-lora/samples/project/csplus/rl78g23-128pfpb_sx126x/FWUpdateSample/

     

  • 脱線しますが、以下のプロジェクトツリー構造ということは、RL78スマートコンフィグレータは使えないですね、、、このスレッドでは考察しませんけれども、どうしたものでしょうかね、、、

    以下、CS+の画面コピーです。


     

  • 発端となったスレッド(というかサンプルプログラム)では__sectop()と__secend()を使っていましたが、試しに即値に変えてみたものの、表示が間違っていることには変わりはありませんでした。

    const struct dsec_t {
        char __far *rom_sectop;         /* start address of source section */
        char __far *rom_secend;         /* end address of source section +1 */
        char __near *ram_sectop;        /* start address of destination section */
    } dsec_table[ DSEC_MAX ] = {
    //    { __sectop("RFD_CMN_f"), __secend("RFD_CMN_f"), (char __near *)__sectop("RFD_CMN_fR") },
    //    { __sectop("RFD_CF_f"),  __secend("RFD_CF_f"),  (char __near *)__sectop("RFD_CF_fR")  },
    //    { __sectop("RFD_EX_f"),  __secend("RFD_EX_f"),  (char __near *)__sectop("RFD_EX_fR")  },
    //    { __sectop("CFLSHCD_f"), __secend("CFLSHCD_f"), (char __near *)__sectop("CFLSHCD_fR") },
        { (char __far *)0x11e1, (char __far *)0x1506, (char __near *)0x4759 },
        { (char __far *)0x1506, (char __far *)0x15b2, (char __near *)0x4a7e },
        { (char __far *)0x15b2, (char __far *)0x1709, (char __near *)0x4b2a },
        { (char __far *)0x0c96, (char __far *)0x11e1, (char __near *)0x4c81 },
    };

     
    以下、e2 studioの画面コピーです。


     

  • 新規にプロジェクトを作成して、以下のようなソースを書いてみたところ、なんと、正しく表示されてしまいました。

    const struct dsec_t {
        char __far *rom_sectop;         /* start address of source section */
        char __far *rom_secend;         /* end address of source section +1 */
        char __near *ram_sectop;        /* start address of destination section */
    } dsec_table[ 4 ] = {
        { (char __far *)0x11e1, (char __far *)0x1506, (char __near *)0x4759 },
        { (char __far *)0x1506, (char __far *)0x15b2, (char __near *)0x4a7e },
        { (char __far *)0x15b2, (char __far *)0x1709, (char __near *)0x4b2a },
        { (char __far *)0x0c96, (char __far *)0x11e1, (char __near *)0x4c81 },
    };

    void main(void)
    {
        while(1);
    }

     
    以下、e2 studioの画面コピーです。


     

  • サンプルプロジェクトのプロパティを何気なく見ていたところ-far_romオプションが設定されていることに気付いたので、ものは試しということで、先ほど新規に作成したプロジェクトでも設定してみたところ、なんと、現象が再現してしまいました。現象が再現するプロジェクトのファイル一式を以下のzipファイルに固めました。ここから先はルネサスさんにて不具合解析をされるのが効率的かと思われます。



    e2studio_expression_view_issue_20220917.zip
    e2studio_expression_view_issue_20220918.zip    [追記] 2022/09/18 更新しました

    以下、e2 studioの画面コピーです。

    サンプルプロジェクトでは-far_romオプションが設定されていた


    先ほど新規に作成したプロジェクトでも-far_romオプションを設定してみた


    現象が再現した


    [追記] 2022/09/18

    この際ですので、もう少し調べてみました。-far_romオプション設定時、式ビューの表示で、以下のnormalの表示は正しいものでしたが、array[0]の表示は間違っていました。ちなみに、その場合には、Debugger Consoleの表示でも同様に、normalの表示は正しいものでしたが、array[0]の表示は間違っていました。(ですので、単に、「rl78-elf-gdb側のMIコマンドの値返却処理がバグっている?、のかなぁ、、、」では済まないようです、、、)

    const unsigned short normal = 1234;
    const unsigned short array[1] = { 2345 };
    volatile unsigned short debug; /* volatile is intended for debug purpose. */

    void main(void)
    {
        debug = array[0];
        while(1);
    }

     
    以下、e2 studioの画面コピーです。



    ちなみに、CC-RLの-far_romオプションというのは以下の画面コピーの仕様のコンパイルオプションです。

    以下、CC-RLのヘルプの画面コピーです。