форсировать 32-битный доступ с помощью python mmap? - PullRequest
3 голосов
/ 07 марта 2019

Я использую 64-битный Python на 64-битном процессоре.Один из них на шине AXI этого процессора подключен к FPGA (что позволяет шине и тактовой области переключаться на шину шириной 32 бита).Это устройство не любит 64-битный доступ ...

Я пытаюсь получить доступ к этой FPGA через python mmap следующим образом (в классе):

def __init__(self, base, len):
    self.base = base
    self.fd = open("/dev/mem", "r+")
    self.lw = mmap.mmap(self.fd.fileno(),
                        len,
                        mmap.MAP_SHARED,
                        mmap.PROT_READ | mmap.PROT_WRITE,
                        offset=base)

def get_U32(self, offset):
    s = self.lw[offset:offset+4]
    return struct.unpack("<I", s)[0]

Идея состояла в том, чтобычто get_U32() будет читать 32-битное слово из шины (отсюда смещение + 4 чтения).К сожалению, кажется, что mmap в любом случае выполняет 64-битный доступ к шине (я полагаю, что-то вроде кэширования для оптимизации производительности), а затем выполняет 32-битное «приведение».Базовая ПЛИС недовольна ...

В программе на Си я просто пишу:

data = *((uint32_t *) address);

... и процессор, похоже, аккуратно выполняет 32-битный доступ к своему AXIшина, которую предпочитает базовое оборудование .... (так что сейчас у меня есть (медленный) обходной путь, где python требует, чтобы программа C взаимодействовала с оборудованием через каналы)

Есть ли способ форсировать64-битный Python для выполнения 32-битного доступа, так как предыдущая строка C явно преуспевает с?

Вопрос написан о чтении 32-битных здесь, но, конечно, также необходимо писать 32-битные ...

1 Ответ

0 голосов
/ 08 марта 2019

Основываясь на идее @martineau, двойной зонд можно исправить с помощью Python ctypes, например:

s = ctypes.c_uint32.from_buffer(self.lw, offset).value #read

или

types.c_uint32.from_buffer(self.lw, offset).value = s #write

Это действительно вынуждает Python выполнять тот же 32-битный доступ, что и в C, и удалять двойной тест чтения или записи на 32-битной шине.

Однако, к сожалению, python, кажется, читает перед каждой записью. Таким образом, вышеприведенное решение идеально подходит для чтения, но при записи я по-прежнему получаю доступ на чтение до доступа на запись. В C, конечно, я могу получить только один доступ для записи при записи.

Я публикую это для тех, кому это может быть интересно. Если у вас есть решение этой последней проблемы (прочитайте перед тем, как написать), пожалуйста, опубликуйте ее.

...