Homepage

 

 

 

 

Mikrocontroller   PCs — Embedded Electronics

Ideen — Projekte — Fachwissen 

 

 

 

 

Atmel AVR Assemblerprogrammierung

 

 

 

 

 

 

 

 Home

 ReAl Computer Architecture

 Aus Labor und Forschung

 Projekte

 Fachtexte

 Lehrarchiv

 Privatarchiv

 Die historische Webseite

 Seitenübersicht

 Impressum + Datenschutz

 Kontakt

 

 

 

Die Vorteile dieser Bauelemente liegen auf der Hand:

  • Sie sind kostengünstig.
  • Ihre Wirkprinzipen sind vergleichsweise einfach. Das betrifft sowohl die Befehlsliste als auch die eingebaute Peripherie. Nach wenigen Stunden der Einarbeitung kann man schon die ersten Erfolgserlebnsisse haben.
  • Die meisten Befehle brauchen nur einen Taktzyklus. Keine Taktuntersetzung, kein exzessives Pipelining.
  • Es erfordert nur wenig Aufwand, die Schaltkreise einzusetzen (Betriebsspannung anschließen, Programmer anschließen und fertig...). Viele Typen gibt es (noch?) in traditionellen, leicht handhabbaren Gehäusen.

Haben sie auch Nachteile? - Weshalb sollte es nicht sein? Jedes technische Gebilde ist ein Kompromiß...

Sie machen sich erst dann bemerkbar, wenn man wirklich auf der Maschinenebene programmieren möchte - und zwar etwas mehr als nur ein paar harmlose Übungsbeispiele.

Eine Hitliste - aus der Erfahrung gewonnen:

1. Die Flagbits sind nur über den E-A-Adreßraum zugänglich. Retten und Wiedereinstellen der Flags umständlich. Das Befehlspaar PUSHF, POPF (um schnell mal eine Bedingung über ein paar Befehle hinweg zu merken) gibt es nicht, ebensowenig ein programmseitig unterstütztes oder gar automatisches Retten und Wiedereinstellen bei Interrupts.

2. Nur die  Hälfte des Registersatzes ist für Direktwertoperationen nutzbar. Damit sind nur 16 Register wirkliche Universalregister, mit denen man (fast) alles anstellen kann.

3. Es sind nur drei Adreßregister (X, Y, Z). Und auch die liegen im selben Bereich der Registeradressen, der auch für Direktwertoperationen zugänglich ist. Man hat also im Grunde nur 10 Registerbytes, in denen Variable mit Direktwerten verknüpft und einzelne  Bits gesetzt werden können. Drei Adreßzeiger sind zuwenig, 6 bis 8 sollten es schon sein (uraltes (70er Jahre) Erfahrungswissen).

4. Der Stackpointer (SP) ist nur über den E-A-Adreßraum zugänglich. Keine Stackmanipulation und keine stack-relative Adressierung mit SP als Basisadresse möglich (jedenfalls nicht auf einfache Weise).

5. Die Bitbeeinflussung im Registersatz läuft nur über Alias-Mnemonics (SBR, CBR)  der Direktwertverknüpfungen  ANDI und ORI. Die Direktwerte sind Bytes, keine Bitnummern - anders als bei den Bitabfragebefehlen (SBRC, SBRS). Das gibt Anlaß zu ärgerlichen Fehlern. SBR r16,0 verändert gar nichts (entspricht ORI r16,0), SBRS r16,0 fragt hingegen Bit 0 ab... Einzelbits kann man in allen 32 Registern abfragen, aber nur in 16 der 32 Register beeinflussen.

6. Die Zugänglichkeit der Register in den peripheren Einrichtung ist bei jedem Schaltkreis anders. Liegt das Register im Bereich der ersten 32 E-A-Adressen, kann man einzelne Bits abfragen und setzen. Nur die ersten 64 E-A-Adressen sind über E-A-Befehle zugänglich. Ist die E-A-Ausstattung noch umfangreicher, muß man Speicherzugriffsbefehle verwenden. (Der Hersteller gibt sich Mühe, Erleichterung zu schaffen; achtgeben muß man aber schon.)

Werden Bitmanipulationen mit mehreren Befehlen emuliert (das Byte in ein Register holen, dort verknüpfen und wieder zurückschaffen), so kann es Probleme geben, wenn während dieses Ablaufs Interrupts wirksam werden können und wenn die jeweilige Ressource (ein Universalregister, ein E-A-Register oder eine Speicherzelle) von beiden Programmen (dem unterbnrochenen und dem Unterbrechungsbehandler) genutzt wird. (Das ist keine Eigenheit von AVR, sondern immer  der Fall, wenn mehrfach genutzte Ressourcen mit jeweils mehreren Befehlen angesprochen werden müssen und wenn diese Abläufe unterbrochen werden können.)

7. Die auf arithmetische Vergleiche (Rechengang A - B) bezogenen Verzweigungsbedingungen ensprechen nicht 100%ig dem üblichen Industriestandard. Bei manchen Programmierabsichten muß man andersherum rechnen (B - A), um eine geeignete Verzweigungsbedingung zu gewinnen (Einzelheiten stehen in der Original-Befehlsbeschreibung).

8. Die Sprungweite der bedingten Verzweigungen (BRANCH-Befehle) ist oftmals zu gering. In manchen Fällen wäre die traditionelle Kombination SKIP und JUMP besser. SKIP gibt es aber nur mit Register- und E-A-Bits, jedoch nicht  mit den Flagbits im Statusregister.

9. Bittransporte laufen über ein besonderes Flagbit (T-Flag), nicht über das Carry-Flag, wie seit Jahrzehnten üblich. Damit ist es nicht möglich, auf einfachste Weise Bits durch Einschieben in Bytes zusammenzufassen (Gather-Operation) und durch Ausschieben zu verteilen (Scatter-Operation).

10. Die wichtige XOR-Verknüpfung (zum selektiven Kippen von Bits) gibt es nicht mit Direktwert.

 

Übungsaufgabe für (fortgeschrittene) Adepten der Rechnerarchitektur: Wie könnte man diese Nachteile beseitigen, ohne die grundsätzliche Auslegung der Maschine zu ändern? (Es soll schon ein kleiner, leicht verständlicher, kostengünstiger Prozessorkern bleiben. Auch sollte die Grundsatzauslegung als Zweiadreß-Universalregistermaschine beibehalten werden.)

 

Fachtexte:

Einführung in die Mikrocontroller-Programmierung am Beispiel Atmel AVR. Gibt eine Einführung in die allgemeine Entwicklungsmethodik typischer Mikrocontroller-Projekte und in die Befehlsliste der AVR-Mikrocontroller. Diese Befehlsbeschreibung ist als Ergänzung zum Original-Handbuch gedacht.

Multitasking/virtuelle Maschinen mit Atmel AVR (simple & stupid). Eine ganz elementare Einführung in diesen Problemkreis. Tasks und virtuelle Maschinen sind (näherungsweise) dann das gleiche, wenn jedeTask alle CPU-Register frei verwenden kann. Den SRAM muß man allerdings zu Fuß aufteilen, da der AVR keine Adreßumsetzung hat. Um mehrere Anwendungen zeitverschachtelt laufen zu lassen, braucht man im Grunde  nur ein paar Befehle ...  Assemblerdatei dazu

 

 

 

 

 

 

 Aktuelles:

 14. 8. 2103

Seite eingerichtet.

Fachtexte

Wie kann man die Nachteile umgehen, ohne gleich einen neuen Prozessor zu bauen?

... Beispielsweise indem man sich entsprechende MAKROS schreibt.

Referenz Elementare Makros (Stand 2.31)

Diese Makros wurden auf pragmatische Weise erstellt, nämlich nach und nach gemäß den Anforderungen aktueller Programmieraufgaben. Sie sind für den Atmel-Assembler vorgesehen. Steigerungsmöglichkeiten bestehen u. a. darin, eine "ideale" virtuelle Maschine zu definieren und den  Assembler selbst zu schreiben...

Der Quelltext (ohne Gewähr)

Einige Skizzen zum Stackmechanismus des AVR