gpt4 book ai didi

Python 和 UIO 设备 : Why does mmap. read() 工作而 os.read() 失败?

转载 作者:太空宇宙 更新时间:2023-11-03 19:48:57 25 4
gpt4 key购买 nike

内核版本: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

使用 os 也失败,但我可以向 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'

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

提前致谢。

最佳答案

根据设计,UIO 使用:

  • mmap() 读写设备地址空间
  • read() 收到中断通知

所以您观察到的行为是正确的。

请参阅UIO HOWTO在内核文档中。

关于Python 和 UIO 设备 : Why does mmap. read() 工作而 os.read() 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59959260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com