Hallo,
Ich versuche in einen embedded Linux auf einen ARROW SoCkit auf eine
feste Adresse (0x00010080) zu schreiben. Um eine virtuelle Adresse mit
der gewünschten Adresse zu erstellen nutze ich mmap. Leider habe ich im
bereich speicher zugriff unter Linux nicht viel erfahrungen...
Schreibe im mit folgenden Code auf die Adresse?
1
#include"hwlib.h"
2
#include"socal/socal.h"
3
#include"socal/hps.h"
4
#include"socal/alt_gpio.h"
5
#include"system.h"
6
7
8
intmain(){
9
void*virtual_base;
10
void*adresse=0x00010080;
11
unsignedintfd;
12
unsignedintin=0xFFFF9FFF;
13
unsignedintout;
14
if((fd=open("/dev/mem",(O_RDWR|O_SYNC)))==-1){
15
printf("ERROR: could not open \"/dev/mem\"...\n");
Theoretisch dürfte ich auf der Adresse nur schreiben können aber
alt_red_word gibt mein auf die Adresse glegeten Wert zurück. Auf der
Adresse sitzt eine Bridge zum FPGA, die in der Aktuellen konfiguration
nur schreiben kann. Auf dem FPGA kommt leider nichts an :(
Ok jetzt habe ich mmap ein bisschen mehr verstanden.
ich habe die zeile mit mmap() auf
virtual_base = mmap( NULL , 32, ( PROT_READ | PROT_WRITE ), MAP_SHARED,
fd , 0x00010080 );
geändert. Jetzt gibt mit mmap den Fehler zurück :(
Der speicherbereich müsste durch den ersten Übergabewert, der jetzt NULL
ist, den Speicherberich reservieren.
Wenn mmap -1 zurückgibt, steht der Fehler in errno. Welchen Fehler
bekommst du da? (Gleiche das am besten mit der Liste der möglichen
Fehler aus der Manpage ab, z.B. http://linux.die.net/man/2/mmap ).
1. Der Speicher wird immer ein Vielfaches einer Kachelgröße gemappt.
D.h. du wirst nicht irgendeine physikalische an irgendeine beliebige
Adresse mappen können, sondern nur seitenweise.
Also erst überlegen, in welcher Seite die gesuchte Adresse ist, dann
mappen.
2. Du musst entsprechend vorher für die gemappte Seite Speicher
allokieren.
3. Siehe man mmap
./. schrieb:> Damit ein mmap Erfolg hat, muss etwas zum 'mmap'en da sein.> Z.B. durch ein malloc.Klaus Wachtler schrieb:> 2. Du musst entsprechend vorher für die gemappte Seite Speicher> allokieren.
Unsinn. Im Gegenteil verwenden einige Betriebssysteme mmap um Speicher
für malloc zu alloziieren.
So (Florian H.) habe ich es in den beschreibungen für malloc auch
verstanden. Gibt man als ersten Übergabewert eine NULL an, wird ein
freier Speicherbereich der angegeben Größe alloziiert.
Im Anhang befindet sich der Adressaufbau des Mikrocontrollers und ich
kann mit meinen Programm mit den Lightweight FPGA Slaves kommunizieren
(3 LEDs an der FPGA Peripherie einschalten).
> Unsinn. Im Gegenteil verwenden einige Betriebssysteme mmap um Speicher> für malloc zu alloziieren.
mmap hat ja auch deutlich mehr als nur 1 Parameter.
Mein Schnipsel weiter oben funktionierte jedenfalls von Anfang an...
Du darfst das aber gerne weiter als Unsinn qualifizieren...
./. schrieb:> Mein Schnipsel weiter oben funktionierte jedenfalls von Anfang an...> Du darfst das aber gerne weiter als Unsinn qualifizieren...
... was noch lange nicht bedeutet, dass es notwendig ist.
Der mmap()-Aufruf überdeckt den von malloc() bereitgestellten Speicher.
Kannst du machen, ist aber unnötig.
HW-IO via mmap ist bequem, geht aber nicht immer. x86 ist kein Problem,
aber bei ARM muss das nicht immer gehen. Hab deshalb schon mal extra
einen Treiber für ein paar Bits GPIO schreiben müssen...