Forum: Mikrocontroller und Digitale Elektronik WIE LPC2292 Methode in RAM kopieren und dort ausführen


von Mandrake (Gast)


Lesenswert?

Verwendete Hardware: ARM uC LPC2292 von NXP
Verwendeter Compiler: Keil uVision 3.72
Programmiersprache: C zu kleinen Teilen ASM
Verwendeter Debugger: Lauterbach

Mein Vorhaben:
Ich möchte eine Methode in einen freien RAM-Bereich kopieren und dort 
dann ausführen. Ziel ist es später einmal eine ISR in den RAM zu 
kopieren und dort laufen zu lassen.

Bisher habe ich es geschafft diese Methode
1
void IRQ_im_RAM_Routine(void)__irq
2
//void IRQ_im_RAM_Routine(void)
3
{
4
  //Routine ist 79Byte groß
5
  if (IOPIN3 & WD_TRIG)
6
  {
7
    IOCLR3 = WD_TRIG;
8
  }
9
  else
10
  {
11
    IOSET3 = WD_TRIG;
12
  }
13
14
  T0IR = T0IR;
15
  VICVectAddr = 0x00000000uL; //TerminateISR
16
17
}

mittels Pointer in den RAM zu kopieren und auch aufzurufen.

Nun zu meinem Problem:
Im Debugger kann ich mir wunderbar anschauen wie der Code korrekt 
kopiert wird und auch angesprungen wird. Beim ersten LDR.... im 
Dissassembly der RAM-Routine springt der Controller allerdings in die 
Abbruch-Exception.

Ich vermute, dass die zum großen Teil relativistisch (z.B. relative 
Sprünge...) ausgelegten Assemblerbefehle für die Adresse im RAM nicht 
mehr stimmen und deshalb die Exception auftritt. Falls das so ist, wie 
kann ich dem Compiler anweisen mir die og Methode für den RAM-Bereich zu 
kompilieren? Oder liegt es noch woanders dran?

Die Methode die in den RAM kopiert sieht übrigens so aus:
1
void ISR_in_RAM_kopieren(void)
2
{
3
  uchar8* ucZielAdresse;
4
  uchar8* ucQuellAdresse;
5
  uchar8 ucByteCount = 0;
6
7
  ucZielAdresse = (uchar8*)0x40000020;
8
  ucQuellAdresse = (uchar8*)IRQ_im_RAM_Routine;
9
10
  for (ucByteCount = 0; ucByteCount < 79; ucByteCount++)
11
  {
12
    *ucZielAdresse = *ucQuellAdresse;
13
    ucZielAdresse++;
14
    ucQuellAdresse++;
15
  }
16
}

Wäre super wenn mir jemand weiterhelfen könnte oder mir Quellen für 
Beispielcode nennen könnte.

Gruß

Mandrake

P.S.: Ein andere Überlegung führt mich in Richtung Scatterfile/Linker, 
aus der Hilfe von Keil werde ich allerdings nicht so wirklich schlau. In 
Sachen Linker bin ich leider nicht sehr bewandert....

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.