Forum: Mikrocontroller und Digitale Elektronik C-Variable in ARM-Assembler nutzten


von Michel (Gast)


Lesenswert?

Hi

Für ein C-Projekt, das ich momentan schreibe versuche ich gerade eine 
Zeitkritische Funktion in Assembler zu schreiben. Allerdings muss diese 
Funktion auf globale Variablen zugreifen.
Bisher probiere ich es so:
/* .C-Datei */
...
int *ptrGX;
...


/* .s-Datei */
...
.extern ptrGX         ; Aus Übersichtlichkeitsgründen
...
 mov   r3,#ptrGX     ; Adresse der Variablen in Register laden
...

Allerdings kommt dann folgende Fehlermeldung von dem arm-gas:
"Error: undefined symbol ptrGX used as an immediate value". Versuche, 
das Symbol ptrGX mit .def (Laut mitgeliefertem Manual) scheitern an der 
einfachen Tatsache, das gas dann meldet, dass er diesen Befehl nicht 
kennt.

Ich hoffe hier kann mir jemand helfen

Mfg
Michel.

von Ralph (Gast)


Lesenswert?

Übergib den Pointer auf  ptrGX mit dem Funktionsaufruf.
Und dann arbeite in der Assembler routine mit dem Pointer.


Abgesehen warum Assembler ? Wenn du die C-Funktion effizient schreibst, 
dann macht der Compiler schnelleren und kompakteren Code als 99% aller 
"Assemblefreaks" hinbekommen.

Und als Hobbyprogrammierer der mit Assembler anfängt, hast du keine 
Chance auf effizienten Assemblercode. Es fehlt schlicht und einfach die 
jahrelange Erfahrung.


Assembler ist auf dem ARM nur für wenige Registerzugriffe notwendig.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Üblicherweise werden C-Symbole (also Funktionsnamen, Variablen etc.) für 
den Linker mit einem vorangestellten Unterstrich versehen.
Probiere mal folgendes aus:

  /* .s-Datei */
  ...
  .extern _ptrGX     ; Aus Übersichtlichkeitsgründen
  ...
  mov   r3,#_ptrGX   ; Adresse der Variablen in Register laden
  ...

von Michael G. (michel)


Lesenswert?

Das habe ich mir auch schon überlegt, aber ich benutzte zu viele 
Pointer, so dass der Stack benutzt würde, und das möchte ich vermeiden. 
Zudem ist dieses Projekt eine "Spielwiese" um die verschiedenen 
Techniken auszuprobieren und zu dokumentieren, damit andere Personen in 
der Abteilung bzw. ich bei späteren Projekten einen einfacheren Einstieg 
haben.

Warum Assembler? Einfach, weil es schneller ist. Mir ist durchaus 
bewusst, das effizienter C-Code sehr schnell ist, und das man Assembler 
auch langsam programmieren kann, aber dennoch sind meine 
Assemblerroutinen deutlich schneller als die entsprechende C-Routinen, 
auch bei höchster Optimierungsstufe.

Und nein, ich bin eigentlich kein Hobbyprogrammierer und ich habe schon 
einige Assemblererfahrung, nur eben noch keine mit gcc, gas und einem 
Arm.

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.