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
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?
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
> 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.
0x20000000 und 64MB passen aber nicht zusammen, aber egal 32 Bit Zeiger reicht aus.
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.