Forum: Mikrocontroller und Digitale Elektronik pointer größe bei 64MB Adressspeicher


von Bernd S. (mms)


Lesenswert?

hallo,

hab grad einen kleinen denkfehler... muss ein zeiger, der auf eine 
variable im speicher zeigen soll (insgesamt ist der speicher 64MB groß) 
aufgrund der großen Adressen vom typ unsigned long sein (und unsigned 
int reicht nicht dafür aus)?

Lieg ich in dieser Annahme richtig?

Bernd

von yalu (Gast)


Lesenswert?

Er muss vom Typ (irgendwas *) sein und mindestens 26 Bits umfassen.
Wenn unsigned long 32 Bits breit ist (ein typischer Wert), kann man
den Pointer ohne Informationsverlust dorthin casten. Falls ein
unsigned int nur 16 Bits umfasst (bei vielen 8- und
16-Bit-Architekturen der Fall), kann die Adresse nicht in diesem Typ
gespeichert werden.

Manchmal wird aber auch mit Tricks gearbeitet: Trotz 64MB Speicher
geht man davon aus, dass alle statischen Variablen nicht mehr als 64KB
belegen (Stichwort Speichermodelle). Dann kann man auch mit
16-Bit-Pointern auskommen.

Auf welcher Architektur und mit welchem Compiler arbeitest du denn?

von Bernd S. (mms)


Lesenswert?

ich arbeite mit dem Keil Compiler und dem AT91Rm9200 Controller.

der speicherbereich (extern) geht bei 0x20000000 los...

>Manchmal wird aber auch mit Tricks gearbeitet: Trotz 64MB Speicher
>geht man davon aus, dass alle statischen Variablen nicht mehr als 64KB
>belegen (Stichwort Speichermodelle).

und wie kann ich der variablen mitteilen, dass sie einen speicherplatz 
im unterern speicherbereich einnehmen soll oder muss?

Bernd

von yalu (Gast)


Lesenswert?

> ich arbeite mit dem Keil Compiler und dem AT91Rm9200 Controller.

AT91 haben einen ARM-32-Bit-Core. Da sind Pointer und [unsigned] int
beide 32 Bits breit, [unsigned] long wahrscheinlich ebenfalls (kenne
aber den Keil-Compiler nicht, aber bei praktisch allen Compilern für
32-Bit-Architekturen ist das so). Du kannst also, falls das aus
irgend einem Grund erforderlich sein sollte, einen Pointer auch in
einer int-Variablen speichern.

>> Manchmal wird aber auch mit Tricks gearbeitet: Trotz 64MB Speicher
>> geht man davon aus, dass alle statischen Variablen nicht mehr als
>> 64KB belegen (Stichwort Speichermodelle).
>
> und wie kann ich der variablen mitteilen, dass sie einen
> speicherplatz im unterern speicherbereich einnehmen soll oder muss?

Das mit den Tricks bezog sich auf Prozessoren mit segmentiertem
Adressraum (80[2]86, C16x usw.). Bei diesen setzen sich Adressen aus
einem Segment- und einem Offsetteil zusammen, die in getrennten
16-Bit-Registern abgelegt werden. Benötigt ein Programm insgesamt nur
64KB Daten, kann ein Segmentregister mit einem festen Wert (der
Startadresse des 64K-Blocks) initialisiert werden. Adressen innerhalb
des 64K-Blocks werden dann nur noch durch einen 16-Bit-Offset-Wert
repräsentiert, so dass auch Zeiger nur 16 Bit groß sind.

Der ARM verfügt aber über einen linearen Adressraum von 2^32 Bytes, so
dass hier keine Segmentierung Anwendung findet und Zeiger immer 32 Bit
groß sind. Dafür können auch große RAMs (theoretisch bis zu 4GB) ohne
Einschränkungen genutzt werden.

von Obelix (Gast)


Lesenswert?

0x20000000 und 64MB passen aber nicht zusammen, aber egal 32 Bit Zeiger 
reicht aus.

von Dominic R. (dominic)


Lesenswert?

Obelix wrote:
> 0x20000000 und 64MB passen aber nicht zusammen, aber egal 32 Bit Zeiger
> reicht aus.

Ist mir zwar ein Rätsel, wie du auf die Idee kommst, dass 64MB RAM in 
nem 32-bit Adressraum nicht bei 0x20000000 beginnen könnten, aber ich 
muss ja auch nicht alles verstehen ;)

Sein RAM geht dann wohl von 0x20000000 bis 0x23ffffff.

Der ARM920T mit seiner MMU und seinen Caches kann aber natürlich noch 
viel mehr.
Aber auch wenn eigentlich kein Memory Mapping gewünscht ist empfiehlt es 
sich, die MMU mit einem 1:1 Mapping für das SDRAM zu betreiben, denn nur 
bei aktivierter MMU kann das Data-Cache verwendet werden. 
Instruction-Cache lässt sich jederzeit verwenden, da wird dann bei 
deaktivierter MMU ein 1:1 Mapping angenommen, und alle Fetches gecached.

Gruß,

Dominic

von Obelix (Gast)


Lesenswert?

> Ist mir zwar ein Rätsel, wie du auf die Idee kommst, dass 64MB RAM in
> nem 32-bit Adressraum nicht bei 0x20000000 beginnen könnten, aber ich
> muss ja auch nicht alles verstehen ;)

> Sein RAM geht dann wohl von 0x20000000 bis 0x23ffffff.

Ich habe auch nicht bestritten das dies nicht geht. Nur ist die 
Fragestellung des ersten Posts dann unsinnig formuliert, was man auch an 
der Antwort von yalu sehen kann. Er redet auch von 26 Bit, was für 64MB 
ok ist, aber für "0x2000000 + 64MB" nicht mehr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.