Forum: Mikrocontroller und Digitale Elektronik ARM: Absturz zur Laufzeit


von Simon S. (Gast)


Angehängte Dateien:

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!

von Simon S. (Gast)


Angehängte Dateien:

Lesenswert?

die startup datei.

von Simon S. (Gast)


Angehängte Dateien:

Lesenswert?

und die header datei.

von let (Gast)


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.

von Simon S. (Gast)


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.

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.