mikrocontroller.net

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


Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Bernd Schuster (mms)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Obelix (Gast)
Datum:

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

Autor: Dominic R. (dominic)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Obelix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.