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
 

  • FIT emWinモジュールでconstを検索してみたものの、、、const変数の定義は1つしかない、、、

    以下、画面コピーです。(2枚)



     

  • FIT emWinモジュールのソースに起因するものでは無さそうな気がするのですけれども、その場合には、他の可能性として、以下だったりするのかなぁ、、、

    ・ emWinのバイナリライブラリの中の話? ← [追記]コンパイルオプションの話ですのでバイナリライブラリってことは無いですね

    and/or

    ・ emWinのAppWizardが生成したソースの話?

    以下、かふぇルネで過去に -nostuff オプションが関係したスレッドです。

    CC-RXコンパイラの-nostuffオプションのメリットについて
    japan.renesasrulz.com/cafe_rene/f/forum5/5508/cc-rx--nostuff

    ビルド時にE0562330:Relocation size overflow 発生
    japan.renesasrulz.com/cafe_rene/f/002-2095199602/7506/e0562330-relocation-size-overflow

    宣言した変数に連続したアドレスでアクセスしたい(CC-RX、RX65N、CS+)
    japan.renesasrulz.com/cafe_rene/f/forum21/8254/cc-rx-rx65n-cs

    以下、画面コピーです。(2枚)



     

  • こんにちは。NoMaYです。

    > emWinのAppWizardが生成したソースの話?

    当方の手元ではCC-RXの無償評価版のサイズ制限を超えてしまっている事情で動作/非動作が確認出来ない上に、AppWizardでのGUI設計に応じて生成されるソースでの話となると、なぜCC-RXの場合に -nostuff=C が必要なのか、もう追うすべが無いかな、という気がしました。

    他方、AppWizardが生成するソースでの話なら、GCC系コンパイラで問題が発生するようなコードを意図的に生成するとは考え難いことですので、GNURXの場合に対応するオプションが存在せず、相応する設定をどうすれば良いのか考えが思い浮かばないことは、もう気にしなくても良いかな、という気がしてきました。

  • こんにちは。NoMaYです。

    またvolatileと__evenaccessの話に戻りますが、先日の投稿に書いた通り、今のFITモジュールは基本的にCC-RX/GNURX/ICCRXの3つのコンパイラに対応した共通ソースかつ同一処理になっていますので、その観点からは修正ソースは以下のようになります。

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

    #include <stdlib.h>
    #include <stdbool.h>
    #include "dave_base.h"
    #include "dave_base_rx.h"

    #include "platform.h"



    /***********************************************************************
     * Function Name: d1_mstp_set
     * Description  : Write the MSTP register.
     * Arguments    : enable
     *                    Enable or disable the register bit.
     *                mstp_char
     *                    MSTP register offset position.
     *                mstp_num
     *                    The register bit position.
     * Return Value : none
     **********************************************************************/
    static void d1_mstp_set(bool enable, int mstp_char, int mstp_num)
    {
        volatile unsigned long R_BSP_EVENACCESS_SFR *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 R_BSP_EVENACCESS_SFR *)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() */

    /***********************************************************************
     * Function Name: d1_registerprotectenable
     * Description  : Enable protect bit 1 of PRCR register.
     * Arguments    : none
     * Return Value : none
     **********************************************************************/
    static void d1_registerprotectenable()
    {
        volatile unsigned short R_BSP_EVENACCESS_SFR *p_prcr_addr;

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

    /***********************************************************************
     * Function Name: d1_registerprotectdisable
     * Description  : Disable protect bit 1 of PRCR register.
     * Arguments    : none
     * Return Value : none
     **********************************************************************/
    static void d1_registerprotectdisable()
    {
        volatile unsigned short R_BSP_EVENACCESS_SFR *p_prcr_addr;

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

     
    なお、R_BSP_EVENACCESS_SFRは以下の通り定義されているものです。

    src/smc_gen/r_bsp/mcu/all/r_rx_compiler.h

    /* ========== Keywords ========== */
    #if !(defined(__CCRX__) && defined(__cplusplus))
    #define R_BSP_PRAGMA(...)    _Pragma(#__VA_ARGS__)
    #else
    /* CC-RX' C++ mode does not support Pragma operator and variadic macros */
    #define R_BSP_PRAGMA(x)
    #endif

    #if defined(__CCRX__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile __evenaccess
    #define R_BSP_EVENACCESS                 __evenaccess
    #define R_BSP_EVENACCESS_SFR             __evenaccess
    #define R_BSP_VOLATILE_SFR               volatile
    #define R_BSP_SFR                        /* none */

    #elif defined(__GNUC__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile
    #define R_BSP_EVENACCESS                 /* none */
    #define R_BSP_EVENACCESS_SFR             /* none */
    #define R_BSP_VOLATILE_SFR               volatile
    #define R_BSP_SFR                        /* none */

    #elif defined(__ICCRX__)

    #define R_BSP_VOLATILE_EVENACCESS        volatile
    #define R_BSP_EVENACCESS                 volatile
    #define R_BSP_EVENACCESS_SFR             __sfr
    #define R_BSP_VOLATILE_SFR               volatile __sfr
    #define R_BSP_SFR                        __sfr

    #endif

     

  • こんにちは。NoMaYです。

    AppWizardをe2 studioのツールバーボタン/外部ツールメニューから起動出来るようにしてみました。設定内容等は以下の画面コピーの通りです。

    ツールバーボタン/外部ツールメニュー





    設定(他はデフォルトのまま))

    Name: AppWizard
    Location: ${env_var:ComSpec}
    Working Directory: ${project_loc}
    Arguments: /c start "" "${env_var:ProgramFiles(x86)}\SEGGER\AppWizard_V124_622\bin\AppWizard.exe" aw\aw.AppWizard



     

  • こんにちは。NoMaYです。

    RX65N Envision KitのLCDにemWin+AppWizardで`Hello こんにちは`と表示するプログラムのソース/プロジェクトを以下のzipファイルに固めました。なお、以下のファイル/フォルダは除いてありますので、scfgファイルを開いてコードを再生成して下さい。また、GNURX版とCC-RX版の2つが含まれていますが、CC-RXの無償評価版のサイズ制限を超えてしまっていますので、当方ではCC-RX版の動作確認は出来ていません。

    RX65N_Envision_Kit_emWin_AW_example_20220802.zip

    除外されているファイル/フォルダ(GNURX版とCC-RX版の両方)

    *.pdf
    aw/Simulation/
    src/smc_gen/r_emwin_rx/doc/emWin_doc/*
    src/smc_gen/r_emwin_rx/lib/GUI/*
    src/smc_gen/r_emwin_rx/tool/*

    パッチを当ててあるファイル(GNURX版とCC-RX版の両方)(既出)

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

    環境

    e2 studio: 2022-07
    RX Smart Configurator: V2.14.0 (上記のe2 studioに同梱されているplug-in版)
    RX Driver Package: V1.36
    GNURX: 8.3.0.202202
    CC-RX: V3.04

    プログラムサイズ等の情報は以下の通りです。(なお前回とはユーザスタックサイズを12KB→4KBへ変更しています)

    GNURX版

       text    data     bss     dec     hex filename
     351268    4016  115024  470308   72d24 AppWizard_Hello_lang_jp.elf

     
    CC-RX版

    PROGRAM SECTION:  00031ba1 Byte(s) → 203,681
    ROMDATA SECTION:  0001761b Byte(s) →  95,771
    RAMDATA SECTION:  0001c4e7 Byte(s) → 115,943

     
    写真


    AppWizard上での画面の画面コピー(写真では文字色がうまく撮れていなかった為)


    AppWizard上で日本語を扱う場合に現状で設定しておくと作業が比較的円滑になると思われる設定の画面コピー(既出)


    e2 studioからのAppWizardの起動が比較的楽になると思われるツールバーボタン/外部ツールメニューの画面コピー(既出)


     

  • こんにちは。NoMaYです。

    RX65N Envision KitのLCDにemWin(+AppWizard)でGUIを作成する場合のRAM予約サイズですが、ドキュメント記載の以下のものだけで既に628KBになってしまっています。そこにemWinの固定RAM分や他のドライバーソフトの固定RAM分やスタック領域などが加わると、そもそも640KBに収まりません、、、(実は先日のzipファイルではemWinのヒープを80KBの設定にして何とかリンク出来るようにしていたのです、、、)

    ・ LCDフレームバッファ 256KB × 2面
    ・ BSPのヒープ 16KB
    ・ emWinのヒープ 100KB

    以下、ドキュメントの画面コピーです。




     

  • NoMaYさん

    こんにちは、シェルティです。

    最近コード(現場)から少々距離が出来てしまい、かふぇルネでの活動も少なくなってしまいましたが、気になるポイントなどは適宜関係者に情報展開して改善を促したりなどを進めております。

    さて本件ですが、RX65N Envision Kit、RX72N Envision Kitの工場出荷時ファームの開発を担当した身として気になりますね。RX65Nの場合はご指摘通りで、フレームバッファ2面持ちにすると256KB×2でRAMがほとんどフレームバッファで埋め尽くされるので、多少画面がちらつくのを我慢して2面持ちを諦めてデモを作っていました。RX72Nの場合はRAMが1MBあるので、フレームバッファ512KB、FreeRTOS256KB、emWin用に80KBと割り当ててもまだ少し余裕がある感じでした。逆にいうと、480x272クラスの解像度の液晶を使うとRX72Nクラスが限界といった感じでしょうかね。RX65Nだともうひと周り解像度が低い液晶が良さそうです。

    AppWizardについてもSegger社から紹介をうけたとき「これは使いやすそうだな」と思い、最近RX72N Envision Kitのファームウェアの更新を以下のように始めました。AppWizardベースでいい感じに画面が組めてます。前世代のGUI Builderではボタンを押したときの挙動を自分で全部コードを書く必要がありましたが、AppWizardだと簡単なシーケンス(ボタンを押したらWindow1を消して2を表示する、500ms毎にテキストを点滅させる、など)がAppWizard上の設定でできるようになりました。

    https://github.com/renesas/rx72n-envision-kit/tree/apply_202203.00

    あと、TracealyzerというRTOSアナライザのライブラリを上記URLのコミットに入れてあり、タスクの詳細な状態遷移が分かるようになりました。システムコール1個ずつがどういう関係でどこから呼び出され、CPUはIDLEタスク以外にどのくらい遷移しているのか(=CPU負荷率)、ヒープがどのくらい確保・解放されるかがリアルタイムで可視化されます。

    最終的には、TSIPというRX72N内蔵の暗号器を使って、Amazon Web ServicesとのTLS暗号通信を加速することを考えています。現在チューニング中ですが70Mbpsくらい出るのを確認しました。加速せずS/Wのみの実装だと8Mbpsくらいです。TLS1.3もできるようになりました。

    Amazon Web ServicesにIoTデバイスを接続する際は、IoTデバイス内の不揮発性メモリにデバイス秘密鍵(人間がAWS利用する際のパスワードに相当)とデバイス証明書(人間がAWS利用するIDに相当)を書き込んでおく必要があり、これらを暗号化して安全にRX72N内のデータフラッシュに保持しておく(ソフトがバグっててデータフラッシュがダンプされても暗号化されているので平気)こともうまくRX72N Envision Kitのデモで実現しようと考えています。

    またいろいろ情報交換させてください。上記URLは一通り完成したらマスターブランチにプルリクエストしてマージしてwikiに解説を載せます。

    マスターブランチ:https://github.com/renesas/rx72n-envision-kit/tree/master

    wiki:https://github.com/renesas/rx72n-envision-kit/wiki/%E3%83%9B%E3%83%BC%E3%83%A0

    以上です

  • シェルティさん、こんにちは。NoMaYです。#何だか、お久しぶりな感じ、だったりしますね。

    もし御存知でしたら教えて頂ければ、と思ったのですが、QE for Displayでフレームバッファの1面化は可能でしょうか?どのドキュメントのどのページに書かれているのか分かるというのでもよいです。以下の画面コピーの印象では、GUI上で1面化は何か出来そうに無さそうな予感がしていたのですが、事前に何かのヘッダファイル定義を書き換えておくと出来るという操作手順があったりするというのでもよいです。もちろん、QE for Displayでは出来ません、というのもありです。

    以下、QE for Displayの画面コピーです。


     

  • NoMaYさん

    シェルティです、こんにちは。

    直接こうしてお話させていただくのは何か月か間があいたと思いますね。お久しぶりです。でも毎日書き込みは確認させていただいています。

    フレームバッファのマルチ化、シングル化の設定は現状のQE for DisplayではGUI上できないですね。次の版でできるように仕込んでいると聞いています。QE for Displayから呼び出されるAppWizard(Segger製のツール)もGUI上でマルチ化のチェックボックスが有効になります。AppWizard単体は以下最新ダウンロード(2022/08/30時点でV130_V626d)ではマルチ化のチェックボックスが有効になっていました。

    https://www.segger.com/downloads/emwin

    現状はどうやってマルチ化を有効にするかというと、AppWizardが出力する以下コード以下行の値の初期値を 1 にするとフレームバッファがマルチになります。さらにNoMaYさんの示していただいた図ですと、buffer1 を0x00800000、buffer2 をRX65Nの場合、0x00000000(ユーザ用空き領域は0x00840000からの128KB)、RX72Nの場合、0x00840000(ユーザ用空き領域は0x00000000からの512KB)にするのがおすすめです。

    https://github.com/renesas/rx72n-envision-kit/blob/fd615606a7a1c09af44b9b3953003f14519770ed/projects/renesas/rx72n_envision_kit/e2studio/aws_demos/aw/Source/Generated/APPWConf.c#L179

    このへん、ボードによって推奨値が変わるので、BDFをうまく活用して推奨値が自動的にQE for Displayや各FITモジュールに評価済の推奨値を引き渡すことができるよう改善していこうと考えています。

    以上です