Forum: Mikrocontroller und Digitale Elektronik Interrupts mit gdb und Eclipse über olimex-arm-usb


von Michael S (Gast)


Lesenswert?

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

von michael s (Gast)


Lesenswert?

Nachtrag:
Prozessor ist LPC2129

von antworter (Gast)


Lesenswert?

Mehrere "Angriffpunkte":

(1)
erstmal solltest Du ohne Interrupts (also pollen !) überprüfen, ob der 
Timer ordentlich konfiguriert ist und läuft.

(2)
Debuggen geht am einfachsten aus dem SRAM heraus (soft interrupts) -> 
Code und INTs müssen dabei im RAM liegen.
Nicht vergessen: MEMMAP=2 damit die INT-Tabelle von 0x40000000 geholt 
wird.
Nicht vergessen: Gültige INT-Tabelle in den SRAM kopieren !

Für (2) müssen sowohl Linkerscript (.ld) als auch crt.s angepaßt werden.

Guckst Du hier:

http://www.koders.com/noncode/fid726AC4F6596FCC0F3FAC1E3ACE6C1DE279068990.aspx

von Michael S (Gast)


Lesenswert?

Hi, das MEMMAP wars =)

Danke dir...

lg Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.