6

有没有人想出一个很好的解决方案来处理 Python 下的内存映射设备寄存器?理想情况下,可以让我使用命名寄存器,甚至这些寄存器中的命名位域,以一种不完全临时的方式?理想情况下是跨平台的,但我只能使用 Linux。

似乎 mmap 和 ctypes 结构的某种组合可能能够处理它,但是 a)结构似乎不允许您指定位域位置(它们在 C 中也没有,所以......),并且 b)我可以'不知道如何将 Struct 映射放在 mmap 上。

还是我从根本上问我如何使用圆锯作为螺丝刀?(即它不这样做,你到底为什么要这样做?)

C 中的一个示例(未经测试,不用于使用)将类似于:

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;
4

1 回答 1

0

我认为最简单的方法是用 C 编写访问器函数并从 Python 调用它们(在 ctypes 和 Cython 之间,从 Python 调用 C 代码并不难)。

于 2012-05-15T22:17:53.470 回答