Schreiben in memory map?



  • Hallo,

    ich versuche ein vorhandenes Programm (geschrieben in C) unter C++ zu kompilieren. Doch leider meldet der Kompiler immer

    error: pointer of type `void *' used in arithmetic

    für die letzte Zeile des u.a. Source-Codes

    void * map_base; 
    map_base = mmap(0, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd_mem, PIOB_BASE  & ~MAP_MASK);
    if(map_base == (void *) -1){
        	printf("Couldn't get Map-Address.\n");
    	exit(1);
    }
    printf("Memory mapped at address %p.\n", map_base);
    fflush(stdout);
    
    // Configure the registers
    
    *((unsigned long *) (map_base + (PIOB_PER & MAP_MASK))) = PIO_B27; //enable io
    

    Wie beschreibe ich unter C++ die Speicherzelle in der Mmap korrekt?
    Auch nach langem Suchen habe ich leider zu diesem Thema nichts finden können.
    Kennt jemand die Lösung

    Danke und Grüsse
    Ulli



  • ulli G schrieb:

    *((unsigned long *) (map_base + (PIOB_PER & MAP_MASK))) = PIO_B27; //enable io
    

    versuch mal so:

    *((unsigned long *)map_base + (PIOB_PER & MAP_MASK)) = PIO_B27; //enable io
    


  • net schrieb:

    versuch mal so:

    *((unsigned long *)map_base + (PIOB_PER & MAP_MASK)) = PIO_B27; //enable io
    

    Hurra,

    das hat zumindest beim kompilieren geholfen,
    doch leider gibt's jetzt einen Laufzeitfehler "segmentation fault" bei der Ausführung der Zeile.

    Unter C läuft das Programm auf der gleichen Hardware durch.

    Noch eine Idee?

    Gruss
    Ulli



  • Caste den map_base pointer zu einem unsigned char* dann führe die Arithmetik durch und dann caste ihn erst zu unsigned long*



  • Also so:

    *((unsigned long *) ((unsigned char*)map_base + (PIOB_PER & MAP_MASK))) = PIO_B27; //enable io
    


  • lolz schrieb:

    Also so:

    *((unsigned long *) ((unsigned char*)map_base + (PIOB_PER & MAP_MASK))) = PIO_B27; //enable io
    

    ... jetzt funktionierts!

    Suuuuuuuper!!!

    Gruss
    Ulli



  • Das war mir klar 🕶


Anmelden zum Antworten