2017-09-18 7 views
2

Bonjour à tous ceux que je suis en train de convertir en code python (Accès au framboise pi 1Mhz timer), je suis bloqué quand mob nous devons + TIMER_OFFSET (timer = (long long int *)((char *)st_base + TIMER_OFFSET);) quand j'essaye de le faire en Python j'ai obtenu SystemError: mmaps don't support concatenation. Je cherchais un objet convertir mmap mais je ne trouve rien, Pouvons-nous nous battre contre ça? Il est possible de convertir tout ce code en python? Je veux dire maintenant j'ai des doutes à ce sujet?Convertir l'objet mmap (mmaps ne supporte pas la concaténation)/convertir le code c en python

#include <stdio.h> 
#include <sys/mman.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <unistd.h> 

#define ST_BASE (0x3F003000) 
#define TIMER_OFFSET (4) 

int main(int argc, char *argv[]) { 
    long long int t, prev, *timer; // 64 bit timer 
    int fd; 
    void *st_base; // byte ptr to simplify offset math 

    // get access to system core memory 
    if (-1 == (fd = open("/dev/mem", O_RDONLY))) { 
     fprintf(stderr, "open() failed.\n"); 
     return 255; 
    } 

    // map a specific page into process's address space 
    if (MAP_FAILED == (st_base = mmap(NULL, 4096, 
         PROT_READ, MAP_SHARED, fd, ST_BASE))) { 
     fprintf(stderr, "mmap() failed.\n"); 
     return 254; 
    } 

    // set up pointer, based on mapped page 
    timer = (long long int *)((char *)st_base + TIMER_OFFSET); //<- here is problem 

    // read initial timer 
    prev = *timer; 
    // and wait 
    sleep(1); 

    while (1==1) { // forever 
     // read new timer 
     t = *timer; 
     printf("Timer diff = %lld \r", prev); 
     fflush(stdout); 
     // save current timer 
     prev = t; 
     // and wait 
     sleep(1); 
    } 
    // will never get here 
    return 0; 
} 

code Python (pour l'instant je sauter cette ifs):

ST_BASE = 0x3F003000 
TIMER_OFFSET = 4 
import struct 
sizeof_long_long = struct.calcsize('q') 

def timer(): 
    while True: 
     fd = os.open("/dev/mem",os.O_RDWR | os.O_SYNC) 
     stBase = mmap.mmap(fileno=fd,length=4096,offset=ST_BASE) 
     timer_bytes = stBase[TIMER_OFFSET:TIMER_OFFSET + sizeof_long_long] 
     #print(timer_bytes) 
     timer_value, = struct.unpack('q', timer_bytes) 
     print(timer_value) 
     os.close(fd) 
+0

@AnttiHaapala Ok j'ajouter un code de python, mais il n'y a pas beaucoup – BengBeng

+0

Merci. Cela est passé de complètement hors-sujet à plutôt OK. Aussi quelle version de Python c'était? –

+0

@AnttiHaapala 3.4.2 – BengBeng

Répondre

2

Presque bon :) Juste unpack_from au lieu de déballer

import os, mmap, sys 
import struct 

ST_BASE = 0x3F003000 
TIMER_OFFSET = 4 
sizeof_long_long = struct.calcsize("Q") 
LENGTH = TIMER_OFFSET + sizeof_long_long 

def timer(): 
    fd = os.open("/dev/mem", os.O_RDONLY | os.O_SYNC) 
    stBase = mmap.mmap(fileno=fd, length=4096, access=mmap.ACCESS_COPY, offset=ST_BASE) 
    os.close(fd) 

    while True: 
     timer_value = struct.unpack_from("Q", stBase, TIMER_OFFSET)[0] 
     print("timer_value") 
1

L'objet mmap en Python est assez différent de pointeurs en C. L'objet mmap se comporte plutôt comme un bytearray, avec quelques méthodes supplémentaires. Cependant, l'interface bytearray est la plus utile ici. Le code C ajoute un décalage à l'adresse de base pour obtenir un pointeur sur le premier octet de la valeur du temporisateur, puis le convertit en pointeur sur long long int. En Python, nous pouvons faire une chose similaire par tranchant une partie de l'bytearray, en particulier sizeof (long long int) octets à partir de l'offset, et en utilisant le module struct pour décoder la valeur.

Ainsi nous obtenons quelque chose comme

import struct 
sizeof_long_long = struct.calcsize('q') 

... 


    timer_bytes = stBase[TIMER_OFFSET:TIMER_OFFSET + sizeof_long_long] 
    print(timer_bytes) 

    # struct.unpack would return a tuple of one element, note the comma. 
    timer_value, = struct.unpack('q', timer_bytes) 
    print(timer_value) 
+0

quelque chose bouge mais tout le temps quand je cours ce code il me donne la même valeur et cela devrait changer tout le temps – BengBeng

+0

@BengBeng est-il même près de la valeur correcte? –

+0

@BengBeng le décalage dans votre code Python est différent de l'offset dans le code C ?! –