Hi,
ich habe ein kleines Problem beim Debuggen einer Testapplikation, in der
eigentlich nur ein Timer initialisiert wird, der dann regelmäßig seine
ISR anspringen soll.
Debugge ich das Programm mit F6 (singlestep), kommt mein Debugger nach
dem Aufruf der Funktion "enableIRQ();" nichtmehr zurück. Irgendwas
scheint da schiefzugehen, was ich momentan nicht so ganz begreife.
Generell sollte das Debuggen mit Interrupts doch möglich sein, oder?!
1 | void DefaultISR (void) __attribute__ ((interrupt));
|
2 | void Timer0ISR (void) __attribute__ ((interrupt));
|
3 |
|
4 | unsigned int volatile gTimerTick;
|
5 |
|
6 | void DefaultISR (void){
|
7 | while (1){} // We should never get here, if we do it is an error
|
8 | }
|
9 |
|
10 | void Timer0ISR(void) {
|
11 | gTimerTick++;
|
12 | T0IR = 1; // Clear interrupt flag
|
13 | VICVectAddr = 0xFFFFFFFF; // Acknowledge Interrupt
|
14 | }
|
15 |
|
16 | int main(void){
|
17 | VICIntEnClr = 0xFFFFFFFFL; // Disable all Ints
|
18 | VICIntSelect = 0x00000000L;
|
19 | VICDefVectAddr = (unsigned long) DefaultISR; // set interrupt vector
|
20 |
|
21 | T0MR0 = 5999; // 100 microseconds = 6.000-1 counts
|
22 | T0MCR = 3; // Interrupt and Reset on MR0
|
23 | T0TCR = 1; // Timer0 Enable
|
24 |
|
25 | VICVectAddr3 = (unsigned long) Timer0ISR; // set interrupt vector
|
26 | VICVectCntl3 = 0x20 | 4; // use it for Timer 0 Interrupt
|
27 | VICIntEnable = 0x00000010; // enable Timer0 Interrupt
|
28 |
|
29 | VPBDIV = 1;
|
30 |
|
31 | enableIRQ();
|
32 |
|
33 | while(1){}
|
34 | }
|
35 |
|
36 | unsigned long enableIRQ(void)
|
37 | {
|
38 | unsigned long _cpsr;
|
39 |
|
40 | _cpsr = asm_get_cpsr();
|
41 | asm_set_cpsr(_cpsr & ~IRQ_MASK);
|
42 | return _cpsr;
|
43 | }
|
Gruss
Michael S