2012-05-14 26 views
5

Hat jemand eine gute Lösung für die Arbeit mit Memory-Mapped-Geräte-Register unter Python? Idealerweise etwas, das es mir erlauben würde, mit benannten Registern und sogar benannten Bitfeldern in diesen Registern auf eine Art und Weise zu arbeiten, die nicht ganz ad hoc ist? Idealerweise plattformübergreifend, aber ich kann nur mit Linux leben.Memory-mapped Register in Python

Es scheint, als ob eine Kombination von mmap und ctypes Structs in der Lage wäre, damit umzugehen, aber a) Structs scheinen es nicht zu ermöglichen, Bitfeldpositionen anzugeben (auch nicht in C, also ...), und b) Ich kann nicht herausfinden, wie ich ein Struct-Mapping auf eine mmap setzen würde.

Oder frage ich mich grundlegend, wie ich eine circ säge als Schraubenzieher benutzen kann? (Dh es ist nicht, dass und warum auf der Erde würden Sie wollen?)

Ein Beispiel in C (ungetestet, NICHT für die Anwendung) wäre so etwas wie:

volatile struct { 
    uint32_t mfr_id; 
    uint32_t prod_id; 
    uint32_t ctl; 
    uint32_t dummy[5]; 
    ... 
} * pDev; 
hFile = open('/dev/bridge', O_RDWR) 
pDev = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, hFile, 0); 
assert(pDev->mfr_id == 0x12345678); 
assert(pDev->prod_id == 0xDEADBEEF); 

uint32_t temp = pDev->ctl; 
temp &= CTL_ACCESS_MASK | CTL_SHIFT_MASK; 
temp |= CTL_ACCESS_RO | CTL_SHIFT_5; 
pDev->ctl = temp; 
+1

Ich kenne die Antwort nicht, aber wenn es keine Bibliothek dafür gibt, wäre die Erstellung eines guten Projekts! – japreiss

+0

Warum müssen Sie das tun? Bitte geben Sie Details zu dem Problem an, das Sie lösen möchten. (Ich habe das Gefühl, dass Sie versuchen, mit einem seriellen oder parallelen Anschluss zu sprechen; dafür gibt es Bibliotheken.) –

+1

Das Modul [Bitstring] (http://code.google.com/p/python-bitstring/) ist gut bei der Bitfeldmanipulation .... aber hilft dir nicht beim ersten Zugriff auf die Daten. – larsks

Antwort

0

Ich denke, der einfachste Weg, Zu gehen heißt, Accessorfunktionen in C zu schreiben und sie von Python aus aufzurufen (zwischen ctypes und Cython ist das Aufrufen von C-Code aus Python nicht so schwer).