RX65N/RX72N emWin+AppWizardでJapanese Language Displayが出来るか調べてみることにしました(Is it available?)

こんにちは。NoMaYです。

最近、以下のスレッドに関わったのですが、日本語が表示出来ないなんて?と、気になったので調べてみることにしました。もっとも、何から手を付けて良いのかさっぱり分からない状態からのスタートですので、ぼちぼちと、、、

AppWizardでの日本語テキスト表示について
japan.renesasrulz.com/cafe_rene/f/002-2095199602/8313/appwizard

まず、ソッコーで思い浮かんでアクセスしてみる情報から。

SEGGER emWinグラフィックスライブラリ (RX MCUs)
www.renesas.com/jp/ja/products/microcontrollers-microprocessors/rx-32-bit-performance-efficiency-mcus/rx-partners/segger-emwin-graphics-library-rx-mcus

RX Ecosystem Partner Solution
emWin - PROFESSIONAL EMBEDDED GRAPHICS LIBRARY
SEGGER( 日本国内販売代理店:株式会社エンビテック)
www.renesas.com/jp/ja/document/prb/segger-emwin-graphics-library-solution-brief-rx-mcus

emWin
Graphic Library with Graphical User Interface
User Guide & Reference Manual
Document: UM03001
Software version: V5.50 ⇒ ドキュメントのバージョンが古過ぎますね(下記のFITモジュールのとおり既にV6.22ですね)
Document revision: 0
Date: June 11, 2019
www.renesas.com/jp/ja/document/mat/emwin-graphic-library-gui-user-guide-reference-manual

RXファミリ emWin v6.22モジュール Firmware Integration Technology
www.renesas.com/jp/ja/document/apn/rx-family-emwin-v622-module-using-firmware-integration-technology
 

Parents
  • こんにちは。NoMaYです。

    > ソースやコンパイルリストファイルと睨めっこして気付いたのは、以下の3つの関数でvolatileが抜けているのでは?という点でした。試しに赤文字箇所にてvolatileを補ってやると動作するようになりました、、、

    くだんのvolatileを補う前と後でコンパイルリストファイルを比べてみました。なお、GNURXでは(そもそもはGCCに由来して?)最適化において関数の自動インライン展開がCC-RXより積極的に行われるような印象があるのですが、今回もvolatileを補った関数は呼び出し元の関数(及びもうひとつ別の関数)に自動インライン展開されています。

    それで何が起こっていたかというと、自動インライン展開された結果、コンパイラから見ると以下の3行が順番に行われているように見えていたと思われますが、volatileが無い場合は1行目の書き込み処理は実行する必要が無い(3行目でも同じ場所に書き込んでいるから1行目の書き込みは無意味)と判断されているようです。

       *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) | PRCR_PRC1);
       *p_mstp_addr = ((*p_mstp_addr) & (~(1 << mstp_num)));
       *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) & (~PRCR_PRC1));

     
    以下、呼び出し元の関数とコンパイルリストファイル(赤文字箇所(特に赤太文字箇所)の有無に注目)です。

    src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c

    d1_device * d1_opendevice(long flags)
    {
        略

        /* apply power to peripheral */
        d1_registerprotectdisable();
        d1_mstp_set (true, MSTP_C, DAVE2D_MSTP_NUM);
        d1_registerprotectenable();

        略    /* reset irq handlers */
    }

     
    volatileなしの場合 (見易くする為に生のコンパイルリストファイルをかなり加工しています)

     215:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****     *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) | PRCR_PRC1);
      40 0010 FB 3E FE 03 08                mov.L   #0x803fe, r3
      41 0015 DC 35                         mov.W   [r3], r5

     180:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****         *p_mstp_addr = ((*p_mstp_addr) & (~(1 << mstp_num)));
      55 0017 FB 2E 18 00 08                mov.L   #0x80018, r2
      57 001c EC 24                         mov.L   [r2], r4
      58 001e 7B C4                         bclr    #28, r4
      60 0020 E3 24                         mov.L   r4, [r2]

     199:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****     *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) & (~PRCR_PRC1));
      74 0022 76 25 FD 5A                   and #0x5afd, r5
      75 0026 76 35 00 A5                   or  #-23296, r5
      77 002a D3 35                         mov.W   r5, [r3]

     
    volatileありの場合 (見易くする為に生のコンパイルリストファイルをかなり加工しています)

     215:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****     *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) | PRCR_PRC1);
      40 0010 FB 4E FE 03 08                mov.L   #0x803fe, r4
      41 0015 DC 45                         mov.W   [r4], r5
      43 0017 76 35 02 A5                   or  #-23294, r5
      44 001b D3 45                         mov.W   r5, [r4]

     180:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****         *p_mstp_addr = ((*p_mstp_addr) & (~(1 << mstp_num)));
      58 001d FB 3E 18 00 08                mov.L   #0x80018, r3
      59 0022 EC 35                         mov.L   [r3], r5
      61 0024 7B C5                         bclr    #28, r5
      63 0026 E3 35                         mov.L   r5, [r3]

     199:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****     *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) & (~PRCR_PRC1));
      77 0028 DC 45                         mov.W   [r4], r5
      79 002a 7A 15                         bclr    #1, r5
      80 002c 76 35 00 A5                   or  #-23296, r5
      82 0030 D3 45                         mov.W   r5, [r4]

     

Reply
  • こんにちは。NoMaYです。

    > ソースやコンパイルリストファイルと睨めっこして気付いたのは、以下の3つの関数でvolatileが抜けているのでは?という点でした。試しに赤文字箇所にてvolatileを補ってやると動作するようになりました、、、

    くだんのvolatileを補う前と後でコンパイルリストファイルを比べてみました。なお、GNURXでは(そもそもはGCCに由来して?)最適化において関数の自動インライン展開がCC-RXより積極的に行われるような印象があるのですが、今回もvolatileを補った関数は呼び出し元の関数(及びもうひとつ別の関数)に自動インライン展開されています。

    それで何が起こっていたかというと、自動インライン展開された結果、コンパイラから見ると以下の3行が順番に行われているように見えていたと思われますが、volatileが無い場合は1行目の書き込み処理は実行する必要が無い(3行目でも同じ場所に書き込んでいるから1行目の書き込みは無意味)と判断されているようです。

       *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) | PRCR_PRC1);
       *p_mstp_addr = ((*p_mstp_addr) & (~(1 << mstp_num)));
       *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) & (~PRCR_PRC1));

     
    以下、呼び出し元の関数とコンパイルリストファイル(赤文字箇所(特に赤太文字箇所)の有無に注目)です。

    src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c

    d1_device * d1_opendevice(long flags)
    {
        略

        /* apply power to peripheral */
        d1_registerprotectdisable();
        d1_mstp_set (true, MSTP_C, DAVE2D_MSTP_NUM);
        d1_registerprotectenable();

        略    /* reset irq handlers */
    }

     
    volatileなしの場合 (見易くする為に生のコンパイルリストファイルをかなり加工しています)

     215:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****     *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) | PRCR_PRC1);
      40 0010 FB 3E FE 03 08                mov.L   #0x803fe, r3
      41 0015 DC 35                         mov.W   [r3], r5

     180:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****         *p_mstp_addr = ((*p_mstp_addr) & (~(1 << mstp_num)));
      55 0017 FB 2E 18 00 08                mov.L   #0x80018, r2
      57 001c EC 24                         mov.L   [r2], r4
      58 001e 7B C4                         bclr    #28, r4
      60 0020 E3 24                         mov.L   r4, [r2]

     199:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****     *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) & (~PRCR_PRC1));
      74 0022 76 25 FD 5A                   and #0x5afd, r5
      75 0026 76 35 00 A5                   or  #-23296, r5
      77 002a D3 35                         mov.W   r5, [r3]

     
    volatileありの場合 (見易くする為に生のコンパイルリストファイルをかなり加工しています)

     215:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****     *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) | PRCR_PRC1);
      40 0010 FB 4E FE 03 08                mov.L   #0x803fe, r4
      41 0015 DC 45                         mov.W   [r4], r5
      43 0017 76 35 02 A5                   or  #-23294, r5
      44 001b D3 45                         mov.W   r5, [r4]

     180:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****         *p_mstp_addr = ((*p_mstp_addr) & (~(1 << mstp_num)));
      58 001d FB 3E 18 00 08                mov.L   #0x80018, r3
      59 0022 EC 35                         mov.L   [r3], r5
      61 0024 7B C5                         bclr    #28, r5
      63 0026 E3 35                         mov.L   r5, [r3]

     199:../src/smc_gen/r_drw2d_rx/src/rx/dave_base_rx.c ****     *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) & (~PRCR_PRC1));
      77 0028 DC 45                         mov.W   [r4], r5
      79 002a 7A 15                         bclr    #1, r5
      80 002c 76 35 00 A5                   or  #-23296, r5
      82 0030 D3 45                         mov.W   r5, [r4]

     

Children
No Data