Hallo zusammen, da ich jetzt schon den halben Tag mit suchen verbringe und immernoch keine Loesung habe, dachte ich mir ich frage mal euch... Und zwar folgendes Problem: Ich muss auf meinem Cortex M4F in einem Inline ASM auf Variablen meines C Programms zugreifen und diese dort auch editieren. Als Compiler nutze ich CCS und der mC ist ein Stellaris LX4F120H. In C habe ich die Variable wie folgt initialisiert: int start = 0; Und so habe ich es jetzt schon erfolglos in meinem inline ASM versucht: //asm(" .global start "); //asm(" .extern start "); auf dem weg ( asm(" .ref _start");) bekomme ich keine Fehlermeldung aber ich bekomme bei einem spaeteren Versuch auf die Variable zu schreiben immer eine Fehlermeldung: line 394: [E0004] Destination operand Rd must be a register LDR _start, R12 line 394: [E0004] Invalid addressing mode LDR _start, R12 Ich versuche da jetzt wirklich schon endlose Stunden dran rum und habe auch schon das halbe Internet danach durchforstet aber bisher ohne Erfolg. daher waere ich euch sehr dankbar wenn ihr mir helfen koenntet ;-)
merbe schrieb: > Ich muss auf meinem Cortex M4F in einem Inline ASM auf Variablen meines > C Programms zugreifen und diese dort auch editieren. Entsprechend dem Procedure-Call-Standard-For-ARM werden beim C-Funktionsaufruf die ersten 4 Variablen in den Registern R0-R3 abgelegt. Eine Möglichkeit auf globale Variable zuzugreifen ist also der C-Funktion Pointer darauf zu übergeben, und dann Inline darauf zuzugreifen, also z.B. unsigned int start; void myfunc(unsigned int *start) { asm("LDR R4, [R0]"); ... asm("STR R4, [R0]"); } void main(void) { myfunc(&start); }
Dreh den Spieß doch um: Definiere die Variable im Assembler-Teil, und greife von C aus "extern" drauf zu.
PS: Sauberer als dieser Call-Back Kram wäre natürlich eine saubere Set-/und Get-Routine.
merbe schrieb: > line 394: [E0004] Destination operand Rd must be a register > LDR _start, R12 > line 394: [E0004] Invalid addressing mode > LDR _start, R12 Steht bei LDR nicht zuerst das Zielregister und dahinter die Quelle? Und absolute Adressierung ist auf dem ARM sowieso schwierig, weil der so konsequent 32bit-RISC ist, daß er im Befehl keinen Platz für die Adresse hat.
Komplett mit Adresse wäre z.B. in der ARM-üblichen Notation: LDR R12, =_start LDR R12, [R12]
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.