Forum: Compiler & IDEs Assembler auslagern/C Variable nur in Register


von Chris O. (lupin_iii)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich habe ein kleines Programm in C geschrieben, das 10 LEDs per
Software-PWM dimmt. Und zwar so, dass diese unabhängig voneinander
langsam heller werden, dann kurzzeitig voll aufleuchten und schließlich
ausgehen, so eine Art Blubber-Effekt.

Die Interrupt-Routine, die das SW-PWM timergesteuert macht, ist durch
den Assembler schon 4 mal so schnell geworden, als die C Version. Aber
ich habe erst gestern angefangen Assembler zu programmieren (und C ist
auch nicht meine "Erstsprache"), deswegen hänge ich jetzt fest.

Erstens ist der Inline-Assembler mit seinen "%3", "%a0" usw. extrem
unübersichtlich. Zweitens ist immer noch ein riesen Overhead nach dem
Compilieren da, den ich gerne wegoptimieren würde (sieht man in den
erzeugten lst-Dateien). Drittens sieht es so aus als könnte ich alle
Variablen, die ich verwende gleichzeitig in Registern unterbringen,
wodurch der Compiler dann keine lds und sts mehr ausführen müsste.

Daran bin ich aber trotz der vielen Tutorials gescheitert. Das sind zu
viele Schritte auf einmal, die man richtig machen müsste. Kann mir da
jemand helfen?

MfG,
Christoph

PS: ich kompiliere zwar mit avr-gcc, aber ohne Makefile. Das macht
VMLAB für mich. Ist das ein Problem, wenn man C und Assembler mischen
will?

von Klaus H (Gast)


Lesenswert?

In C gibt es das "register"-Schlüsselwort, welches dem Compiler den
Tipp gibt, die Variable in einem Register abzulegen. Allerdings
ignorieren viele Compiler dieses Wort, da die heutigen Optimierungen
dann besser arbeiten.

Wenn der Inline-Asm zu unübersichtlich ist, dann gleich alles in
Assembler schreiben. Dann fällt auch der Overhead weg.

von Chris O. (lupin_iii)


Lesenswert?

Alles in Assembler zu schreiben traue ich mir (noch) nicht zu. Außerdem
programmiere ich dann an den Stellen, die ich in C schreiben könnte,
weil mir die Geschwindigkeit egal ist (z. B. Initialisierung,
EEPROM-Zugriffe), viel länger.

Das register-Schlüsselwort habe ich schon gekannt (und auch, dass sich
die Compiler nicht daran halten müssen). GCC berücksichtigt es sogar,
zumindest in dem kurzen Programm oben. Aber da man sich nicht darauf
verlassen kann, kann man den Assembler auch nicht so schreiben, dass er
einfach darauf zugreift.

Also gut, anderer Ansatz: GCC erzeugt ja diese lst-Dateien, die so wie
es aussieht Assembler enthalten und sogar die c-Variablennamen noch
verwendet werden. Allerdings ist da noch recht viel anderes Zeugs drin
(Zeilennummern, OP-Codes, ...), sodass es eine ziemliche Arbeit ist,
den Assembler daraus zu verwenden. Kann man irgendwie den reinen
Assembler erzeugen, den ich nachher einfach in meine Assemblerdatei
kopieren und wo es nötig ist optimieren kann? (mit dem Nachteil, dass
ich das bei jeder Änderung in C wieder machen muss)

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.