Перейти к содержанию
    

ZYNQMP. Зависание процессора при работе с DataMover

Добрый день!

Подскажите, уже голову сломал не могу найти где косяк:
Есть плата US+, на PL-части по AXI-Stream передаются пакеты от 16 Б до 96 Б в DataMover (DM настроен на бёрст 16Б, при шине 128 бит) далее, через интерконнект шина идёт на S_AXI_HPC0_FPD и затем на PS-DDR.

На baremetal PS-части по прерыванию пытаюсь писать данные из DDR в буфер:

        for (uint32_t valid_addr = last_addr; valid_addr < next_addr; valid_addr += 8) {

            payload[it] = Xil_In64(PS_DDR_BASEADDR + valid_addr);

            it++;

        }

Пытался перед записью в буфер инвалидировать кэш, разными способами:

Xil_DCacheInvalidateRange((UINTPTR)cacheline_addr, cacheline_len);

Результат один - после N-го количества запросов виснет цинк в Xil_SyncAbortHandler()

Но, при этом данные идут корректные, пока не зависнет.

Комментировал код выше и оно всё равно зависает т.е. похоже дело в какой-то рассинхронизации.

Что делал ещё:

Активировал в DataMover кэши (AxCACHE, AxUSER) и пробросил их в цинк:

    /* Setting up caches for DataMover

    * AxCACHE[3:0] Attribute

    * -------------------------------------------------------------------------------------------

    * | WA | RA | C | B | Description                                              | Comments

    * |----|----|---|---|------------------------------------------------------------------------

    * | 0  | 0  | 0 | 0 | Non-cacheable, non-bufferable                            | 0x0 ,

    * | 0  | 0  | 0 | 1 | Bufferable only                                          | 0x1 ,

    * | 0  | 0  | 1 | 0 | Cacheable but do not allocate                            | 0x2 ,

    * | 0  | 0  | 1 | 1 | Cacheable and bufferable, do not allocate                | 0x3 ,

    * | 0  | 1  | 1 | 0 | Cacheable write-through, allocate on read                | 0x6 ,

    * | 0  | 1  | 1 | 1 | Cacheable write-back, allocate on read                   | 0x7 ,

    * | 1  | 0  | 1 | 0 | Cacheable write-through, allocate on write               | 0xA ,

    * | 1  | 0  | 1 | 1 | Cacheable write-back, allocate on write                  | 0xB ,

    * | 1  | 1  | 1 | 0 | Cacheable write-through, allocate on both read and write | 0xE ,

    * | 1  | 1  | 1 | 1 | Cacheable write-back, allocate on both read and write    | 0xF ,

    *

    * AxUSER[1:0] Attribute

    * 0x0 Non Shareable

    * 0x1 Inner Shareable

    * 0x2 Outer Shareable

    */

Пробовал разные комбинации совместно с тем, что прописано в xil_cache.h. При некоторых комбинациях проц. не зависает, но и данные не пишутся в память.

Читал и делал как в AR69446 - Zynq UltraScale+ MPSoC Example Design - Use AXI HPC port to perform coherent transfers

Подскажите, как-нибудь можно заставить работать подобную схему?

Как правильно настроить кэширование или работать без него, если в нем проблема?

Проверял на чипскопе шину S_AXI_HPC0_FPD SLVERR при записи нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...