Forum: Mikrocontroller und Digitale Elektronik C vs. Assembler


von mr.chip (Gast)


Lesenswert?

Hallo

Mein Roboterprojekt schreitet allmählich voran, die Software wird daher
immer komplexer. Bisher habe ich alles (Initialisierung,
Servo-Ansteuerung, Sensorauswertung, einfacher Ausweich-Algorithmus) in
Assembler programmiert, das hat eigentlich ganz anständig geklappt. Nun
bin ich am Entwickeln einer etwas höheren Steuerung (z.B.: Der Roboter
soll eine gewisse Zeit lang im Raum herumfahren und dann automatisch
zum Ausgangspunkt zurückkehren.). Dies ist ja an sich schon nicht die
einfachste Sache, wird aber noch ungleich komplizierter, wenn das ganze
in Assembler programmiert werden soll.

Nun überlege ich mir, ob ich anstatt Assembler C einsetzen soll.

Ein paar Fragen dazu:
Denkt ihr, hier ist die Anwendung von C angebracht? Oder soll ich mich
besser durchbeissen und in Assembler programmieren (zumal ich dort
sicherlich noch nicht ausgereift bin...) ?
Wie gut ist es möglich, den bestehenden Assemblercode
weiterzuverwenden?
Wie sieht es mit dem Debugging, z.B. im AVR Studio aus?

Gruss

Michael

von vorbeigeschlendert (Gast)


Lesenswert?

wenn du schon selber sagst, dass du bei Assembler noch einigen
Nachholbedarf hast würde ich schon empfehlen auf C umzusteigen...
sobald dein Projekt eine gewisse Komplexität erreicht ist es mit C
deutlich einfacher zu warten und zu erweitern, da viele Geschichten,
die dich unter Assembler einfach Zeit und Tipparbeit kosten vom
Compiler abgenommen werden. Und solange du keine extrem zeitkritischen
Funktionen brauchst reicht die Geschwindigkeit allemal - etwas
Vorarbeit im Kopf vorausgesetzt....  natürlich nur meine Meinung

von Stefan K. (_sk_)


Lesenswert?

Ich programmiere den ATmega mit gcc und dem AVR-Studio. Das Debuggen
funktioniert prima (mit dem mkII, sollte aber exakt so auch mit den
Billig-Debug-Modulen gehen). Hochsprachen-Debugging funktioniert prima,
Breakpoints im C-Code, Variablen ansehen, auch komplexe Sachen wie
structs oder den Inhalt von Speicher, auf den Pointer zeigen.

Früher habe ich sehr viel in Assembler gemacht. Die Performance ist
zwar auf den ersten Blick besser, sinkt aber mit zunehmender Kompexität
des Projekts. Und gerade der ATmega ist für C eine ziemlich gute
Architektur - Ausnahme: derleidige Zugriff auf Konstanten im Flash.

Ich würde an Deiner Stelle auf jeden Fall einen Versuch mit C machen.
Beim bestehenden Ass-Code gibt es 2 Probleme:
1. im ASS-Code benutzte Register
Von denen weiss der C-Compiler erstmal nichts. Nachschauen, welche
Register Du in einer Funktion ändern darfst - alles andere mit psuh
sichern.
2. Übergabe-Parameter
Möglich, aber nicht ganz trivial. Unschön, aber schnell umzusetzen:
Parameterübergabe über globale Variablen.

Wenn der Ass-Code vorliegt, ist es oft auch sehr einfach, einen C-Code
daraus zu generieren.

Viel Spass, Stefan

von mr.chip (Gast)


Lesenswert?

> wenn du schon selber sagst, dass du bei Assembler noch einigen
Nachholbedarf hast würde ich schon empfehlen auf C umzusteigen...

Auf der anderen Seite: Ich baue meinen Roboter ja gerade, weil ich mit
der ganze uC-Materie etwas vertraut werden möchte. Nun weiss ich aber
nicht, ob es besser ist, Priorität auf Assembler oder C zu legen.

> Wie gut ist es möglich, den bestehenden Assemblercode
weiterzuverwenden?

Sehe ich es richtig, dass es kaum möglich ist, Assemblerprogramme, die
mehr als nur für eine spezifische Funktion zuständig sind, zu
integrieren (in meinem Fall wäre es ja eine komplette Robotersteuerung,
und nur die darauf aufbauende höhere Steuerung wäre in C). Könnte man
alternativ auch C-Code in Assemblerprogramme einbauen?

> Wenn der Ass-Code vorliegt, ist es oft auch sehr einfach, einen
C-Code
daraus zu generieren.

Du meinst hier einfach ein umschreiben, oder gibt es dafür auch
Programme?

von Stefan K. (_sk_)


Lesenswert?

>Auf der anderen Seite: Ich baue meinen Roboter ja gerade, weil ich >mit
der ganze uC-Materie etwas vertraut werden möchte. Nun weiss ich
>aber nicht, ob es besser ist, Priorität auf Assembler oder C zu
>legen.
Ich programmiere in C, schaue mir aber immer mal wieder den generierten
Assembler-Code an. Das hilft einerseits, beim effizienten Programmieren,
andererseits verliert man so nicht jedes Gefühl für die "Maschine".

>Sehe ich es richtig, dass es kaum möglich ist, Assemblerprogramme,
>die mehr als nur für eine spezifische Funktion zuständig sind, zu
>integrieren
Theoretisch ist das möglich. Frage ist immer, mit wieviel Aufwand.
Wenn Du einen fertigen Codeblock hast, dann nimm den doch in Assembler
und setze nur die Schnittstellen dazu um. Mit globalen Variablen - ist
zwar nicht so schön und auch nicht optimal, aber einfach (für den
Anfang). Wenn Du etwas mehr in gcc eingestiegen bist, dann kannst Du
hier immer noch optimieren.

>Du meinst hier einfach ein umschreiben, oder gibt es dafür auch
>Programme?
Einfach umschreiben. C ist so nah an Assembler, dass das nicht allzu
schwer ist (meine Meinung).

Viele Grüße, Stefan

von Εrnst B. (ernst)


Lesenswert?

Zitat dazu:
"The C Programming Language -- A language which combines the
flexibility of assembly language with the power of assembly
language."

Normalerweise ist der von GCC generierte ASM code (mit -Os) sehr nah an
dem, was man auch per Hand in Assembler gecoded hätte.
Wenn nicht, kann man dem Compiler oft auf die Sprünge helfen, z.B.
durch kleine Umformulierungen, attribute(pure/const) etc.

Und wenns wirklich nötig ist, gibts ja noch inline assembler.

Ausser bei den ganz kleinen uCs (z.B. ohne RAM) gibts also kaum noch
einen Grund direkt mit ASM zu programmieren. Gibt natürlich
genausowenig einen Grund das nicht zu tun.

/Ernst

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.