Python и устройства UIO: почему mmap.read () работает и os.read () не работает? - PullRequest
1 голос
/ 29 января 2020

Версия ядра: 4.19
Python версия: 3.5.6
Платформа: Xilinx Ultrascale + Zynq

Я разрабатываю код python, который может читать и записывать на устройство UIO , Я нашел способ, который работает, и путь, который терпит неудачу без видимой причины, которую я могу понять. Я волнуюсь, это означает, что есть что-то во всем этом подходе, что я пропустил и вернусь, чтобы укусить меня в будущем.

Для моего начального тестирования я читаю и пишу в один регистр в 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'

Кто-нибудь может объяснить, почему два других подхода потерпели неудачу? С того места, где я сижу, они выглядят эквивалентно.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 января 2020

По замыслу UIO использует:

  • mmap() для чтения и записи адресного пространства устройства
  • read() для уведомления о прерываниях

То есть поведение, которое вы наблюдаете, правильное.

См. UIO HOWTO в документации по ядру.

...