PC版 SYSLAB blog  http://syslab.asablo.jp/blog/......

Raisonance Ride7 & ARM Tools (17) LPC2xxx の Startup (3)
2012-09-26


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

  #define TIMER0_INT 4 #define LED_ON 0 #define LED_OFF 1 #define LED_TOGGLE 2 volatile unsigned long timer0_counter = 0; void IRQ_Handler( void ) { if(T0IR & 1){ T0IR = 1; /* clear interrupt flag */ timer0_counter++; } } void LEDon(void) { FIO1CLR2 |= 0x04; } void LEDoff(void) { FIO1SET2 |= 0x04; } void LEDtoggle(void) { FIO1PIN2 ^= 0x04; } void SWI_Handler( unsigned long r0 ) { switch(r0){ // r0= SWI code case LED_ON: LEDon(); break; case LED_OFF: LEDoff(); break; case LED_TOGGLE: LEDtoggle(); break; default: break; } } int main(void) { SCS |= 1; FIO1DIR = 1 << 18; T0CTCR = 0; T0MR0 = 500000 - 1; T0MCR = 0x3; VICIntEnable |= (1 << TIMER0_INT); /* Enable Interrupt */ T0TCR = 1; while(1) if(timer0_counter>0){ asm("swi #2"); //LED toggle timer0_counter=0; } }


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
[ARM]
[マイコン]

コメント(全0件)
コメントをする


記事を書く
powered by ASAHIネット