Forum: Mikrocontroller und Digitale Elektronik Zugriff auf globale C Variablen in inline Assembly (Cortex


von merbe (Gast)


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 
;-)

von Lothar (Gast)


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);
}

von Roland (Gast)


Lesenswert?

Dreh den Spieß doch um:
Definiere die Variable im Assembler-Teil, und greife von C aus "extern" 
drauf zu.

von Roland E. (roland0815)


Lesenswert?

PS: Sauberer als dieser Call-Back Kram wäre natürlich eine saubere 
Set-/und Get-Routine.

von Nosnibor (Gast)


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.

von (prx) A. K. (prx)


Lesenswert?

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
Noch kein Account? Hier anmelden.