Jump to content

    
Sign in to follow this  
TABKP

Microblaze не запускается

Recommended Posts

ПЛИС Virtex 4 XC4VLX80. Создал процессор. Память BRAM используется для команд и данных. Объем 64К.

Написал маленькую программу. Отладил. Работает. В программе используются два массива данных. Встала необходимость увеличить их размер до 1,5 кбайт каждый. В результате программа перестала работать - она даже не стартует. Если уменьшить размер массивов в половину - работает. Увеличил объем используемой BRAM до 128К - не изменилось НИЧЕГО. Такое ощущение, что ему не памяти не хватает, а где-то прописано ограничение на длину последовательно размещаемых данных в памяти. Как побороть проблему?

 

Инициализация:

u8 DataBuf1[1500];

u8 DataBuf2[1500];

Share this post


Link to post
Share on other sites
Такое ощущение, что ему не памяти не хватает, а где-то прописано ограничение на длину последовательно размещаемых данных в памяти. Как побороть проблему?

Тут вопрос как вы выделяете память.

Возможно программа не правильно линкуется.

В линкерскрипте можно прописать смещение и размер ваших буферов под данные,

тогда точно не будет конфликтов и гарантированно выделится линейная область памяти.

Share this post


Link to post
Share on other sites

Да я честно говоря не знаю как линкскрипты писать. Все настройки по умолчанию стоят.

 

Попытался использовать динамическое выделение памяти:

 

u8 *DataBuf;

DataBuf = (u8 *)malloc(1500 * sizeof(u8));

if(DataBuf == NULL) XGpio_DiscreteSet(&Gpio0, GPIO_0_CHANNEL1, 0x07);

 

память не выделилась. Указатель нулевой возвращается. Да чтож такое. Нет в жизни счастья!

 

Видимо линкскрипт в этом окне надо править. Вопрос что и где?

post-65130-1335612194_thumb.jpg

Share this post


Link to post
Share on other sites
Да я честно говоря не знаю как линкскрипты писать. Все настройки по умолчанию стоят.

 

Попытался использовать динамическое выделение памяти:

 

u8 *DataBuf;

DataBuf = (u8 *)malloc(1500 * sizeof(u8));

if(DataBuf == NULL) XGpio_DiscreteSet(&Gpio0, GPIO_0_CHANNEL1, 0x07);

 

память не выделилась. Указатель нулевой возвращается. Да чтож такое. Нет в жизни счастья!

 

Видимо линкскрипт в этом окне надо править. Вопрос что и где?

1) Вы я так вижу "не программист" в принципе. :05:

2) ISE/EDK которой версии (вер 9 ???)? Не приципиально - но всё же лучше пользоваться более свежей верией (вер 13.4).

3) функция malloc() берёт память из heap, а его размер по умолчанию гораздо меньше чем Вам надо. Подробности в документации.

4) Так же не понятен вид массивов: глобальное или локальное размещение. Требуется полный текст исходников.

Share this post


Link to post
Share on other sites

ISE 12.2

Я знаю что heap размером всего 1кб по умолчанию. Это не принципиально - я и 10 байт для пробы пытался зарезервировать - тот же результат, возвращает ноль.

 

Массив объявлен в начале main вместе с другими переменными.

 

void main()

{

.......... объявление переменных

u8 *DataBuf;

DataBuf = (u8 *)malloc(1500 * sizeof(u8));

 

.......... тело программы

 

}

 

Ладно, пусть malloc не работает. Переживу.

 

Почему он не дает просто линейный массив создать? Где ему прописать в линкере это?

Share this post


Link to post
Share on other sites
Почему он не дает просто линейный массив создать? Где ему прописать в линкере это?

 

В коде

Xuint32 buf1[4096] __attribute__ ((section (".data_section1"))); 
Xuint32 buf2[4096] __attribute__ ((section (".data_section2"))); 
Xuint32 buf3[4096] __attribute__ ((section (".data_section3")));

В линкере

MEMORY
{
   DDR_SDRAM_64Mx32_C_MEM0_BASEADDR : ORIGIN = 0x00000000, LENGTH = 0x04000000
   DATA1   : ORIGIN = 0x00010000, LENGTH = 0x00004000
   DATA2   : ORIGIN = 0x00020000, LENGTH = 0x00004000
   DATA3   : ORIGIN = 0x00030000, LENGTH = 0x00004000      
   plb_bram_if_cntlr_1 : ORIGIN = 0xFFFFC000, LENGTH = 0x00004000
}

SECTIONS
{

..........

.data_section1 : {*(.data_section) } > DATA1
.data_section2 : {*(.data_section) } > DATA2
.data_section3 : {*(.data_section) } > DATA3
}

 

Дальше, курите доки, я тоже это не с рождения знал.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this