К процессору подключена асинхронная SRAM 512 Кбайт, интерфейс - 8ми битный.
Когда я делаю test_sram_8bit - всё отлично. Когда попытка обратиться к 16-ти битам - сразу повисает и код разумеется тем более не работает.
В чем может быть хотя бы отдаленно проблема? Пробовал и с кэшами и без кэш-памяти - результат один: память вроде и работает, а по сути нет.
Память 10 нс (100 МГц), процессор тоже на этой частоте, шина AXI - тоже. Смотрю даташит - вроде контроллер целиком на логике, а значит реально частота еще меньше, ибо делится там у себя на циклы. Не должно быть такой проблемы.
Попробовал добавить xil_printf между записью и чтением - стало работать. Значит надо тайминги корректировать, ибо исполнение кода нужно...
Код
#include <stdio.h>
#include "xparameters.h"
void test_sram_8bit(int off)
{
int max = 0;
unsigned char *p = (unsigned char*) XPAR_AXI_EMC_0_S_AXI_MEM0_BASEADDR;
for(int i = 0; i < 10E9; i++)
{
// xil_printf("8bit = %d\n\r", i);
unsigned int v = (i + off) % 0xFF;
p[i] = v;
if(v != p[i])
{
max = i;
break;
}
}
xil_printf("SRAM %d Kbytes (%d bytes)\n\r", max / 1024, max);
}
void test_sram_16bit(int off)
{
int max = 0;
unsigned short *p = (unsigned short*) XPAR_AXI_EMC_0_S_AXI_MEM0_BASEADDR;
for(int i = 0; i < 10E9; i++)
{
xil_printf("16bit= %d\n\r", i);
unsigned short v = (i + off) % 0xFFFF;
p[i] = v;
if(v != p[i])
{
max = i;
break;
}
}
xil_printf("SRAM %d Kbytes (%d bytes)\n\r", max / 512, max * 2);
}
int main()
{
int test = 0;
while(true)
{
xil_printf("test %d\n\r", test++);
test_sram_8bit(test);
test_sram_16bit(test);
}
return 0;
}
#include "xparameters.h"
void test_sram_8bit(int off)
{
int max = 0;
unsigned char *p = (unsigned char*) XPAR_AXI_EMC_0_S_AXI_MEM0_BASEADDR;
for(int i = 0; i < 10E9; i++)
{
// xil_printf("8bit = %d\n\r", i);
unsigned int v = (i + off) % 0xFF;
p[i] = v;
if(v != p[i])
{
max = i;
break;
}
}
xil_printf("SRAM %d Kbytes (%d bytes)\n\r", max / 1024, max);
}
void test_sram_16bit(int off)
{
int max = 0;
unsigned short *p = (unsigned short*) XPAR_AXI_EMC_0_S_AXI_MEM0_BASEADDR;
for(int i = 0; i < 10E9; i++)
{
xil_printf("16bit= %d\n\r", i);
unsigned short v = (i + off) % 0xFFFF;
p[i] = v;
if(v != p[i])
{
max = i;
break;
}
}
xil_printf("SRAM %d Kbytes (%d bytes)\n\r", max / 512, max * 2);
}
int main()
{
int test = 0;
while(true)
{
xil_printf("test %d\n\r", test++);
test_sram_8bit(test);
test_sram_16bit(test);
}
return 0;
}
Результат работы (вываливается в последовательный порт, вот что вижу):
Код
test 0
SRAM 512 Kbytes (524288 bytes)
16bit= 0
SRAM 512 Kbytes (524288 bytes)
16bit= 0
Тут видно что первый тест с 8-ми битным доступом проходит отлично, а 16-битным виснет намертво при первой же попытке. Соответственно я не могу исполнять свой код из SRAM - виснет на первой же инструкции.
З.Ы.
При подключении DDR2 как внешней памяти - всё было отлично, а ведь это сложнее...