KPIT GNUSH v1001 Windows Tool Chain で作成したプロジェクトは、 どうも割り込みの部分に不具合がありそうなので、その部分を見てみる。
2FE6 _INT_CMT MOV.L R14,@-R15
FF0B FMOV.S FR0,@-R15
FF1B FMOV.S FR1,@-R15
FF2B FMOV.S FR2,@-R15
FF3B FMOV.S FR3,@-R15
FF4B FMOV.S FR4,@-R15
FF5B FMOV.S FR5,@-R15
FF6B FMOV.S FR6,@-R15
FF7B FMOV.S FR7,@-R15
FF8B FMOV.S FR8,@-R15
FF9B FMOV.S FR9,@-R15
FFAB FMOV.S FR10,@-R15
FFBB FMOV.S FR11,@-R15
4F02 STS.L MACH,@-R15
4F12 STS.L MACL,@-R15
4F52 STS.L FPUL,@-R15
4F62 STS.L FPSCR,@-R15
2F06 MOV.L R0,@-R15
2F16 MOV.L R1,@-R15
2F26 MOV.L R2,@-R15
2F36 MOV.L R3,@-R15
2F46 MOV.L R4,@-R15
2F56 MOV.L R5,@-R15
2F66 MOV.L R6,@-R15
2F76 MOV.L R7,@-R15
4F22 STS.L PR,@-R15
6EF3 MOV R15,R14
D111 MOV.L @(H'0044:8,PC),R1
D211 MOV.L @(H'0044:8,PC),R2
4266 LDS.L @R2+,FPSCR
72FC ADD #H'FC,R2
414B JSR/N @R1
6FE3 MOV R14,R15
4F26 LDS.L @R15+,PR
67F6 MOV.L @R15+,R7
66F6 MOV.L @R15+,R6
65F6 MOV.L @R15+,R5
64F6 MOV.L @R15+,R4
63F6 MOV.L @R15+,R3
62F6 MOV.L @R15+,R2
61F6 MOV.L @R15+,R1
60F6 MOV.L @R15+,R0
4F66 LDS.L @R15+,FPSCR
4F56 LDS.L @R15+,FPUL
4F16 LDS.L @R15+,MACL
4F06 LDS.L @R15+,MACH
FBF9 FMOV.S @R15+,FR11
FAF9 FMOV.S @R15+,FR10
F9F9 FMOV.S @R15+,FR9
F8F9 FMOV.S @R15+,FR8
F7F9 FMOV.S @R15+,FR7
F6F9 FMOV.S @R15+,FR6
F5F9 FMOV.S @R15+,FR5
F4F9 FMOV.S @R15+,FR4
F3F9 FMOV.S @R15+,FR3
F2F9 FMOV.S @R15+,FR2
F1F9 FMOV.S @R15+,FR1
F0F9 FMOV.S @R15+,FR0
6EF6 MOV.L @R15+,R14
002B RTE
0009 NOP
0009 NOP
1C00 MOV.L R0,@(H'00:4,R12)
1126 MOV.L R2,@(H'18:4,R1)
1C08 MOV.L R0,@(H'20:4,R12)
000C MOV.B @(R0,R0),R0
長い!
それでは Renesas shc のコードと比べてみよう。
_INT_CMT_CMI0: ; function: INT_CMT_CMI0
D28A MOV.L L243+2,R2 ; _int_cmt_cmi0
424B JSR/N @R2
005B RESBANK
002B RTE
0009 NOP
これは!
もう驚くしかない。
レジスタ・バンクを使えばこんなに簡素になるということか?
驚いたところで解決にはならないので、対策を考える。
当然 Renesas shc のコードと同じように RESBANK を使うことにする。
コンパイルして実行!
何の問題もない。
とりあえず RESBANK を使えば問題なさそうだ。
これは、sh7262 (sh2a) だけの問題なのか?
それにしても RESBANK を使わない場合、割り込みで暴走するのはコンパイラのバグなのだろうか?
そのうち調べてみよう。
環境: (HEW Version 4.07.01.004) + (KPIT GNUSH v1001 Windows Tool Chain (ELF)) + (FRK-SH2A)
セコメントをする