Zugriff auf globale C Variablen in inline Assembly (Cortex

Gast #3418318
Lesenswert?

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 
;-)
Gast #3418443
Lesenswert?

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);
}
Gast #3421217
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren