こんにちは。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です。かふぇルネの別スレッドで以前にCGのモータコンポーネントをほんのちょっとだけ触る機会があったのですが、ユーザ記述部だけでレジスタ一括退避機能を使う小細工が思い浮かんだので書いておきます。(ただ、実際にモータを回したことがありませんので、このコンポーネントが割り込み応答性が懸案事項になるようなものなのか分かっていません。なお、このスレッドで以前にも書きましたが、このコンポーネントだけの割り込み処理に着目して割り込み優先順位を上げて且つレジスタ一括退避機能を使っただけでは駄目で、他の割り込み処理が全て多重割り込み許可になってないと効果が無い、そういうものだと思っているのですけれども。)RX SmartConfiguratorで気になった点とか改善する案とか報告してみるスレッドcommunity-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/7536/rx-smartconfigurator/41726#41726「余談ですけれども、モータ制御コンポーネントは従来のCGコンポーネントと少し趣の違うところがあって、コールバック関数名を指定する欄がありますね。生成されたソースを見ると、コールバック関数を呼び出している箇所の上下にユーザ記述部が存在していて、何だかちょっと何というか、馬から落ちて落馬して、という言い回しのような感がありますね。(ユーザ記述部にユーザが書けば良いだけではと最初試した時は思いました、、、)(1) ひょっとしてオリジナルはRAマイコンのFSPのコンポーネントだったのかな?(2) それとも今はユーザ記述部といえどコード生成ソースに手を入れることをユーザさんが嫌がるようになりつつあるとか?(3) ユーザニーズというよりアプリケーションノート作成者さんがコード生成ソースに手を入れることを鬱陶しがる?ことに配慮したとか?」スマートコンフィグレータでモーターコンポーネント2つの時、VECTが重複になってしまう。community-ja.renesas.com/cafe_rene/forums-groups/mcu-mpu/rx/f/forum5/8062/2-vect/41725#41725以下、RX72Tで試したものです。(RX72Tの理由は、どうもモータ制御向けRXマイコンにしかモータコンポーネントは無いらしい、ことと、残念ながらRX66TはRXv3コアであってもレジスタ一括退避機能が搭載されていない、ことからです。)[追記]もっとも、割り込み処理の中身は実質的に空というか全てユーザ記述ですので、小細工という姑息なことをしなくても、いっそ既存の割り込み関数の記述部分を#if 0~#endifでごっそり無効化して、ソースファイルの最後のユーザ記述部に自前で全て書いてしまうのが一番簡単だと思い直しました。[ここまで追記]CC-RXソース例: Config_MTU3_MTU4_user.c
/* Start user code for global. Do not edit comment generated here */#undef VECT#define VECT( x , y ) _VECT( _ ## x ## _ ## y ), bank=15 /*, enable*//*if necessary*//* End user code. Do not edit comment generated here */
#if FAST_INTERRUPT_VECTOR == VECT_PERIA_INTA223#pragma interrupt r_Config_MTU3_MTU4_CrestInterrupt(vect=VECT(PERIA,INTA223),fint)#else#pragma interrupt r_Config_MTU3_MTU4_CrestInterrupt(vect=VECT(PERIA,INTA223))#endifstatic void r_Config_MTU3_MTU4_CrestInterrupt(void){ /* Start user code for r_Config_MTU3_MTU4_CrestInterrupt-1. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */ CrestFunction(); /* Start user code for r_Config_MTU3_MTU4_CrestInterrupt-2. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */}
#if FAST_INTERRUPT_VECTOR == VECT_S12AD_S12ADI#pragma interrupt r_Config_MTU3_MTU4_ad_interrupt(vect=VECT(S12AD,S12ADI),fint)#else#pragma interrupt r_Config_MTU3_MTU4_ad_interrupt(vect=VECT(S12AD,S12ADI))#endifstatic void r_Config_MTU3_MTU4_ad_interrupt(void){ /* Start user code for r_Config_MTU3_MTU4_ad_interrupt-1. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */ AdFunction(); /* Start user code for r_Config_MTU3_MTU4_ad_interrupt-2. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */}
リストファイル:コンパイルオプションに一応 -save_acc (割り込み関数でのアキュムレータの退避/復帰を行う)を指定
00000001 __$r_Config_MTU3_MTU4_CrestInterrupt: .STACK __$r_Config_MTU3_MTU4_CrestInterrupt=8 .RVECTOR 223,__$r_Config_MTU3_MTU4_CrestInterrupt00000001 FD76E00F SAVE #0FH00000005 05rrrrrr A BSR _CrestFunction00000009 FD76F00F RSTR #0FH0000000D 7F95 RTE
0000000F __$r_Config_MTU3_MTU4_ad_interrupt: .STACK __$r_Config_MTU3_MTU4_ad_interrupt=8 .RVECTOR 128,__$r_Config_MTU3_MTU4_ad_interrupt0000000F FD76E00F SAVE #0FH00000013 05rrrrrr A BSR _AdFunction00000017 FD76F00F RSTR #0FH0000001B 7F95 RTE
ICCRXソース例: Config_MTU3_MTU4_user.c
/* Start user code for global. Do not edit comment generated here */#define __interrupt R_BSP_PRAGMA(bank=15) __interrupt /*__nested*//*if necessary*//* End user code. Do not edit comment generated here */
#pragma vector = VECT_PERIA_INTA223#if FAST_INTERRUPT_VECTOR == VECT_PERIA_INTA223__fast_interrupt static void r_Config_MTU3_MTU4_CrestInterrupt(void)#else__interrupt static void r_Config_MTU3_MTU4_CrestInterrupt(void)#endif{ /* Start user code for r_Config_MTU3_MTU4_CrestInterrupt-1. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */ CrestFunction(); /* Start user code for r_Config_MTU3_MTU4_CrestInterrupt-2. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */}
#pragma vector = VECT_S12AD_S12ADI#if FAST_INTERRUPT_VECTOR == VECT_S12AD_S12ADI__fast_interrupt static void r_Config_MTU3_MTU4_ad_interrupt(void)#else__interrupt static void r_Config_MTU3_MTU4_ad_interrupt(void)#endif{ /* Start user code for r_Config_MTU3_MTU4_ad_interrupt-1. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */ AdFunction(); /* Start user code for r_Config_MTU3_MTU4_ad_interrupt-2. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */}
リストファイル:コンパイルオプションに一応 --save_acc (割り込み関数でアキュムレータの退避/復帰を行う)を指定(しかしながらそもそもバグによりアキュムレータの退避/復帰を行うコードは生成されないみたいですね)
\ In section .text, align 1, keep-with-next \ _r_Config_MTU3_MTU4_CrestInterrupt: \ ___interrupt_223: \ 000000 FD 76 E0 0F SAVE #0xf \ 000004 05 ..'.... BSR.A _CrestFunction \ 000008 FD 76 F0 0F RSTR #0xf \ 00000C 7F 95 RTE
\ In section .text, align 1, keep-with-next \ _r_Config_MTU3_MTU4_ad_interrupt: \ ___interrupt_128: \ 000000 FD 76 E0 0F SAVE #0xf \ 000004 05 ..'.... BSR.A _AdFunction \ 000008 FD 76 F0 0F RSTR #0xf \ 00000C 7F 95 RTE
GNURXソース例: Config_MTU3_MTU4_user.c
/* Start user code for global. Do not edit comment generated here */#define R_CG_ATTRIB_INTERRUPT_BANK(function_name, bank) function_name(void) __attribute__((naked, section(".text." #function_name), used));\ void _##function_name(void) __attribute__((section(".text." #function_name)));\ void function_name(void)\ {\ __asm__ volatile ("SAVE %0"::"i"(bank));/* Unfortunately R_BSP_ASM() cannot be used here. */\ /*R_BSP_SETPSW_I();*//*if necessary*/\ void _##function_name(void);\ _##function_name();\ __asm__ volatile ("RSTR %0"::"i"(bank));/* Unfortunately R_BSP_ASM() cannot be used here. */\ __asm__ volatile ("RTE");\ }\ void _##function_name(void)#define r_Config_MTU3_MTU4_CrestInterrupt(...) R_CG_ATTRIB_INTERRUPT_BANK(r_Config_MTU3_MTU4_CrestInterrupt, 15)#define r_Config_MTU3_MTU4_ad_interrupt(...) R_CG_ATTRIB_INTERRUPT_BANK(r_Config_MTU3_MTU4_ad_interrupt, 15)/* End user code. Do not edit comment generated here */
void r_Config_MTU3_MTU4_CrestInterrupt(void){ /* Start user code for r_Config_MTU3_MTU4_CrestInterrupt-1. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */ CrestFunction(); /* Start user code for r_Config_MTU3_MTU4_CrestInterrupt-2. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */}
void r_Config_MTU3_MTU4_ad_interrupt(void){ /* Start user code for r_Config_MTU3_MTU4_ad_interrupt-1. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */ AdFunction(); /* Start user code for r_Config_MTU3_MTU4_ad_interrupt-2. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */}
リストファイル: コンパイルオプションに一応 -msave-acc-in-interrupts (割り込み関数でアキュムレータの退避/復帰を行う)を指定
15 .section .text.r_Config_MTU3_MTU4_CrestInterrupt,"ax",@progbits 16 .global __r_Config_MTU3_MTU4_CrestInterrupt 18 __r_Config_MTU3_MTU4_CrestInterrupt: 22 0000 04 00 00 00 bra _CrestFunction 26 .global _r_Config_MTU3_MTU4_CrestInterrupt 28 _r_Config_MTU3_MTU4_CrestInterrupt: 31 .global $tableentry$223$.rvectors 32 $tableentry$223$.rvectors: 33 ; Note: Interrupt Handler 34 ; Note: Naked Function 37 0004 FD 76 E0 0F SAVE #15 41 0008 05 00 00 00 bsr __r_Config_MTU3_MTU4_CrestInterrupt 45 000c FD 76 F0 0F RSTR #15 49 0010 7F 95 RTE 52 ; Naked function: epilogue provided by programmer.
55 .section .text.r_Config_MTU3_MTU4_ad_interrupt,"ax",@progbits 56 .global __r_Config_MTU3_MTU4_ad_interrupt 58 __r_Config_MTU3_MTU4_ad_interrupt: 62 0000 04 00 00 00 bra _AdFunction 66 .global _r_Config_MTU3_MTU4_ad_interrupt 68 _r_Config_MTU3_MTU4_ad_interrupt: 71 .global $tableentry$128$.rvectors 72 $tableentry$128$.rvectors: 73 ; Note: Interrupt Handler 74 ; Note: Naked Function 77 0004 FD 76 E0 0F SAVE #15 81 0008 05 00 00 00 bsr __r_Config_MTU3_MTU4_ad_interrupt 85 000c FD 76 F0 0F RSTR #15 89 0010 7F 95 RTE 92 ; Naked function: epilogue provided by programmer.
以下、e2 studioプラグイン版RXスマートコンフィグレータと単体RXスマートコンフィグレータの画面コピーです。CC-RXGNURXICCRX