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
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).
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??
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.