適用先: ULINK USB-JTAG Debugger
この記事に含まれている情報の適用先:
- ULINK USB-JTAG Adapter
- ULINK2 USB-JTAG Adapter
- uVision Debugger for ARM
質問
Philips LPC2000 デバイスに対して、次の 2 つのタイマ割り込み関数を記述しました。
long timeval = 0; long timeval_1 = 0;
void tc0 (void) __attribute__ ((interrupt)); // Generate Interrupt void tc1 (void) __attribute__ ((interrupt)); // Generate Interrupt
/* Setup the Timer Counter 0 Interrupt */
void init_timer (void) { T0MR0 = 149999; // 10mSec = 150.000-1 counts T0MCR = 3; // Interrupt and Reset on MR0 T0TCR = 1; // Timer0 Enable VICVectAddr0 = (unsigned long)tc0; // set interrupt vector in 0 VICVectCntl0 = 0x20 | 4; // use it for Timer 0 Interrupt VICIntEnable = 0x00000010; // Enable Timer0 Interrupt }
/* Timer Counter 0 Interrupt executes each 10ms @ 60 MHz CPU Clock */
void tc0 (void) { timeval++; T0IR = 1; // Clear interrupt flag VICVectAddr = 0; // Acknowledge Interrupt } /* Setup the Timer Counter 1 Interrupt */
void init_timer_1 (void) { T1MR0 = 74999; // 5mSec = 75.000-1 counts T1MCR = 3; // Interrupt and Reset on MR0 T1TCR = 1; // Timer1 Enable VICVectAddr1 = (unsigned long)tc1; // set interrupt vector in 1 VICVectCntl1 = 0x20 | 5; // use it for Timer 1 Interrupt VICIntEnable = 0x00000020; // Enable Timer1 Interrupt }
/* Timer Counter 1 Interrupt executes each 5ms @ 60 MHz CPU Clock */
void tc1 (void) { timeval_1++; T1IR = 1; // Clear interrupt flag VICVectAddr = 0; // Acknowledge Interrupt }
ブレークポイントを設定せずにコードを実行すると、想定どおりに動作します。ただし、タイマ割り込み関数ごとにブレークポイント(tc0 および tc1)を設定すると、両方の割り込みが同時に発生するようです。ULINK Debugger の使用時には、周辺機器は停止しないのでしょうか?
回答
そのとおりです。ARM Embedded ICE では、ブレークポイントに達しても、周辺機器の停止は許可されません。したがって、割り込みドリブンのコードをデバッグするには、複雑な対応が必要になる可能性があります。
この問題を解決する方法として、ドライバの開発時に Keil uVision Simulator を使用する方法が挙げられます。この Simulator はプログラムのシングル ステップ実行に応じて周辺機器を停止し、適切なタイミングを実現します。
詳細
- ARM Getting Started User's Guide