__sectop(), __secend()でセンションの値を取得することができません。

こんにちは。

よこです。

現在、RL78G23でセルフプログラミングを行っています。

ROMのデータを書き込むのに一部の関数をROMからRAMに移行したいと思っていますが、__sectop(), __secend()でセクションのアドレスを取得できずに困っております。

__sectop(), __secend()で値を取得すると0x00とアドレス値が取れませんでした。

どなたかご助言いただけませんでしょうか。

使用している環境は以下のとおりです。

IDE: Renesas e² studio

Version: 2022-04 (22.4.0)
Build Id: R20220331-2313

Compiler: CC-RL 

Version: v1.11.00

Parents
  • よこ さん、こんにちは。NoMaYです。

    どのようなソースを記述をされたのか見せて頂けませんか?

  • NoMaYさん

    こんにちは。

    よこです。

    ソースコードはルネサスのサンプルコードを使っています。

    ROMからRAMへのコピーは R_CFlash_InitSct()行っています。

    ソースコードを以下に示します。


    #include <stdio.h>

    #define BSEC_MAX 0 /* number of BSS section to zero clear */
    #define DSEC_MAX 4 /* number of ROM section to RAM copy */

    #if ( BSEC_MAX > 0 )
    const struct bsec_t {
    char __near *ram_sectop; /* start address of BSS section */
    char __near *ram_secend; /* end address of BSS +1 */
    } bsec_table[ BSEC_MAX ] = {
    // { (char __near *)__sectop(".bss") , (char __near *)__secend(".bss") },
    };
    #endif

    #if ( DSEC_MAX > 0 )
    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") },
    };
    #endif

    /***********************************************************************
    * function name : R_CFlash_InitSct
    * description : section clear / section copy
    * parameters : none
    * return value : none
    **********************************************************************/
    void R_CFlash_InitSct( void )
    {
    unsigned int i;
    char __far *rom_p;
    char __near *ram_p;

    #if ( BSEC_MAX > 0 )
    for (i = 0; i < BSEC_MAX; i++)
    {
    ram_p = bsec_table[i].ram_sectop;
    for ( ; ram_p != bsec_table[i].ram_secend; ram_p++)
    {
    *ram_p = 0;
    }
    }
    #endif

    #if ( DSEC_MAX > 0 )
    for (i = 0; i < DSEC_MAX; i++)
    {
    rom_p = dsec_table[i].rom_sectop;
    ram_p = dsec_table[i].ram_sectop;
    for ( ; rom_p != dsec_table[i].rom_secend; rom_p++, ram_p++)
    {
    *ram_p = *rom_p;
    }
    }
    #endif
    }
    /*******************************************************************************
    * Copyright (C) 2020 Renesas Electronics Corporation.
    ******************************************************************************/

  • よこ さん、こんにちは。NoMaYです。

    では、次にマップファイルを見せて頂けませんか?(長くなるようでしたらzipファイルに固めてリプライに添付して頂けませんか?マップファイルでのリンカのコマンドラインオプション部分の内容も含めて見たいです。)

    あと、値を取得出来ないのは、すべてのセクションに関してですか?それとも、いくつかのセクションに関してのみ値を取得出来ない、ということだったりしますか?そうであれば、値を取得出来ないセクションはどれとどれですか?

  • NoMaYさん

    こんにちは。

    よこです。

    すみません、諸事情でmapファイルをアップロードできません。(メンバーからやめるように言われました。。。)

    セクションの値に関してはdsec_table[ DSEC_MAX ] で設定されている値は取得できていないようです。

    配列の中身がすべて0でした。

    .bssの値も試しに取得しようとしましたが、こちらも取得した値は0でした。。。

  • NoMaYさん

    こんにちは。

    よこです。

    NoMaYさん、お調べてしていただき、ありがとうございます。

    この問題は解決できました。。。

    まず、__sectop(), __secend()で値が取れない問題は実は私の勘違いでした。

    というのも、dsec_table[ DSEC_MAX ] の値をe2studioのデバッグ機能の"式"で確認していたのですが、dsec_table[ DSEC_MAX ] はconstで宣言されているのでそもそも"式"の機能(式はRAMからの情報しか取れないため)では見れないことがあとからわかりました。

    なので、rom_p, ram_p の値を追いかけて見たところ、値はセクションのアドレスはちゃんと取得できていました。。。

  • よこ さん、こんにちは。NoMaYです。

    ソースコードはルネサスのサンプルコード、とのことですが、タイトルなり、ドキュメント番号なり、を教えて頂けませんか?

    それから、、、

    > dsec_table[ DSEC_MAX ] はconstで宣言されているのでそもそも"式"の機能(式はRAMからの情報しか取れないため)では見れない

    ソースレベルデバッグをする場合、最適化なしでビルドしてデバッグするのがセオリーですが、それでconst変数がウォッチ出来ない場合には、世間ではデバッガのバグとして扱う、というのが通例です。(もっとも、くだんの変数はグローバル変数ですので、今回は、最適化は影響していないであろう、とは思われますけれども。)

    何というか「式はRAMからの情報しか取れない」というのは、そういう仕様ではありませんよ、なのです。

  • NoMaYさん

    ご連絡ありがとうございます。

    よこです。

    ソースコードはFirmware Update over LoRaWAN® Sample Applicationを使っています。

    URL: https://www.renesas.com/jp/ja/document/apn/firmware-update-over-lorawan-sample-application-rev312?language=en

    constの値も見れるのですね。。。

    申し訳ないです。私の知識不足でした。。。

    ご指摘ありがとうございます。

  • よこ さん、こんにちは。NoMaYです。

    情報ありがとうございました。確かに式ビューの表示が間違ってますね。別スレッドを立てて調べようと思います。

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



    以下、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

    サンプルプログラムのe2 studio FWUpdateSample projectのフォルダ

    r11an0227ej0312-rl78-lora/samples/project/e2studio/rl78g23-128pfpb_sx126x/FWUpdateSample/

  • NoMaYさん

    こんにちは。

    よこです。

    ご返事が遅くなり申し訳ないです。

    ご対応いただき誠にありがとうございました。

    別スレッドを確認いたしました。

Reply
  • NoMaYさん

    こんにちは。

    よこです。

    ご返事が遅くなり申し訳ないです。

    ご対応いただき誠にありがとうございました。

    別スレッドを確認いたしました。

Children
No Data