www.mikrocontroller.net

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


Autor: Mandrake (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
void IRQ_im_RAM_Routine(void)__irq
//void IRQ_im_RAM_Routine(void)
{
  //Routine ist 79Byte groß
  if (IOPIN3 & WD_TRIG)
  {
    IOCLR3 = WD_TRIG;
  }
  else
  {
    IOSET3 = WD_TRIG;
  }

  T0IR = T0IR;
  VICVectAddr = 0x00000000uL; //TerminateISR

}

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:
void ISR_in_RAM_kopieren(void)
{
  uchar8* ucZielAdresse;
  uchar8* ucQuellAdresse;
  uchar8 ucByteCount = 0;

  ucZielAdresse = (uchar8*)0x40000020;
  ucQuellAdresse = (uchar8*)IRQ_im_RAM_Routine;

  for (ucByteCount = 0; ucByteCount < 79; ucByteCount++)
  {
    *ucZielAdresse = *ucQuellAdresse;
    ucZielAdresse++;
    ucQuellAdresse++;
  }
}

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.