ARM: Absturz zur Laufzeit

Gast #1114705
Lesenswert?

Hallo miteinand,

ich arbeite mich gerade ein wenig in OpenOCD/armgcc ein.

Gerade versuche ich mich an den Interrupts - das Ergebnis soll eine 
blinkende LED sein. Allerdings schmiert der Controler anscheinend ab 
sobald ich im CPSR das Interruptsystem freigebe (openOCD regiert einfach 
nicht mehr)

Die gdb ausgabe:
1
34    myInit();  
2
(gdb) s
3
myInit () at main.c:152
4
152    SCS = 0x1;
5
(gdb) s
6
154    FIO0DIR |= 0x7;  // pin P0.26 is an output, everything else is input after reset
7
(gdb) s
8

9
157    mytimer->CTCR = 0x00; //switch to timer mode
10
(gdb) 
11
158    mytimer->PR = 0; // if a prescaler is needed - here it is
12
(gdb) 
13
159    mytimer->MR0 = 14745600; //Match register;
14
(gdb) 
15
160    mytimer->MCR = 0x3; // reset the timer and generate interrupt when matched MR0
16
(gdb) 
17
161    mytimer->TCR = 0x01; //enable timer  
18
(gdb) 
19
164    VICVectAddr0 = (unsigned long)myInterrupt;   // set interrupt vector in 0
20
(gdb) 
21
165    VICVectCntl0 = 4 | (1 << 5); // use it for Timer 0 Interrupt:
22
(gdb) 
23
166    VICIntEnable = (1<<4);    // Enable Timer0 Interrupt
24
(gdb) 
25
169    asm volatile ("msr   CPSR_c, #0x10|0x80 ");
26
(gdb) 
27
170  }
28
(gdb)

Meine Konfiguration:
Debugger: Olimex ARM-USB-TINY 
(http://www.olimex.com/dev/arm-usb-tiny.html)
Board: Olimex LPC-H2103 (http://www.olimex.com/dev/lpc-h2103.html)

Kann durchaus sein dass da noch Leichtsinnsfehler drin stecken.

Sourceode ist im Anhang.

Hoffe jemand hat ne Idee woran das liegen könnte - danke!
Angehängte Dateien:
Gast #1115089
Lesenswert?

Abgesehen davon das die I- und F-Bits gelöscht werden müssen
um Interrupts zu erlauben, halte ich es für keine gute Idee
alle anderen Bits im CPSR zu löschen.

Am einfachsten wäre es die beiden Bits in der crt.s für den
System-Mode gar nicht erst zu setzten (der Kommentar sagt
fälschlicherweise etwas über User-Mode).

Das I-Bit des Timers wird in der ISR nicht zurückgesetzt. Das führt
dazu das die ISR ständig aufgerufen wird.

Die Stack Größen scheinen mir nicht zu stimmen. Für den verwendeten
System-Mode sowie den IRQ-Mode werden anscheinend nur jeweils
vier Bytes reserviert. Das ist etwas knapp.

Das Programm wird vermutlich nicht funktionieren wenn es
für den Thumb-Befehlssatzt übersetzt wird (GCC-Bug im ISR Preamble).
Ich bin da nicht auf dem neuesten Stand aber wenn Thumb-Code
verwendet werden soll müssen die ISRs in ein separates Modul das
für den ARM-Mode übersetzt wird oder es gibt einen "Wrapper" in
der CRT. Im letztern Fall muß (und darf) der Compiler gar nicht wissen
das eine bestimmte Funktion eine ISR ist.
Gast #1116619
Lesenswert?

Vielen Dank let! Jetzt habe ich zumindest mal einen Ansatzpunkt. Der 
ganze Unterbau kommt vom Olimex LED-Blink-Beispiel - kann also gut sein 
dass die das nur soweit hingetrickst haben dass grad LED blinken funzt - 
aber mit irgendwas muss man ja anfangen.

Mal schauen ob ich das hinbekomme.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren