Python中的内存映射寄存器
有没有人能想出一个好的解决方案来在Python下使用内存映射设备寄存器?理想情况下,我可以使用命名寄存器,甚至是这些寄存器中的命名位字段,而不完全是临时的?理想情况下是跨平台的,但我只能使用Linux 看起来mmap和ctypes结构的一些组合可能能够处理它,但是a)结构似乎不允许您指定位字段位置(在C中也不允许,所以…),以及b)我不知道如何在mmap上放置结构映射 或者,我是在问我如何才能将circ锯用作螺丝刀?(也就是说,它不会这么做,你到底为什么要这么做?) C语言中的一个示例(未测试,不供使用)如下所示:Python中的内存映射寄存器,python,device-driver,Python,Device Driver,有没有人能想出一个好的解决方案来在Python下使用内存映射设备寄存器?理想情况下,我可以使用命名寄存器,甚至是这些寄存器中的命名位字段,而不完全是临时的?理想情况下是跨平台的,但我只能使用Linux 看起来mmap和ctypes结构的一些组合可能能够处理它,但是a)结构似乎不允许您指定位字段位置(在C中也不允许,所以…),以及b)我不知道如何在mmap上放置结构映射 或者,我是在问我如何才能将circ锯用作螺丝刀?(也就是说,它不会这么做,你到底为什么要这么做?) 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;
我认为最简单的方法是用C编写访问器函数并从Python调用它们(在ctypes和Cython之间,从Python调用C代码并不难)。我不知道答案,但如果还没有库,创建一个库将是一个不错的项目!你为什么要这么做?请提供您试图解决的实际问题的详细信息。(我感觉你可能在尝试与串行或并行端口通信;这里有相应的库。)该模块擅长于位字段操作……但在一开始就无法帮助你获取数据。@Li aungYip,我希望如此。不,最终目标是通过PCIe VME网桥与VME卡通信。桥接器将有一个真正的内核空间驱动程序,允许VME地址空间的范围映射为PCI内存空间,但为每个VME卡执行内核空间驱动程序是不可行的,而且应该是不必要的。最有可能的是,这可以通过CType来完成,正如你所说,但我们需要更多关于如何开始的信息。你能链接到一个C语言的例子来与内存映射的设备寄存器通信吗?