Я играю с 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 должна быть скомпилирована перед выполнением.