www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C vs. Assembler


Autor: mr.chip (Gast)
Datum:

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

Autor: vorbeigeschlendert (Gast)
Datum:

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

Autor: Stefan Kleinwort (_sk_)
Datum:

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

Autor: mr.chip (Gast)
Datum:

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

Autor: Stefan Kleinwort (_sk_)
Datum:

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

Autor: Εrnst B✶ (ernst)
Datum:

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

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.