こんにちは。NoMaYです。RXv3コア搭載の120MH動作のRXマイコンも、RX66T以降、RX671、RX66N、RX660と品種が増えてきましたが、RXv3コアのセールスポイントの1つであるレジスタ一括退避機能の使い方が今ひとつピンと来ません。そこで、いつものように、ちょっと好奇心からスレッドを立ててみました。(注: RX66Tは、160MHz動作、レジスタ一括退避機能未搭載、です。) いつものように、ぼちぼちと続きます。ホワイトペーパー卓越したMCU性能と電力効率を実現するRXv3コア2019年10月www.renesas.com/jp/ja/document/whp/introducing-rxv3-core-superior-performance-excellent-power-efficiency#page=6「割り込み応答時間の改善モータ制御システムなどは、高速な割り込み処理によるリアルタイム性能が必要となってきます。RXv3コアには、割り込み処理時にレジスタを高速退避/復帰するために、オプション機能として、レジスタ退避バンクと呼ばれる専用メモリを実装しています。図6に示すように、レジスタ退避バンクを使用することで割り込み応答時間を短縮でき、割り込み処理全体の時間を短縮することができます。 割り込み処理ルーチンの中で、SAVE命令を使用すると汎用レジスタとアキュムレータを1クロックで専用メモリに保存できます。RSTR命令は、保存されたレジスタを3~6cycleで復元します。レジスタ退避バンクは専用メモリを複数面持っており、多重割り込みにも対応することが可能です。図6.割り込み応答時間の改善レジスタ退避バンクは、割り込みハンドラだけでなく、RTOSコンテキスト切り替えにも使用できます。 RTOSコンテキスト切り替え時間は、レジスタバンク保存機能により最大20%高速化します。」
こんにちは。NoMaYです。ちょっとだけ前進、、、以前の無理矢理な裏技のCC-RXの以下のワーニングは消せました。結局、無理矢理、ですが、、、
W0521051: Standard requires that parameter "save" be given a type by a subsequent declaration ("int" assumed)
CC-RXソース例: Config_RIIC0_user.c (ピンク文字部分が今回の変更箇所)
/* Start user code for global. Do not edit comment generated here */#pragma inline_asm R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTRstatic void R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR(void);static void R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR(void){ RSTR #00H}#define R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(function_name, vector) static void function_name(int);\ R_BSP_PRAGMA(interrupt _##function_name(vect=vector, bank=0))\ R_BSP_PRAGMA(inline_asm __##function_name)\ static void __##function_name(void);\ static void __##function_name(void)\ {\ BRA.W __$##function_name\ }\ static void _##function_name(void);\ static void _##function_name(void)\ {\ if(BSP_CFG_FIT_IPL_MAX > (((R_BSP_GET_PSW()) >> 24) & 0xF))\ {\ R_BSP_SET_IPL(BSP_CFG_FIT_IPL_MAX);/* MVTIPL #IMM:4 */\ }\ R_BSP_SETPSW_I();\ R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX_HELPER_RSTR();\ /* The following function never return. */\ __##function_name();\ }#define _R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect(...) save)#define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect _R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_vect(#define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_void void#define R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(function_name,...) function_name(R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX_##__VA_ARGS__)R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_transmit_interrupt, VECT(RIIC0,TXI0))R_CG_PRAGMA_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_receive_interrupt, VECT(RIIC0,RXI0))#define r_Config_RIIC0_transmit_interrupt(...) R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_transmit_interrupt, __VA_ARGS__)#define r_Config_RIIC0_receive_interrupt(...) R_CG_ATTRIB_INTERRUPT_FIT_IPL_MAX(r_Config_RIIC0_receive_interrupt, __VA_ARGS__)/* End user code. Do not edit comment generated here */
#if FAST_INTERRUPT_VECTOR == VECT_RIIC0_TXI0#pragma interrupt r_Config_RIIC0_transmit_interrupt(vect=VECT(RIIC0,TXI0),fint)#else#pragma interrupt r_Config_RIIC0_transmit_interrupt(vect=VECT(RIIC0,TXI0))#endifstatic void r_Config_RIIC0_transmit_interrupt(void){ …途中省略…}
#if FAST_INTERRUPT_VECTOR == VECT_RIIC0_RXI0#pragma interrupt r_Config_RIIC0_receive_interrupt(vect=VECT(RIIC0,RXI0),fint)#else#pragma interrupt r_Config_RIIC0_receive_interrupt(vect=VECT(RIIC0,RXI0))#endifstatic void r_Config_RIIC0_receive_interrupt(void){ …途中省略…}
リストファイル:コンパイルオプションに一応 -save_acc (割り込み関数でのアキュムレータの退避/復帰を行う)を指定
00000000 __$_r_Config_RIIC0_transmit_interrupt: .STACK __$_r_Config_RIIC0_transmit_interrupt=8 .RVECTOR 53,__$_r_Config_RIIC0_transmit_interrupt00000000 FD76E000 SAVE #00H00000004 FD6A01 MVFC PSW, R100000007 FC5A110810 BFMOVZ #18H, #00H, #04H, R1, R10000000C 61A1 CMP #0AH, R10000000E 24rr BGTU L1200000010 L11: ; if_then_bb00000010 75700B MVTIPL #0BH00000013 L12: ; if_break_bb00000013 7FA8 SETPSW I00000015 FD76F000 RSTR #00H00000019 38rrrr W BRA.W __$r_Config_RIIC0_transmit_interrupt 0000001C FD76F000 RSTR #00H ← ここは実行されません00000020 7F95 RTE ← ここは実行されません00000045 __$r_Config_RIIC0_transmit_interrupt: .STACK __$r_Config_RIIC0_transmit_interrupt=2400000045 6E14 PUSHM R1-R400000047 FB22rrrrrrrr MOV.L #_g_riic0_mode_flag, R2 …途中省略…0000008E 6F14 POPM R1-R400000090 7F95 RTE …途中省略…000000AA 6F14 POPM R1-R4000000AC 7F95 RTE …途中省略…000000C3 6F14 POPM R1-R4000000C5 7F95 RTE …途中省略…000000E4 6F14 POPM R1-R4000000E6 7F95 RTE …途中省略…00000114 6F14 POPM R1-R400000116 7F95 RTE …途中省略…0000013A 6F14 POPM R1-R40000013C 7F95 RTE …途中省略…00000156 6F14 POPM R1-R400000158 7F95 RTE …途中省略…00000174 6F14 POPM R1-R400000176 7F95 RTE
00000022 __$_r_Config_RIIC0_receive_interrupt: .STACK __$_r_Config_RIIC0_receive_interrupt=8 .RVECTOR 52,__$_r_Config_RIIC0_receive_interrupt00000022 FD76E000 SAVE #00H00000026 FD6A01 MVFC PSW, R100000029 FC5A110810 BFMOVZ #18H, #00H, #04H, R1, R10000002E 61A1 CMP #0AH, R100000030 24rr BGTU L1500000032 L14: ; if_then_bb00000032 75700B MVTIPL #0BH00000035 L15: ; if_break_bb00000035 7FA8 SETPSW I00000037 FD76F000 RSTR #00H0000003B 38rrrr W BRA.W __$r_Config_RIIC0_receive_interrupt 0000003E FD76F000 RSTR #00H ← ここは実行されません00000042 7F95 RTE ← ここは実行されません000001B8 __$r_Config_RIIC0_receive_interrupt: .STACK __$r_Config_RIIC0_receive_interrupt=32000001B8 6E15 PUSHM R1-R5000001BA FB32rrrrrrrr MOV.L #_g_riic0_state, R3000001C0 6040 SUB #04H, R0 …途中省略…000002B6 6240 ADD #04H, R0000002B8 6F15 POPM R1-R5000002BA 7F95 RTE