こんにちは。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です。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, R500000019 DC5F MOV.W [R5], R150000001B FBEE1B0008 MOV.L #0008001BH, R1400000020 773F02A500 OR #0A502H, R1500000025 D35F MOV.W R15, [R5]00000027 F0EC BCLR #04H, [R14].B ← 32ビット長のmstpレジスタの1つに8ビット長でリードモデファイライトする00000029 DC5E MOV.W [R5], R140000002B 773E00A500 OR #0A500H, R1400000030 772EFDFF00 AND #0FFFDH, R1400000035 D35E MOV.W R14, [R5]
[追記]上記の最適化オプションでソースに__evenaccessを補った場合: 緑字のソース行は無意味と判断されコード生成されていない
00000014 FB4E180008 MOV.L #00080018H, R400000019 EC45 MOV.L [R4], R50000001B FBFEFE0308 MOV.L #000803FEH, R1500000020 DCFE MOV.W [R15], R1400000022 7BC5 BCLR #1CH, R500000024 773E00A500 OR #0A500H, R1400000029 772EFDFF00 AND #0FFFDH, R140000002E E345 MOV.L R5, [R4]00000030 D3FE MOV.W R14, [R15]
上記の最適化オプションでソースに__evenaccess volatileを補った場合: 問題無いと思われる
00000014 FB5EFE0308 MOV.L #000803FEH, R500000019 DC5E MOV.W [R5], R140000001B FBFE180008 MOV.L #00080018H, R1500000020 773E02A500 OR #0A502H, R1400000025 D35E MOV.W R14, [R5]00000027 ECFE MOV.L [R15], R1400000029 7BCE BCLR #1CH, R140000002B E3FE MOV.L R14, [R15]0000002D DC5E MOV.W [R5], R140000002F 773E00A500 OR #0A500H, R1400000034 772EFDFF00 AND #0FFFDH, R1400000039 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, R500000019 DC5E MOV.W [R5], R140000001B FBFE1B0008 MOV.L #0008001BH, R1500000020 773E02A500 OR #0A502H, R1400000025 D35E MOV.W R14, [R5]00000027 58FE MOVU.B [R15], R14 ← 32ビット長のmstpレジスタの1つに8ビット長でリードする00000029 762EEF00 AND #0EFH, R140000002D C3FE MOV.B R14, [R15] ← 32ビット長のmstpレジスタの1つに8ビット長でライトする0000002F DC5E MOV.W [R5], R1400000031 773E00A500 OR #0A500H, R1400000036 772EFDFF00 AND #0FFFDH, R140000003B D35E MOV.W R14, [R5]
上記の最適化オプションでソースにvolatileのみ補い且つコンパイルオプションに-type_size_access_to_volatileを追加した場合: 問題無いと思われる
[関連リンク]CC-RXでvolatile指定有り__evenaccess指定無しのobjectへのaccess sizeが保証されないのは言語規格上妥当なのかな?japan.renesasrulz.com/cafe_rene/f/forum5/5094/cc-rx-volatile-__evenaccess-object-access-size