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です。

    volatileが抜けている、ということからすれば、CC-RXでも何かしらの最適化設定において誤動作するのではないだろうか、と気になりましたので、CC-RXであれこれやってみました。当方の手元ではCC-RXの無償評価版のサイズ制限を超えてしまっている事情で動作/非動作の確認まで出来ていませんが、コンパイルリストファイルからの推測では -optimize=max -speed で問題が発生してもおかしくない気がします。なお、CC-RXではvolatile抜けというより__evenaccess抜けと考えるのが良さそうです。

    何が起きるかというと、以下のように32ビット長のmstpレジスタの1つに8ビット長でリードモデファイライトしてしまいます。

    自動インライン展開された結果として、コンパイラに見えているであろう処理

        *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));

     
    最適化オプション -optimize=max -speed でのコンパイルリストファイルから抽出したコード(ソースと対応するよう色分け)

    00000014 FB5EFE0308  MOV.L #000803FEH, R5
    00000019 DC5F        MOV.W [R5], R15
    0000001B FBEE1B0008  MOV.L #0008001BH, R14
    00000020 773F02A500  OR #0A502H, R15
    00000025 D35F        MOV.W R15, [R5]
    00000027 F0EC        BCLR #04H, [R14].B ← 32ビット長のmstpレジスタの1つに8ビット長でリードモデファイライトする
    00000029 DC5E        MOV.W [R5], R14
    0000002B 773E00A500  OR #0A500H, R14
    00000030 772EFDFF00  AND #0FFFDH, R14
    00000035 D35E        MOV.W R14, [R5]

     
    [追記]

    上記の最適化オプションでソースに__evenaccessを補った場合: 緑字のソース行は無意味と判断されコード生成されていない

    00000014 FB4E180008  MOV.L #00080018H, R4
    00000019 EC45        MOV.L [R4], R5
    0000001B FBFEFE0308  MOV.L #000803FEH, R15
    00000020 DCFE        MOV.W [R15], R14
    00000022 7BC5        BCLR #1CH, R5
    00000024 773E00A500  OR #0A500H, R14
    00000029 772EFDFF00  AND #0FFFDH, R14
    0000002E E345        MOV.L R5, [R4]
    00000030 D3FE        MOV.W R14, [R15]

     
    上記の最適化オプションでソースに__evenaccess volatileを補った場合: 問題無いと思われる

    00000014 FB5EFE0308  MOV.L #000803FEH, R5
    00000019 DC5E        MOV.W [R5], R14
    0000001B FBFE180008  MOV.L #00080018H, R15
    00000020 773E02A500  OR #0A502H, R14
    00000025 D35E        MOV.W R14, [R5]
    00000027 ECFE        MOV.L [R15], R14
    00000029 7BCE        BCLR #1CH, R14
    0000002B E3FE        MOV.L R14, [R15]
    0000002D DC5E        MOV.W [R5], R14
    0000002F 773E00A500  OR #0A500H, R14
    00000034 772EFDFF00  AND #0FFFDH, R14
    00000039 D35E        MOV.W R14, [R5]

     
    ソース(なお__evenaccessとvolatileの記述場所はiodefine.hに合わせました)

    static void d1_mstp_set(bool enable, int mstp_char, int mstp_num)
    {
        volatile unsigned long __evenaccess *p_mstp_addr;

        /* The address offset from the address of the base register is cast to match the size of the register. */
        p_mstp_addr = ((volatile unsigned long __evenaccess *)MSTP_0_BASE) + mstp_char;

        if (true == enable)
        {
            *p_mstp_addr = ((*p_mstp_addr) & (~(1 << mstp_num)));
        }
        else
        {
            *p_mstp_addr = ((*p_mstp_addr) | (1 << mstp_num));
        }
    } /* End of function d1_mstp_set() */

    static void d1_registerprotectenable()
    {
        volatile unsigned short __evenaccess *p_prcr_addr;

        /* The address of the base register is cast to match the size of the register. */
        p_prcr_addr = (volatile unsigned short __evenaccess *)PRCR_0_BASE;
        *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) & (~PRCR_PRC1));
    } /* End of function d1_registerprotectenable() */

    static void d1_registerprotectdisable()
    {
        volatile unsigned short __evenaccess *p_prcr_addr;

        /* The address of the base register is cast to match the size of the register. */
        p_prcr_addr = (volatile unsigned short __evenaccess *)PRCR_0_BASE;
        *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) | PRCR_PRC1);
    } /* End of function d1_registerprotectdisable() */

     
    [追記2]

    上記の最適化オプションでソースにvolatileのみ補った場合: 問題ありと思われる

    00000014 FB5EFE0308  MOV.L #000803FEH, R5
    00000019 DC5E        MOV.W [R5], R14
    0000001B FBFE1B0008  MOV.L #0008001BH, R15
    00000020 773E02A500  OR #0A502H, R14
    00000025 D35E        MOV.W R14, [R5]
    00000027 58FE        MOVU.B [R15], R14 ← 32ビット長のmstpレジスタの1つに8ビット長でリードする
    00000029 762EEF00    AND #0EFH, R14
    0000002D C3FE        MOV.B R14, [R15] ← 32ビット長のmstpレジスタの1つに8ビット長でライトする
    0000002F DC5E        MOV.W [R5], R14
    00000031 773E00A500  OR #0A500H, R14
    00000036 772EFDFF00  AND #0FFFDH, R14
    0000003B D35E        MOV.W R14, [R5]


    上記の最適化オプションでソースにvolatileのみ補い且つコンパイルオプションに-type_size_access_to_volatileを追加した場合: 問題無いと思われる

    00000014 FB5EFE0308  MOV.L #000803FEH, R5
    00000019 DC5E        MOV.W [R5], R14
    0000001B FBFE180008  MOV.L #00080018H, R15
    00000020 773E02A500  OR #0A502H, R14
    00000025 D35E        MOV.W R14, [R5]
    00000027 ECFE        MOV.L [R15], R14
    00000029 7BCE        BCLR #1CH, R14
    0000002B E3FE        MOV.L R14, [R15]
    0000002D DC5E        MOV.W [R5], R14
    0000002F 773E00A500  OR #0A500H, R14
    00000034 772EFDFF00  AND #0FFFDH, R14
    00000039 D35E        MOV.W R14, [R5]

     
    [関連リンク]

    CC-RXでvolatile指定有り__evenaccess指定無しのobjectへのaccess sizeが保証されないのは言語規格上妥当なのかな?
    japan.renesasrulz.com/cafe_rene/f/forum5/5094/cc-rx-volatile-__evenaccess-object-access-size
     

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

    volatileが抜けている、ということからすれば、CC-RXでも何かしらの最適化設定において誤動作するのではないだろうか、と気になりましたので、CC-RXであれこれやってみました。当方の手元ではCC-RXの無償評価版のサイズ制限を超えてしまっている事情で動作/非動作の確認まで出来ていませんが、コンパイルリストファイルからの推測では -optimize=max -speed で問題が発生してもおかしくない気がします。なお、CC-RXではvolatile抜けというより__evenaccess抜けと考えるのが良さそうです。

    何が起きるかというと、以下のように32ビット長のmstpレジスタの1つに8ビット長でリードモデファイライトしてしまいます。

    自動インライン展開された結果として、コンパイラに見えているであろう処理

        *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));

     
    最適化オプション -optimize=max -speed でのコンパイルリストファイルから抽出したコード(ソースと対応するよう色分け)

    00000014 FB5EFE0308  MOV.L #000803FEH, R5
    00000019 DC5F        MOV.W [R5], R15
    0000001B FBEE1B0008  MOV.L #0008001BH, R14
    00000020 773F02A500  OR #0A502H, R15
    00000025 D35F        MOV.W R15, [R5]
    00000027 F0EC        BCLR #04H, [R14].B ← 32ビット長のmstpレジスタの1つに8ビット長でリードモデファイライトする
    00000029 DC5E        MOV.W [R5], R14
    0000002B 773E00A500  OR #0A500H, R14
    00000030 772EFDFF00  AND #0FFFDH, R14
    00000035 D35E        MOV.W R14, [R5]

     
    [追記]

    上記の最適化オプションでソースに__evenaccessを補った場合: 緑字のソース行は無意味と判断されコード生成されていない

    00000014 FB4E180008  MOV.L #00080018H, R4
    00000019 EC45        MOV.L [R4], R5
    0000001B FBFEFE0308  MOV.L #000803FEH, R15
    00000020 DCFE        MOV.W [R15], R14
    00000022 7BC5        BCLR #1CH, R5
    00000024 773E00A500  OR #0A500H, R14
    00000029 772EFDFF00  AND #0FFFDH, R14
    0000002E E345        MOV.L R5, [R4]
    00000030 D3FE        MOV.W R14, [R15]

     
    上記の最適化オプションでソースに__evenaccess volatileを補った場合: 問題無いと思われる

    00000014 FB5EFE0308  MOV.L #000803FEH, R5
    00000019 DC5E        MOV.W [R5], R14
    0000001B FBFE180008  MOV.L #00080018H, R15
    00000020 773E02A500  OR #0A502H, R14
    00000025 D35E        MOV.W R14, [R5]
    00000027 ECFE        MOV.L [R15], R14
    00000029 7BCE        BCLR #1CH, R14
    0000002B E3FE        MOV.L R14, [R15]
    0000002D DC5E        MOV.W [R5], R14
    0000002F 773E00A500  OR #0A500H, R14
    00000034 772EFDFF00  AND #0FFFDH, R14
    00000039 D35E        MOV.W R14, [R5]

     
    ソース(なお__evenaccessとvolatileの記述場所はiodefine.hに合わせました)

    static void d1_mstp_set(bool enable, int mstp_char, int mstp_num)
    {
        volatile unsigned long __evenaccess *p_mstp_addr;

        /* The address offset from the address of the base register is cast to match the size of the register. */
        p_mstp_addr = ((volatile unsigned long __evenaccess *)MSTP_0_BASE) + mstp_char;

        if (true == enable)
        {
            *p_mstp_addr = ((*p_mstp_addr) & (~(1 << mstp_num)));
        }
        else
        {
            *p_mstp_addr = ((*p_mstp_addr) | (1 << mstp_num));
        }
    } /* End of function d1_mstp_set() */

    static void d1_registerprotectenable()
    {
        volatile unsigned short __evenaccess *p_prcr_addr;

        /* The address of the base register is cast to match the size of the register. */
        p_prcr_addr = (volatile unsigned short __evenaccess *)PRCR_0_BASE;
        *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) & (~PRCR_PRC1));
    } /* End of function d1_registerprotectenable() */

    static void d1_registerprotectdisable()
    {
        volatile unsigned short __evenaccess *p_prcr_addr;

        /* The address of the base register is cast to match the size of the register. */
        p_prcr_addr = (volatile unsigned short __evenaccess *)PRCR_0_BASE;
        *p_prcr_addr = (((*p_prcr_addr) | PRCR_KEY) | PRCR_PRC1);
    } /* End of function d1_registerprotectdisable() */

     
    [追記2]

    上記の最適化オプションでソースにvolatileのみ補った場合: 問題ありと思われる

    00000014 FB5EFE0308  MOV.L #000803FEH, R5
    00000019 DC5E        MOV.W [R5], R14
    0000001B FBFE1B0008  MOV.L #0008001BH, R15
    00000020 773E02A500  OR #0A502H, R14
    00000025 D35E        MOV.W R14, [R5]
    00000027 58FE        MOVU.B [R15], R14 ← 32ビット長のmstpレジスタの1つに8ビット長でリードする
    00000029 762EEF00    AND #0EFH, R14
    0000002D C3FE        MOV.B R14, [R15] ← 32ビット長のmstpレジスタの1つに8ビット長でライトする
    0000002F DC5E        MOV.W [R5], R14
    00000031 773E00A500  OR #0A500H, R14
    00000036 772EFDFF00  AND #0FFFDH, R14
    0000003B D35E        MOV.W R14, [R5]


    上記の最適化オプションでソースにvolatileのみ補い且つコンパイルオプションに-type_size_access_to_volatileを追加した場合: 問題無いと思われる

    00000014 FB5EFE0308  MOV.L #000803FEH, R5
    00000019 DC5E        MOV.W [R5], R14
    0000001B FBFE180008  MOV.L #00080018H, R15
    00000020 773E02A500  OR #0A502H, R14
    00000025 D35E        MOV.W R14, [R5]
    00000027 ECFE        MOV.L [R15], R14
    00000029 7BCE        BCLR #1CH, R14
    0000002B E3FE        MOV.L R14, [R15]
    0000002D DC5E        MOV.W [R5], R14
    0000002F 773E00A500  OR #0A500H, R14
    00000034 772EFDFF00  AND #0FFFDH, R14
    00000039 D35E        MOV.W R14, [R5]

     
    [関連リンク]

    CC-RXでvolatile指定有り__evenaccess指定無しのobjectへのaccess sizeが保証されないのは言語規格上妥当なのかな?
    japan.renesasrulz.com/cafe_rene/f/forum5/5094/cc-rx-volatile-__evenaccess-object-access-size
     

Children
No Data