Navigation

Mitglieder Online

· Gäste Online: 1

· Mitglieder Online: 0

· Anzahl Mitglieder: 107
· Neuestes Mitglied: Klimparfed

Neueste Artikel

Login

Benutzername

Passwort



Noch kein Mitglied?
Hier klicken um Dich zu registrieren.

Passwort vergessen?
Um ein neues Passwort anzufordern klicke hier.

Latest Downloads

Forum Themen

Neueste Themen
· Multi-Master IIC Int...
· HCS08 im DIP Gehäuse
· Rotary Encoder
· Serial Software Buffer
· Embedded World 3-5.3...
Heisseste Themen
Keine Themen erstellt

Der HC08 Stack

Wie alle Mikrocontroller verfügt auch der HC08 über einen Stack. Der Stack ist ein LiFo ( Last in First out ) Speicher.
Das bedeutet, der Wert der zuletzt auf den Stack gelegt wurde muß als erstes wieder heruntergenommen werden.
Zur Intialisierung des Stacks wird der Stackpointer gesetzt. Der Stackpointer wird nach dem Reset mit der Adresse 0x00FF geladen. Des geschieht um die Kompatibilität zur HC05 CPU zu wahren. Beim HC08 macht es jedoch Sinn ihn an das obere Ende des RAMs zu setzen, damit man die Zeropage für andere Dinge nutzen kann. Das macht man in Assembler Folgenderweise :

RAMEnd       EQU  $023f         ; bis hier hin

      ldhx #RAMEnd+1               ; Stackpointer ans obere Ramende
txs ; HX Register n den Stackpointer kopieren
Der Stack wächst dann wen man Daten auf ihm ablegt nach unten

Daten werden durch Push Befehle auf dem Stack abgelegt und der Stackpointer wird um eins heruntergezählt.
die Push Befehle sind :

PSHA Den Akkumulator auf dem Stack ablegen.
PSHX Das X-Register auf dem Stack ablegen.
PSHH Das H-Register auf dem Stack ablegen.

Passend zu den Push Befehlen gibt es dann de Pull Befehle um die Daten wieder herunterzunehmen.

PULA Den Akkumulator mit dem obersten Wert des Stacks laden.
PULX Das X-Register mit dem obersten Wert des Stacks laden.
PULH Das H-Register mit dem obersten Wert des Stacks laden.


Der Stack kann also prima als Temporärer Speicher benutzt werden um Werte zwischenzuspeichern.

Die CPU verwendet den Stack auch bei Unterprogrammaufrufen. Der Befehl JSR ( Jump to Subroutine ) legt die Rücksprungadresse auf dem Stack ab bevor das Unterprogramm angesprunen wird. Der Befehl RTS lädt dann für den Rücksprung die oberen beiden Werte des Stacks in den Programmzähler.

Wenn ein Interrupt auftritt wird ebenso die Rücksprungadresse auf dem Stack abgelegt. Zusätzlich werden auch noch das Statusregister, der Akkumulator und das X-Register auf den Stack gelegt. Der Befehl RTI sorgt dann dafür das die Werte vom Stack wieder in die Register geladen werden.

Dadurch, das es Befehle gibt, de den Stackpointer als Indexregister verwenden, kann ein Compiler auch effizient lokale Variablen auf den Stack legen, sie werden dann über den Stackpointer und einen Offset angesprochen.

Der Metrwerks C-Compiler behandelt den Stack etwas anders als man es in Assembler machen würde.
Normalerweise ist in der Datei Project.prm eine Stackgröße angegeben. Der Stack beginnt dann in diesem Abstand von den lokalen Variablen.

Das Linker Paramter File sieht dann zum Beispiel so aus :

/* This is a linker parameter file for the mc68hc908gp32 */

NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */

SEGMENTS /* Here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */
Z_RAM = READ_WRITE 0x0040 TO 0x00FF;
RAM = READ_WRITE 0x0100 TO 0x023F;
ROM = READ_ONLY 0x8000 TO 0xFDFF;
/* INTVECTS = READ_ONLY 0xFFDC TO 0xFFFF; Reserved for Interrupt Vectors */
END

PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */
DEFAULT_RAM /* non-zero page variables */
INTO RAM;

_PRESTART, /* startup code */
STARTUP, /* startup data structures */
ROM_VAR, /* constant variables */
STRINGS, /* string literals */
VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */
DEFAULT_ROM,
COPY /* copy down information: how to initialize variables */
INTO ROM;

_DATA_ZEROPAGE, /* zero page variables */
MY_ZEROPAGE INTO Z_RAM;
END


STACKSIZE 0x100

//VECTOR 0 _Startup /* Reset vector: this is the default entry point for an application. */


Alternative kann man aber auch die Startadresse angeben wenn man statt des STACKSIZE ein STACKTOP und die Adresse angibt.
Seitenaufbau: 0.04 Sekunden
714,199 eindeutige Besuche