Python和UIO设备:为什么mmap.read()工作而os.read()失败?

2024-10-03 13:19:29 发布

您现在位置:Python中文网/ 问答频道 /正文

内核版本:4.19
Python版本:3.5.6
平台:Xilinx Ultrascale+Zynq

我正在开发一些可以读写UIO设备的python代码。我找到了一种可行的方法,一种我无法理解的毫无明显原因的失败方法。我担心这意味着我错过了整个方法中的某些东西,将来还会回来咬我

对于我的初始测试,我正在读写PL中的一个寄存器,其中5个LSB处于活动状态。 以下是工作代码:

>>> import mmap
>>> fid= open('/dev/uio0', 'r+b', 0) # read/write, binary, non-buffered
>>> regs= mmap.mmap(fid.fileno(), 4)
>>> regs.read(4)
b'\x1c\x00\x00\x00'
>>> regs.seek(0)
>>> regs.write(b'\xF3\x00\x00')
>>> regs.seek(0)
>>> regs.read(4)
b'\x13\x00\x00\x00'

下面是两个失败代码的示例:

仅使用标准读取函数失败

>>> fid= open('/dev/uio0', 'r+b', 0) # read/write, binary, non-buffered
>>> fid.read(4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 5] Input/output error

使用操作系统也会失败,但我可以向mmap提供文件描述符,一切正常

>>> fid= os.open('/dev/uio0', os.O_SYNC | os.O_RDWR)
>>> os.read(fid, 4)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 5] Input/output error
>>> import mmap
>>> regs= mmap.mmap(fid, 4)
>>> regs.read(4)
b'\x13\x00\x00\x00'
>>> regs.seek(0)
>>> regs.write(b'\x65\x00\x00\x00')
>>> regs.seek(0)
>>> regs.read(4)
b'\x05\x00\x00\x00'

有人能解释为什么其他两种方法都失败了吗?从我坐的地方看,它们看起来是一样的

提前谢谢


Tags: 方法代码devimport版本readosseek