WIE LPC2292 Methode in RAM kopieren und dort ausführen

Gast #1923676
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....

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.