www.mikrocontroller.net

Forum: Compiler & IDEs Globale Variable an Assembler Funktion übergeben


Autor: bluemole (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

erstmal vielen Dank an alle, die diese Seite betreiben und an die
Freaks die geduldig Antworten. Ohne dieser Seite wäre ich wohl nie
soweit gekommen, meine Assembler- Funktionen in ein C-Programm zu
implementieren.
Jetzt habe ich aber noch zwei Fragen:
1. Ich habe in meinem C-Hauptprogramm mehrere globale Variblen
(hauptsächlich Flags) und ich möchte diese Flags in meinen Assembler-
Funktionen setzen.
Codeausschnitt:

C-Main:  #include <avr/io.h>
         extern void trigon(void);

         unsigned char Flag1;    // Globales Flag
         unsigned char Flag2;    // Globales Flag

         int main (void)
         { trigon ();..........}

Assembler trigon.S

         #define __SFR__OFFSET 0
         #include <avr/io.h>

         #define temp r16

         .stabs "" ......

         trigon:
           ser temp
           ldi Flag1,temp
           ldi Flag2,temp
           ........

Das setzen der Flags funktioniert nicht. Fehlermeldung: constant value
required. Ich hab's mir schon gedacht das der Code nicht funktioniert.
Aber ich finde auch keine Lösung, weil mir noch ein wenig das tiefere
Verständnis fehlt. :-). Aber ich bin am arbeiten.

Frage 2:
Was bedeutet der Code:
   .stabs "",100,0,trigon
   .stabs "trigon.S",100,0,0,trigon

Vielleicht kann mir ja auch jemand noch ein Tutorial (bitte mit
gültigen Link) zu diesem Thema empfehlen.

Danke bluemole

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1) Dein LDI ist flasch.  LDI - load immediate, Du willst eine
Konstante in ein Register laden.  Wenn Du aber auf eine
Speichervariable zugreifen willst, mußt Du LDS oder STS (load from
SRAM oder store to SRAM) nehmen.  Mir ist nichtmal klar, was Du
willst...  Wahrscheinlich STS Flag, temp.

(Disclaimer: ich fühle mich als alles andere als ein Assembler-
Experte für AVR.  Ich muß da jedesmal im instruction manual nachlesen.
Ich erfreue mich des Compilers, der diese Details für mich ,,im
Kopf''
behält.)

2) Die Zeile fügt ein Debug-Symbol ein das besagt, daß die Datei
"trigon.S" beginnend am globalen Symbol "trigon" jetzt zu benutzen
ist
als Quelldatei.  Die leere Anweisung davor besagt, daß es keine
Aussagee zum Verzeichnis gibt, in dem diese Datei steht (d. h. sie
befindet sich im aktuellen Verzeichnis).

Autor: bluemole (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok,tja manchmal denkt man einfach zu kompliziert.

Das heißt aber auch, dass alle Variablen anscheinend in den SRAM
verlegt werden. Bei kleinen Programmen, die geschwindigkeitsoptimert
sein sollen, besteht der Nachteil, dass die schnellen Register r0 bis
r31 wahrscheinlich nicht vollständig ausgenutzt werden. Bin ich da
richtig in der Annahme???
Es sind doppelt so viele Cyclen für lds  sts nötig als für ldi 
mov...

Kann ich dann z.B dem Register ein Namen zuweisen (z.B. Flag1) und das
als globales Flag benutzen ( auch in in Assembler- Funktionen) und wenn
ja wie??

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RTFDoc.  In der (avr-libc) FAQ steht sowas.

Wenn Du so kleine Programme hast, daß Du weniger als 32 Bytes an
Variablen brauchst, solltest Du aber wohl wirklich in Assembler
programmieren...

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.