Forum: Mikrocontroller und Digitale Elektronik Arm7 TMS470r1 Probleme bei Portierung von IAR auf uVision3


von Michael T. (_mike_)


Lesenswert?

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

von Martin Thomas (Gast)


Lesenswert?

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.


von Michael T. (_mike_)


Lesenswert?

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

von Michael T. (_mike_)


Lesenswert?

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
Noch kein Account? Hier anmelden.