Guten Tag! Habe folgendes Problem. Versuche ein CAN demo projekt von IAR auf die Keil Umgebung uVision3 zu portieren. Soweit so gut. probleme gibt es mit den Interrupts und zwar: __enable_interrupt() //ist glaub ich eine IAR spezifische Anweisung und funktioniert unter uVision3 nicht. hat da jemand Erfahrung im Umgang mit dieser Umgebung? als error code wird ERROR: L6218E:Undefined symbol __enable_interrupt (...). ausgegeben. wär über jede hilfe dankbar. mfg Mike
Keine direkte Loesung, aber da noch keiner geantwortet hat: die Funktion duerfe das IRQ-Bit im CPSR des aktiven Modes löschen und damit INT-execptions auf der ARM-"Core-Ebene" aktivieren. Falls in der Keil/ARM-Library keine Funktion dazu vorhanden ist, kann man sich diese mit ein wenig inline-Assembler auch nachbauen. Fuer gcc z.B. so (Code aus einem Beispiel von R O Software):
1 | #define IRQ_MASK 0x00000080
|
2 | |
3 | inline unsigned asm_get_cpsr(void) |
4 | {
|
5 | unsigned long retval; |
6 | asm volatile ("mrs %0, cpsr" : "=r" (retval) : /* no inputs */ ); |
7 | return retval; |
8 | }
|
9 | |
10 | inline void asm_set_cpsr(unsigned val) |
11 | {
|
12 | asm volatile ("msr cpsr, %0" : /* no outputs */ : "r" (val) ); |
13 | }
|
14 | |
15 | void enableIRQ(void) |
16 | {
|
17 | unsigned my_cpsr; |
18 | |
19 | my_cpsr = asm_get_cpsr(); |
20 | asm_set_cpsr(my_cpsr & ~IRQ_MASK); |
21 | return my_cpsr; |
22 | }
|
Mit der uVision-Dokumentation zu inline-Assembler sollte das leicht portierbar sein. Ansonsten waere vielleicht auch hilfreicht anzugeben, welcher Compiler fuer das Project genutzt wird (GNU, CARM oder RealView - uVision unterstützt alle drei). Nur als Hinweis, falls der Startup-Code nicht aus dem Urspungscode portiert wurde: CPSR kann im User-Mode nicht veraendern werden, also im Startup-Code nachschauen, in welchen Mode "main()" gerufen wird. Falls "enable_interrupt" nicht ueber Software-Interrupts (SWI) implementiert ist (also so wie im Code oben), ist System-Mode die richtige Wahl. Man kann auch INT-exceptions direkt im Startup-Code aktivieren, das wird dann ueblicherweise zusammen mit der Stack-Pointer-Initialisierung gemacht. Dann sind INT-Exceptions von Anfang an aktiviert und man benötigt die Funktion eventuell nicht mehr. Bei Nutzung eines Interrupt-Controllers (die TI ARM7 haben wenn recht erinnert eine VIC-"Zelle") normalerweise keine Problem.
Super Danke für den Tipp. Hab zwar schon gestern geantwortet, das hat aber nicht so ganz funktioniert. Bin zwar nicht so fit in Assembeler, werd aber sofort deine Ideen ausprobieren. Benütze den RealView Compiler by the way. Werd mich jetzt wieder der Aufgabe widmen.. danke noch mal and have a nice day lg mike
FYI -> so funktionierts beim Real View Compiler __inline void enable_IRQ(void) { int tmp; __asm { MRS tmp, CPSR BIC tmp, tmp, #0x80 MSR CPSR_c, tmp } } __inline void disable_IRQ(void) { int tmp; __asm { MRS tmp, CPSR ORR tmp, tmp, #0x80 MSR CPSR_c, tmp } }
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.