Запись DMA в выделенную память пропускает первые два адреса при первой записи

Я играю с ZYNQ7 (Dual-Core ARM) с FPGA. Конструкция FPGA имеет 32-битный счетчик, обращающийся к DDR через контроллер DMA порциями по 256 пакетов.

В C-коде для процессора 1 я запускаю приложение LWIP для подключения через Ethernet к моему компьютеру. Там я выделяю оперативную память для транзакций DMA. Адрес указателя передается через разделяемую память на второе ядро.

#define RCVADDR 0x1ef00002
u32_t * send=NULL;
u32_t* addr = (uint32_t*)RCVADDR;

//Allocating the memory once initially
if (send==NULL){
        send=malloc(256*sizeof(uint32_t));
    }

    *addr = (uint32_t)send;
    //starting the DMA on Core 2
    *getdma=1;

Используя рукопожатие, я инициализирую транзакции DMA во втором ядре и отправляю данные после завершения транзакций на ПК, используя TCP-соединение на 1-м ядре.

#define GetDMA  0x1ef00001
#define DONEDMA 0x1ef00003

uint8_t* getdma = (uint8_t*)GetDMA;
uint32_t* addr=(uint32_t*)RCVADDR;

    while(1){
        if (*getdma == 1){
            StartDMATransfer(*addr, 2048);  // The Number 2048 is the number Of Transfered Packets. It has to be at least the amount of Packets my Counter transfers in chunks. The design has a packet end indicator on its own. So 256 or bigger works the same as 256
            *getdma =0;

            Xil_DCacheFlush();

        }
    }

Перед установкой TCP-соединения я очищаю DCache

void send_data(){
    int ip_addr[4];
        u8_t i=0;

        char * token = strtok(ip,".");
        ip_addr[0] = atoi(token);

        while(token != NULL){

            ip_addr[++i]=atoi(strtok(NULL,"."));
        }
        Xil_DCacheFlushRange(send, 256*sizeof(uint32_t));

        //sleep(0.5);
        connect(ip_addr,atoi(port));
}

Проблема: Первый цикл передачи после программирования устройства показывает:

[1280, 1281, 2, 3, 4, 5, 6, ..... ....., 248, 249, 1530, 1531, 1532, 1533, 1534, 1535]

Первые 2 значения и последние 6 значений взяты из предыдущего цикла до перепрограммирования устройства. Однако это происходит только в первой транзакции DMA. Впоследствии, пока устройство работает, это никогда не повторяется.

Есть идеи?

🤔 А знаете ли вы, что...
C является компилируемым языком, что означает, что программа на C должна быть скомпилирована перед выполнением.


313
1

Ответ:

Решено

Я нашел решение....

Мне пришлось очистить кэш после выделения памяти, прежде чем передать адрес второму ядру для обработки.