mikrocontroller.net

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


Autor: Michael S (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!
void DefaultISR (void) __attribute__ ((interrupt)); 
void Timer0ISR (void) __attribute__ ((interrupt)); 

unsigned int volatile gTimerTick;

void DefaultISR (void){
  while (1){} // We should never get here, if we do it is an error
}

void Timer0ISR(void) {
  gTimerTick++;
  T0IR = 1; // Clear interrupt flag
  VICVectAddr = 0xFFFFFFFF; // Acknowledge Interrupt
}

int main(void){
  VICIntEnClr = 0xFFFFFFFFL; // Disable all Ints
  VICIntSelect = 0x00000000L;
  VICDefVectAddr = (unsigned long) DefaultISR; // set interrupt vector
  
  T0MR0 = 5999; // 100 microseconds = 6.000-1 counts
  T0MCR = 3; // Interrupt and Reset on MR0
  T0TCR = 1;  // Timer0 Enable

  VICVectAddr3 = (unsigned long) Timer0ISR; // set interrupt vector
  VICVectCntl3 = 0x20 | 4;  // use it for Timer 0 Interrupt
  VICIntEnable = 0x00000010;  // enable Timer0 Interrupt
  
  VPBDIV = 1; 
  
  enableIRQ();

  while(1){}
}

unsigned long enableIRQ(void)
{
  unsigned long _cpsr;

  _cpsr = asm_get_cpsr();
  asm_set_cpsr(_cpsr & ~IRQ_MASK);
  return _cpsr;
}


Gruss
Michael S

Autor: michael s (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:
Prozessor ist LPC2129

Autor: antworter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/fid726AC4F6596FCC0F3...

Autor: Michael S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, das MEMMAP wars =)

Danke dir...

lg Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.