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

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

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

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

 

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

u8 DataBuf1[1500];

u8 DataBuf2[1500];

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


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

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

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

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

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

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

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


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

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

 

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

 

u8 *DataBuf;

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

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

 

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

 

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

post-65130-1335612194_thumb.jpg

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


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

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

 

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

 

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) Так же не понятен вид массивов: глобальное или локальное размещение. Требуется полный текст исходников.

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


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

ISE 12.2

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

 

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

 

void main()

{

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

u8 *DataBuf;

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

 

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

 

}

 

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

 

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

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


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

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

 

В коде

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
}

 

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

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


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

Mad_max большое Вам спасибо. Помогло.

 

З.Ы. а malloc я так и не победил. Даже проект создал пустой, в котором один malloc и был.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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