SWI_Handler 、なかなか手ごわかった。
結局Cとインラインアセンブラが混在する形になってしまった。さらに crt0_LPC23x.s にも修正を加えなければならなくなった。テストのためのテストだからいいことにしよう。
では、さっそく crt0_LPC23x.s の修正部分を見てみよう。
SWIHandler:
SaveContext r0,r12 /*; Save the workspace plus the current*/
/*; return address lr_ svc and spsr_svc.*/
ldr r0, [lr, #-4] /*; Get swi code.*/
and r0, #0xFF
bl SWI_Handler /*; Branch to SWI_Handler.*/
RestoreContext r0,r12 /*; Return to the instruction following...*/
/*; ...the SWI instruction.*/
赤で記したのが追加した部分になる。SWI コードを取り出すためのものだがこれをコール先に持ち込むことができなかった。
そして SWI 割り込みサンプル。main_swi.c
SWI_Handler を呼び出す部分をCでどのようにすればよいのか分からなかったのでインラインアセンブラでそのまま書いている。実際に使う場合は NXP サンプル swi_handler.s のようにするのがよいだろう。
いろいろやってわかった事、割り込みのエントリー部分はじゃまなだけで必要ないということだ。さっさと削除してしまおう。そのほうがすっきりして分かりやすくなる。
環境:CQ-FRK-NXP-ARM
+ Ride7 version 7.30.10.0169
+ RKit-ARM version 1.30.10.0356
+ GCC Sourcery CodeBench Lite 2012.03-56
セコメントをする