2012-05-14 28 views
5

Có ai đưa ra giải pháp tốt để làm việc với thanh ghi thiết bị ánh xạ bộ nhớ trong Python không? Lý tưởng nhất, một cái gì đó mà sẽ cho phép tôi làm việc với các thanh ghi có tên, và thậm chí đặt tên bitfields trong các thanh ghi đó, theo một cách không hoàn toàn là đặc biệt? Lý tưởng là đa nền tảng, nhưng tôi chỉ có thể sống với Linux.Đăng ký bản đồ bộ nhớ trong Python

Có vẻ như một số kết hợp giữa mmap và ctypes Structs có thể xử lý nó, nhưng a) Cấu trúc dường như không cho phép bạn chỉ định vị trí bitfield (cũng không phải trong C, do đó ...) và b) Tôi không thể hiểu làm thế nào tôi sẽ thả một bản đồ Struct trên đầu trang của một mmap.

Hay tôi về cơ bản hỏi làm cách nào tôi có thể sử dụng cưa xiếc làm tua vít? (Ví dụ: Nó không làm điều đó và tại sao trên trái đất bạn sẽ muốn?)

Một ví dụ trong C (chưa được kiểm tra, KHÔNG sử dụng) sẽ là một cái gì đó như:

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

Tôi không biết câu trả lời, nhưng nếu chưa có thư viện, việc tạo một thư viện sẽ là một dự án tốt! – japreiss

+0

Tại sao bạn cần thực hiện việc này? Vui lòng cung cấp chi tiết về vấn đề thực tế bạn đang cố giải quyết. (Tôi có cảm giác bạn có thể đang cố gắng nói chuyện với một cổng nối tiếp hoặc song song; có thư viện cho điều đó.) –

+1

Mô-đun [bitstring] (http://code.google.com/p/python-bitstring/) là giỏi thao tác bitfield .... nhưng không giúp bạn với dữ liệu ngay từ đầu. – larsks

Trả lời

0

Tôi nghĩ rằng cách dễ nhất để đi là viết chức năng accessor trong C và gọi chúng từ Python (giữa ctypes và Cython, gọi mã C từ Python không phải là khó).

Các vấn đề liên quan