こんにちは。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-mcusRX Ecosystem Partner SolutionemWin - PROFESSIONAL EMBEDDED GRAPHICS LIBRARYSEGGER( 日本国内販売代理店:株式会社エンビテック)www.renesas.com/jp/ja/document/prb/segger-emwin-graphics-library-solution-brief-rx-mcusemWinGraphic Library with Graphical User InterfaceUser Guide & Reference ManualDocument: UM03001Software version: V5.50 ⇒ ドキュメントのバージョンが古過ぎますね(下記のFITモジュールのとおり既にV6.22ですね)Document revision: 0Date: June 11, 2019www.renesas.com/jp/ja/document/mat/emwin-graphic-library-gui-user-guide-reference-manualRXファミリ emWin v6.22モジュール Firmware Integration Technologywww.renesas.com/jp/ja/document/apn/rx-family-emwin-v622-module-using-firmware-integration-technology
こんにちは。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]