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