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