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....