こんにちは。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は以下の関数で三角関数演算器を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, R400000005 A049 MOV.L R1, 04H[R4]00000007 EC2F MOV.L [R2], R1500000009 A849 MOV.L 04H[R4], R10000000B EC4E MOV.L [R4], R140000000D A82C MOV.L 04H[R2], R40000000F FC8FEF FMUL R14, R1500000012 FC8F14 FMUL R1, R400000015 FC834F FSUB R4, R1500000018 E33F MOV.L R15, [R3]0000001A EC2F MOV.L [R2], R150000001C A82A MOV.L 04H[R2], R20000001E FC8FF1 FMUL R15, R100000021 FC8F2E FMUL R2, R1400000024 FC8BE1 FADD R14, R100000027 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