Hallo,
ich arbeite gerade an einem kleinem Projekt für eine Bus-Schnittstelle.
Dabei will ich, um die Code Laufzeit zu erhöhen Inline Assembly
verwenden. Leider habe ich das bisher noch nie verwendet und habe
desshalb so meine Startschwierigkeiten.
Mir sind beim betrachten des ASM Codes einige Stellen aufgefallen, die
sich optimieren lassen, jedoch weis ich nicht genau, wie ich das im C
Code einfügen kann.
Bsp 1:
unverändert
ceqsn a, #0x1f (Compare ACC with immediate data and skip next instruction if both are equal.)
8
goto 00104$
Wie in Bsp 1 sollten sich einige sachen vereinfach lassen, jedoch ist
mir rätselhalft wie ich das fließend in den C Code einbinde, ohne den
completten ASM abschnitt zu kopieren und und anzupassen. Ich würde gerne
immer nur bestimmte abschnitte optimieren, damit vom C so viel wie
möglich erhalten bleibt, da das Programm noch nicht fertig ist und es
noch anpassungen geben wird. Ich hoffe, dass ihr mir weiterhelfen könnt.
Gesamter Code:
C Code
Tobias K. schrieb:> ich arbeite gerade an einem kleinem Projekt für eine Bus-Schnittstelle.> Dabei will ich, um die Code Laufzeit zu erhöhen Inline Assembly> verwenden.
Wirklich? Es soll langsamer laufen? Das geht auch einfach in C ;-)
Statt der 'switch'es hätte ich normale 'if's genommen. Damit arbeiten
die Compiler meist besser, wenn es nur 2 oder 3 Fälle gibt.
Vielleicht kann man bei deinem Compiler auch eine Optimierung
einschalten?? Selbst mein gcc liefert meist besseren Code.
Falk B. schrieb:> Tobias K. schrieb:>> ich arbeite gerade an einem kleinem Projekt für eine Bus-Schnittstelle.>> Dabei will ich, um die Code Laufzeit zu erhöhen Inline Assembly>> verwenden.>> Wirklich? Es soll langsamer laufen? Das geht auch einfach in C ;-)
Oh, natürlich meine ich schneller laufen.
Meiner Erfahrung nach ist ein switch für gewöhnlich schneller als eine
if Bedingung
Tobias K. schrieb:> Oh, natürlich meine ich schneller laufen.
Dann pack die gesamte Funktion in eine separate ASM-Datei. Das ist
deutlich einfacher und übersichtlicher als mit Inline-ASM.
> Meiner Erfahrung nach ist ein switch für gewöhnlich schneller als eine> if Bedingung
Ist auch so, so doof sind die Compiler schon lange nicht mehr, als daß
sie das nicht flott umsetzen können.
Falk B. schrieb:> Dann pack die gesamte Funktion in eine separate ASM-Datei. Das ist> deutlich einfacher und übersichtlicher als mit Inline-ASM.
Das Problem dabei ist, dass ich die restlichen Abschnitte in normalem C
verfassen möchte, also C Abschnitte die nur aufgerufen werden, wenn die
ASM Abschnitte ein gewisses Ergebnis liefern. Das Programm ist nämlich
noch lange nicht fertig und Anpassungen in C sind für mich sehr viel
leichter als welche in Assebler.
Tobias K. schrieb:> Das Programm ist nämlich> noch lange nicht fertig und Anpassungen in C sind für mich sehr viel> leichter als welche in Assebler.
Das ist der im allgemeinen verkehrte Ansatz. Das macht man in dieser
Reihenfolge:
1) Richtiges Design. Hier gehören u.a. sinnvolle Wahl von Algorithmen
und Datenstrukturen rein.
2) Bring es zum Laufen und halte es dabei vor allem übersichtlich.
3) Code profiling. Finde die Flaschenhälse - und zwar die wirklichen und
nicht die, die Du Dir vorstellst.
4) Optimiere die Flaschenhälse gezielt.
Du bist irgendwo zwischen 1) und 2), und da ist Assembler jedenfalls für
Optimierungszwecke noch gar nicht angebracht.
Tobias K. schrieb:> Das Problem dabei ist, dass ich die restlichen Abschnitte in normalem C> verfassen möchte, also C Abschnitte die nur aufgerufen werden, wenn die> ASM Abschnitte ein gewisses Ergebnis liefern. Das Programm ist nämlich> noch lange nicht fertig und Anpassungen in C sind für mich sehr viel> leichter als welche in Assebler.
Sicher, aber das löst das Problem nicht. So wie ich es sehe, willst du,
warum auch immer, einen CAN-Controller in Software nachbilden. Dafür
braucht man ziemlich genaues, hier wohl taktgenaues Timing. Das macht
man sinnvollerweise in ASM. Als bau dir eine Funktion in ASM, welche das
erledigt. Die zeitunkritischen Sachen macht man dann in C.
Hier mal als Beispiel für die WS2812. Die Datenausgabe erfolgt in ASM,
der Aufruf und die Datenvorbereitung in C. So ähnlich kannst bzw.
solltest du das auch angehen.
Beitrag "Re: Frage zu IR-Remote+LED-Strips an AVR"