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です。

    またちょっと脱線しますけれども、CC-RXは以下の関数で三角関数演算器を1回使用しただけでしたね。賢いなぁ、と思いました。(他方、ICCRXとGNURXは三角関数演算器を4回使用しました。ソース通りとも言えますが、普通かなぁ。)

    試したソースです。

    struct vec { float X; float Y; };
    void rot(float t, struct vec *v1, struct vec *v2);
    void rot(float t, struct vec *v1, struct vec *v2)
    {
        v2->X = - sinf(t) * v1->Y + cosf(t) * v1->X;
        v2->Y =   sinf(t) * v1->X + cosf(t) * v1->Y;
    }

     
    CC-RXでのリストファイル (赤文字箇所で三角関数演算器の演算を開始させています)

    00000000                         _rot:
    00000000 FB4E101408                     MOV.L #00081410H, R4
    00000005 A049                           MOV.L R1, 04H[R4]
    00000007 EC2F                           MOV.L [R2], R15
    00000009 A849                           MOV.L 04H[R4], R1
    0000000B EC4E                           MOV.L [R4], R14
    0000000D A82C                           MOV.L 04H[R2], R4
    0000000F FC8FEF                         FMUL R14, R15
    00000012 FC8F14                         FMUL R1, R4
    00000015 FC834F                         FSUB R4, R15
    00000018 E33F                           MOV.L R15, [R3]
    0000001A EC2F                           MOV.L [R2], R15
    0000001C A82A                           MOV.L 04H[R2], R2
    0000001E FC8FF1                         FMUL R15, R1
    00000021 FC8F2E                         FMUL R2, R14
    00000024 FC8BE1                         FADD R14, R1
    00000027 A039                           MOV.L R1, 04H[R3]
    00000029 02                             RTS

     
    ICCRXでのリストファイル (赤文字箇所で三角関数演算器の演算を開始させています)


       \                     _rot:
       \   000000 FB 5E 10 14  MOV.L     #0x81410,R5
       \          08
       \   000005 A0 59        MOV.L     R1,0x4[R5]
       \   000007 A8 5C        MOV.L     0x4[R5],R4
       \   000009 A0 59        MOV.L     R1,0x4[R5]
       \   00000B EC 5E        MOV.L     [R5],R14
       \   00000D EC 25        MOV.L     [R2],R5
       \   00000F FC 8F E5     FMUL      R14,R5
       \   000012 ED 2E 01     MOV.L     0x4[R2],R14
       \   000015 FC 8F E4     FMUL      R14,R4
       \   000018 FF 84 45     FSUB      R4,R5,R4
       \   00001B FB 5E 10 14  MOV.L     #0x81410,R5
       \          08
       \   000020 E3 34        MOV.L     R4,[R3]
       \   000022 A0 59        MOV.L     R1,0x4[R5]
       \   000024 A8 5C        MOV.L     0x4[R5],R4
       \   000026 EC 2F        MOV.L     [R2],R15
       \   000028 FC 8F 4F     FMUL      R4,R15
       \   00002B A0 59        MOV.L     R1,0x4[R5]
       \   00002D EC 51        MOV.L     [R5],R1
       \   00002F A8 2D        MOV.L     0x4[R2],R5
       \   000031 FC 8F 51     FMUL      R5,R1
       \   000034 FC 8B F1     FADD      R15,R1
       \   000037 A0 39        MOV.L     R1,0x4[R3]
       \   000039 02           RTS

     
    GNURXでのリストファイル (赤文字箇所で三角関数演算器の演算を開始させています)
    (RXv3のDPFPUを有効にしているとDPFPUのレジスタを使う変なクセがありますね)

     456                                _rot:
     461 0000 7E A7                         push.l  r7
     463 0002 75 B0 01                      dpushm.d    dr0-dr1
     467 0005 FB EE 14 14 08                mov.L   #0x81414, r14
     468 000a E3 E1                         mov.L   r1, [r14]
     469 000c EC E4                         mov.L   [r14], r4
     471 000e FB FE 10 14 08                mov.L   #0x81410, r15
     473 0013 A8 2F                         mov.L   4[r2], r7
     475 0015 E7 F1 01                      mov.L   r1, 4[r15]
     477 0018 FD 77 84 0A                   ftod    r4, dr0
     479 001c EC F4                         mov.L   [r15], r4
     481 001e 76 90 0C 02                   dneg    dr0, dr0
     482 0022 76 90 0D 1C                   dtof    dr0, dr1
     483 0026 FD 75 85 10                   dmov.L  drl1, r5
     485 002a FC 8F 75                      fmul    r7, r5
     487 002d EC 27                         mov.L   [r2], r7
     488 002f FC 8F 74                      fmul    r7, r4
     490 0032 FC 8B 45                      fadd    r4, r5
     492 0035 E3 35                         mov.L   r5, [r3]
     495 0037 E3 E1                         mov.L   r1, [r14]
     496 0039 EC E4                         mov.L   [r14], r4
     498 003b EC 2E                         mov.L   [r2], r14
     500 003d E7 F1 01                      mov.L   r1, 4[r15]
     501 0040 EC F5                         mov.L   [r15], r5
     503 0042 A8 2A                         mov.L   4[r2], r2
     506 0044 FC 8F E4                      fmul    r14, r4
     508 0047 FC 8F 25                      fmul    r2, r5
     510 004a FC 8B 45                      fadd    r4, r5
     512 004d A0 3D                         mov.L   r5, 4[r3]
     514 004f 75 B8 01                      dpopm.d dr0-dr1
     515 0052 7E B7                         pop r7
     516 0054 02                            rts

     

Reply
  • こんにちは。NoMaYです。

    またちょっと脱線しますけれども、CC-RXは以下の関数で三角関数演算器を1回使用しただけでしたね。賢いなぁ、と思いました。(他方、ICCRXとGNURXは三角関数演算器を4回使用しました。ソース通りとも言えますが、普通かなぁ。)

    試したソースです。

    struct vec { float X; float Y; };
    void rot(float t, struct vec *v1, struct vec *v2);
    void rot(float t, struct vec *v1, struct vec *v2)
    {
        v2->X = - sinf(t) * v1->Y + cosf(t) * v1->X;
        v2->Y =   sinf(t) * v1->X + cosf(t) * v1->Y;
    }

     
    CC-RXでのリストファイル (赤文字箇所で三角関数演算器の演算を開始させています)

    00000000                         _rot:
    00000000 FB4E101408                     MOV.L #00081410H, R4
    00000005 A049                           MOV.L R1, 04H[R4]
    00000007 EC2F                           MOV.L [R2], R15
    00000009 A849                           MOV.L 04H[R4], R1
    0000000B EC4E                           MOV.L [R4], R14
    0000000D A82C                           MOV.L 04H[R2], R4
    0000000F FC8FEF                         FMUL R14, R15
    00000012 FC8F14                         FMUL R1, R4
    00000015 FC834F                         FSUB R4, R15
    00000018 E33F                           MOV.L R15, [R3]
    0000001A EC2F                           MOV.L [R2], R15
    0000001C A82A                           MOV.L 04H[R2], R2
    0000001E FC8FF1                         FMUL R15, R1
    00000021 FC8F2E                         FMUL R2, R14
    00000024 FC8BE1                         FADD R14, R1
    00000027 A039                           MOV.L R1, 04H[R3]
    00000029 02                             RTS

     
    ICCRXでのリストファイル (赤文字箇所で三角関数演算器の演算を開始させています)


       \                     _rot:
       \   000000 FB 5E 10 14  MOV.L     #0x81410,R5
       \          08
       \   000005 A0 59        MOV.L     R1,0x4[R5]
       \   000007 A8 5C        MOV.L     0x4[R5],R4
       \   000009 A0 59        MOV.L     R1,0x4[R5]
       \   00000B EC 5E        MOV.L     [R5],R14
       \   00000D EC 25        MOV.L     [R2],R5
       \   00000F FC 8F E5     FMUL      R14,R5
       \   000012 ED 2E 01     MOV.L     0x4[R2],R14
       \   000015 FC 8F E4     FMUL      R14,R4
       \   000018 FF 84 45     FSUB      R4,R5,R4
       \   00001B FB 5E 10 14  MOV.L     #0x81410,R5
       \          08
       \   000020 E3 34        MOV.L     R4,[R3]
       \   000022 A0 59        MOV.L     R1,0x4[R5]
       \   000024 A8 5C        MOV.L     0x4[R5],R4
       \   000026 EC 2F        MOV.L     [R2],R15
       \   000028 FC 8F 4F     FMUL      R4,R15
       \   00002B A0 59        MOV.L     R1,0x4[R5]
       \   00002D EC 51        MOV.L     [R5],R1
       \   00002F A8 2D        MOV.L     0x4[R2],R5
       \   000031 FC 8F 51     FMUL      R5,R1
       \   000034 FC 8B F1     FADD      R15,R1
       \   000037 A0 39        MOV.L     R1,0x4[R3]
       \   000039 02           RTS

     
    GNURXでのリストファイル (赤文字箇所で三角関数演算器の演算を開始させています)
    (RXv3のDPFPUを有効にしているとDPFPUのレジスタを使う変なクセがありますね)

     456                                _rot:
     461 0000 7E A7                         push.l  r7
     463 0002 75 B0 01                      dpushm.d    dr0-dr1
     467 0005 FB EE 14 14 08                mov.L   #0x81414, r14
     468 000a E3 E1                         mov.L   r1, [r14]
     469 000c EC E4                         mov.L   [r14], r4
     471 000e FB FE 10 14 08                mov.L   #0x81410, r15
     473 0013 A8 2F                         mov.L   4[r2], r7
     475 0015 E7 F1 01                      mov.L   r1, 4[r15]
     477 0018 FD 77 84 0A                   ftod    r4, dr0
     479 001c EC F4                         mov.L   [r15], r4
     481 001e 76 90 0C 02                   dneg    dr0, dr0
     482 0022 76 90 0D 1C                   dtof    dr0, dr1
     483 0026 FD 75 85 10                   dmov.L  drl1, r5
     485 002a FC 8F 75                      fmul    r7, r5
     487 002d EC 27                         mov.L   [r2], r7
     488 002f FC 8F 74                      fmul    r7, r4
     490 0032 FC 8B 45                      fadd    r4, r5
     492 0035 E3 35                         mov.L   r5, [r3]
     495 0037 E3 E1                         mov.L   r1, [r14]
     496 0039 EC E4                         mov.L   [r14], r4
     498 003b EC 2E                         mov.L   [r2], r14
     500 003d E7 F1 01                      mov.L   r1, 4[r15]
     501 0040 EC F5                         mov.L   [r15], r5
     503 0042 A8 2A                         mov.L   4[r2], r2
     506 0044 FC 8F E4                      fmul    r14, r4
     508 0047 FC 8F 25                      fmul    r2, r5
     510 004a FC 8B 45                      fadd    r4, r5
     512 004d A0 3D                         mov.L   r5, 4[r3]
     514 004f 75 B8 01                      dpopm.d dr0-dr1
     515 0052 7E B7                         pop r7
     516 0054 02                            rts

     

Children
No Data