|
|
|
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
|