mikrocontroller.net

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


Autor: Michel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralph (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
  ...

Autor: Michael Götz (michel)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.