RXv3コアのレジスタ一括退避機能の使い方(Register Bank Save Function Usage)を調べてみるスレッド

こんにちは。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%高速化します。


Parents
  • こんにちは。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))
    #endif
    static 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))
    #endif
    static 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_CrestInterrupt
    00000001 FD76E00F           SAVE #0FH
    00000005 05rrrrrr        A  BSR _CrestFunction
    00000009 FD76F00F           RSTR #0FH
    0000000D 7F95               RTE

     

    0000000F             __$r_Config_MTU3_MTU4_ad_interrupt:
                                .STACK  __$r_Config_MTU3_MTU4_ad_interrupt=8
                                .RVECTOR    128,__$r_Config_MTU3_MTU4_ad_interrupt
    0000000F FD76E00F           SAVE #0FH
    00000013 05rrrrrr        A  BSR _AdFunction
    00000017 FD76F00F           RSTR #0FH
    0000001B 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-RX


    GNURX


    ICCRX

     

Reply
  • こんにちは。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))
    #endif
    static 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))
    #endif
    static 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_CrestInterrupt
    00000001 FD76E00F           SAVE #0FH
    00000005 05rrrrrr        A  BSR _CrestFunction
    00000009 FD76F00F           RSTR #0FH
    0000000D 7F95               RTE

     

    0000000F             __$r_Config_MTU3_MTU4_ad_interrupt:
                                .STACK  __$r_Config_MTU3_MTU4_ad_interrupt=8
                                .RVECTOR    128,__$r_Config_MTU3_MTU4_ad_interrupt
    0000000F FD76E00F           SAVE #0FH
    00000013 05rrrrrr        A  BSR _AdFunction
    00000017 FD76F00F           RSTR #0FH
    0000001B 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-RX


    GNURX


    ICCRX

     

Children
No Data