ich stehe kurz vor der Rente und suche interessante Hobbies für diese kommende "Herausforderung"
Hierbei bin ich vor einigen Monaten beim Arduino UNO R3 (DIP-Version aus dem StarterKit) hängen geblieben. Utopische Pläne wie z.B. die Fernwartung eines Kühlschrankes via WLAN, MySQL & Co. plane ich sicherlich nicht sondern betreibe lediglich ein wenig "Grundlagenforschung". Hierbei ist mir die faszinierende Welt des Inline-Assemblers in die Finger geraten...
Nun ja, ich habe mittlerweile schon einige Dinge damit erfolgreich gelöst. Vor allem ist es toll zu sehen, wieviel Speicher man damit sparen kann, wenn man solch knappe Winzlinge wie etwa den ATTiny 25-20 PU etc. bestücken möchte.
Nur bei 32-Bit Zahlen und internen Optionen wie "timer0_millis" hapert es dann doch sehr - und es kostet extem viel Zeit darüber etwas zu erforschen. Auf Dauer könnte dadurch der "Spaß" daran vielleicht auf der Strecke bleiben.
Daher meine Frage(n) an diese Gemeinschaft:
Gibt es irgendwo eine verständliche und möglichst deutsche Dokumentation dazu?
Ist da jemand, der mich vielleicht in die richtige Richtung schubsen könnte?
Danke fürs geduldige Lesen und beste Grüße aus dem Ruhrgebiet
Rudi
Assembler Programmieren ist ein mühsames Geschäft, aber gegen Masochismus, als Hobby betrieben, habe ich keine Einwände.
Neben den offiziellen Datenblättern von atmel, die du auf jeden Fall brauchst, ist das Raustüfteln wie es geht ein wesentlicher Bestandteil dieses Hobbies.
Ein Blink Tutorial für Dummies auf Deutsch ist eigentlich eher Arduino Level. Ich würde das nicht für Assembler-Programmieren erwarten/suchen.
32 Bit Routinen in 8 Bit Assembler ist üble Arbeit. Angenehm wird das nie. Grundlegend anders als 16 Bit es auch nicht. Aber der Code nimmt halt zu.
Wenn du alles in Assembler programmieren möchtest, dann solltest du aber eher Atmel Studio verwenden und auf die Arduino Software komplett verzichten. "Inline assembler" bedeutet eher relativ kurze Assembler Routinen innerhalb von C Code.
Ich bin etwas verwirrt, denn wer Mikrocontroller in Assembler programmieren möchte, der sollte eigentlich zuerst die Grundlagen - wie den Umgang mit 16 und 32 Bit Zahlen - lernen, bevor er sich in die Tiefen der Hardware des Controllers stürzt. Ich habe zwar schon etliche Mikroprozessor-Systeme aufgebaut und programmiert, aber bei den Mikrocontrollern bevorzuge ich die Programmierung in einer Hochsprache oder zumindest mit Bibliotheken für die wesentlichen Funktionen der Hardware.
Was die Dokumentation betrifft, ich kenne keine deutsche Übersetzung der Datenblätter, und auch keine allgemeine Beschreibung, was man mit den Hardware-Registern systematisch anfangen kann. Da hängt so vieles zusammen, daß man schnell den Überblick verliert, wenn unterschiedliche Funktionen Bits aus den gleichen Registern benutzen. Die Bibliotheken zur Arduino IDE oder einer anderen Entwicklungsumgebung sollten zunächst genügend Material für eigene Studien liefern. Dazu ein Compiler, oder ein Assembler-Listing eigener Testprogramme liefern kann, oder ein Disassembler für den insgesamt daraus erzeugten Code. Und dann probieren, probieren, probieren,..
RudiDL5:
Ist da jemand, der mich vielleicht in die richtige Richtung schubsen könnte?
Als ich anfing, mich mit dem ATmega168 zu befassen (ich wollte alles machen können, was man mit Arduino kann, nur ohne das Arduino-Drumherum), wollte auch ich wieder mit Assembler anfangen. Da ich aber irgendwann darauf kam, dass die in C/C++ programmierten Sachen nahezu genauso schnell sind, wie direkt in Assembler programmierte Dinge, habe ich mich dafür entschieden, Assembler bleiben zu lassen und fit in C zu werden.
Ich glaube nicht, dass der mögliche Geschwindigkeitsgewinn die Mühe aufwiegt, die man investieren muss, wenn man die Assemblerprogrammierung lernen möchte.
Es gibt schon ein paar Anwendung wo man es braucht. Das sind aber meistens nur kurze Abschnitte. Ausnahmen sind Dinge wie FastLED die sehr viel Assembler haben. Da wird es dann richtig interessant, da das bis auf den letzten Takt optimiert ist. Ist aber selten.
Ihm ging es aber glaube ich eher um Speicherplatz statt Geschwindigkeit. Da reicht es schon auf AVR-C umzusteigen. Die Arduino Software hat einen sehr großen Overhead. Man muss sich nur anschauen wie viel Platz ein leerer Sketch verbraucht.
warum Inline Assembler? Warum nicht gleich direkt Assembler? Ist doch wenn dann viel einfacher. Ich hatte mal vor längerer Zeit das Problem nur ein paar Zeilen C in Inline Assembler haben zu wollen. Das Nachbarforum hatte mir geholfen. Der Inline Code war unübersichtlicher und länger wie reines Assembler und auch nicht so schnell wie reines Assembler. Und ich glaube 1 bis 2 Variablen mehr waren auch nötig zur Übergabe an den restlichen C Code. Register mußten ja gesichert werden worum man sich unter C keine Gedanken machen muß.
Wenn Du kleine µC verwendest, dann können die Programme auch nicht allzu groß werden. Demzufolge würde ich mir an Deiner Stelle die Frage stellen, warum nicht gleich Assembler statt C. Mußt dich natürlich um alles selbst kümmern.
Eine klarer Nachteil von Assembler ist die wesentlich eingeschränkte Portabilität des Codes
Du meinst, weil z.B. PORTB aus avr/io.h (das große #ifdef-Grab) etwas unterschiedliches sein könnte, je nach Controller ?
Na ja, schon wenn du die Arduino IDE verlässt, und avr-gcc direkt verwendest, erzeugst du deutlich schlechter portablen Code.
Aber Portabilität ist sicher zweitrangig:
Ob digitalWrite(13, HIGH); auf jedem attiny läuft, und wo muss man dann die LED anschliessen?
recht herzlichen Dank für eure Beiträge. In der Tat, der Inline-Assembler ist eine extrem mühseelige Angelegenheit - besonders wenn die Rotinen größer werden und man sogar mit Unterprogammen etc. arbeiten möchte. Sicherlich habe ich damit schon einige Erfolge erzielen können. Aber der Aufwand steht tatsächlich in keinem Verhältnis zum Ertrag. Hier stoße ich schnell an Grenzen - zumal deutsche Dokumentationem wohl irgendwie Mangelware sind.
Wie auch immer, ich werde damit noch eine Weile "herumspielen" und mir einige Gedanken machen, wie und womit ich die Assembler-Geschichte mit den AVR-Controllern weiter betreibe. Ich will nichts "utopisches" oder "gigantisch Großes" damit produzieren - aber "rund" soll es ja doch irgendwie ablaufen ... Schaun mer ma, kommt Zeit, kommt Lösung
Vielen Dank noch einmal und beste Grüße
Bis demnächst mal
Rudi
Ich habe in der letzten Woche bis heute zum Glück einige Zeit gehabt, mich um diese Inline-Sachen zu kümmern. Nun denn, nach einigen recht (hust) "interessanten" Forschungs-Frustrationen ... ist es mir dennoch gelungen, Zahlen im 32 Bit Format zu verarbeiten. Egal ob Addition, Subtraktion, Vergleich - geht nicht gibts nicht. Wie auch immer, mit einem "guten Buch" wäre man(n) schneller weitergekommen, aber nun gehts auch mit dem "timer0_millis" und Konsorten auf (Inline-) Assembler-Ebene
Mal schauen womit ich demnächst auftauche.
Vielen Dank, das Tutorial werde ich mir auf jeden Fall ansehen. Ich habe eigentlich schon alles herausgefunden was ich "zur Zeit" gesucht hatte. Aber nix ist hilfreicher als weitere gute Infos
Bis denne
Rudi