This is an old revision of the document!


Architektur

Der AVR hat einen internen 8-Bit Daten-Bus, durch den die Daten zwischen der arithmetisch-logischen Einheit (ALU), Status Register (SREG), Befehlszähler (PC), Random-Access-Memory (SRAM), und Peripherals. Das Programm, eine Reihe an Befehlen, die in der ALU ausgeführt werden, kommen von einer Adresse im Flash-Speicher, spezifiziert vom Befehlszähler. Der ALU hat 32 8-bit Mehrzweckregister, welche als Operanden genutzt werden ,wenn Befehle ausgeführt werden.

Block diagram of ATmega128

Instruction pipeline

Der AVR hat eine zwei-Etappen Befehls Pipeline. Während ein Befehl ausgeführt wird, wird der nächste aus dem Programmspeicher geholt. Darum wird beim Ausführen einer “Jump-Instruction” zwei Takte benötigt, um die Bedingungen des Jumps zu erfüllen. Weil die neuen Befehle immer von der nächsten Speicheradresse geholt werden, ist es notwendig die vorherigen Befehle zu löschen und neue zu laden, wenn man zu einer neuen Adresse springt, da der Ort an dem der Befehl geholt wurde nun nicht mehr stimmt.

Mehrzweckregister

Mehrzweckregister R0-R31 sind wie Buffer, um mit Speicher- und Peripheriedaten zu arbeiten und sie zu speichern. Sie vereinfachen die Architektur des Prozessors, weil sie schnellen Zugang der ALU erlauben und der Datenbus nicht immer benutzt werden muss um Operanden aus dem Speicher zu lesen. Mehrzweckregister werden für alle datenbezogenen arithmetischen und logischen Abläufe benutzt.

Wenn man in Assembler programmiert, ist es möglich die benötigten Daten im Mehrzweckregister zu speichern. Wenn man in C Programmiert und man muss eine Variable im Mehrzweckregister speichern, wird die Variable zusätzlich als “Register” definiert. Zum Beispiel:

register char x;

Befehlssatz

Der Befehlssatz der meisten AVRs besteht aus 90-133 verschiedenen Befehlen. Der ATmega128 hat 133 Befehle. Befehle haben entweder ein, zwei, oder keine Operanden. Die meisten Befehle benötigen nur einen Takt zur Ausführung, aber komplexere Befehle können bis zu fünf Taktzyklen benötigen. Für den XMega, den Nachfolger des AVR, wurden viele Befehle modifiziert, damit sie weniger Taktzyklen nutzen. Die meisten Befehle im AVR werden benutzt für Jumps, um Daten bewegen und vergleichen und um Arithmetische Berechnungen auszuführen. Ein Status-Register wird genutzt um Berechnungen und Vergleiche auszuführen. Es speichert den Output-Status der ALU - ob das Ergebnis negativ, positiv, null, den maximal erlaubten Wert (8 Bits) überschreitet, oder einen Bit in die nächste Operation transferieren muss, usw. (Es gibt noch ein paar kompliziertere Fälle)

Example

Die ist ein Teil eines Codes, welcher in Assembler geschrieben wurde, und beinhaltet pure Befehle, welche eine 5 zum Byte in der RAM-Adresse $100 (dezimal 256) hinzufügt. Diese Befehle gibt es alle im AVR

ldi  r1, 5       ; Load the constant 5 to general purpose register r1
lds  r2, $100    ; Load the byte from the memory to register r2
add  r2, r1      ; Add the value of r1 to r2
sts  $100, r2    ; Write the value of r2 back to the memory

Programm stack

Ein Stack ist eine Datenstruktur, wo der letzte Wert welcher in den Speicher geschrieben wurde, als erstes ausgelesen wird. Die Stacks im AVR können genutzt werden, wenn man mit Subroutinen, Interrupts und temporären Daten arbeitet. Bevor eine Subroutine oder ein Interrupt ausgeführt wird, die Adresse im Befehlszähler, wo das Programm unterbrochen wurde, wird im Stack gespeichert. Wenn die Subroutine oder der Interrupt ausgeführt wurde, wird die Adresse wieder vom Stack ausgelesen, und das Programm fährt von der Adresse vor der Unterbrechung wieder fort. Das speichern temporärer Daten im Stack wird normalerweise benutzt, wenn man mit kleinen Stücken von Code arbeitet, welche keinen reservierten Speicher während ihrer Ausführung benötigen. Einfache Assembler Programme werden normalerweise so geschrieben, dass es nicht notwendig ist, den Stack zu nutzen, aber wenn das Programm viele Variablen und Funktionen enthählt, macht der Compiler automatisch Gebrauch vom Stack.

Der Stack der MegaAVR-Serie Microcontroller ist physikalisch im Random-Access-Memory zu finden. Einige tinyAVR-Serie Modelle haben kein Random-Access-Memory und der Stack durch eine kleine separate begrenzte Speichereinheit realisiert. Normalerweise gibt es keinen Compiler für Modelle ohne Random-Access-Memory.

Um in einer hochleveligen Sprache zu programmieren (Pascal, C, C++), ist es nicht notwendig, sich mit der inneren Arbeitsweise eine Microcontrollers zu beschäftigen, da der Compiler fähig ist, Mehrzweckregister und Befehle selbst zu wählen. Wenn man jedoch weiß, was in einem Microcontroller passiert, kann das nur zum eigenen Vorteil sein. Es ist notwendig die Befehle des Microcontrollers genau zu kennen, wenn man zeitkritische Applikationen entwickelt, wobei die Operationen in einer begrenzten Anzahl an Taktzyklen beendet sein müssen.

de/avr/architecture.1287136002.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0