mikrocontroller.net

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


Autor: Chris O. (lupin_iii)
Datum:
Angehängte Dateien:

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

Autor: Klaus H (Gast)
Datum:

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

Autor: Chris O. (lupin_iii)
Datum:

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

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.