реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Microblaze не запускается, если в коде зарезервировать два больших массива
TABKP
сообщение Apr 28 2012, 09:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 19-05-11
Пользователь №: 65 130



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

Инициализация:
u8 DataBuf1[1500];
u8 DataBuf2[1500];
Go to the top of the page
 
+Quote Post
Mad_max
сообщение Apr 28 2012, 09:38
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 23-12-06
Из: Зеленоград
Пользователь №: 23 811



Цитата(TABKP @ Apr 28 2012, 13:17) *
Такое ощущение, что ему не памяти не хватает, а где-то прописано ограничение на длину последовательно размещаемых данных в памяти. Как побороть проблему?

Тут вопрос как вы выделяете память.
Возможно программа не правильно линкуется.
В линкерскрипте можно прописать смещение и размер ваших буферов под данные,
тогда точно не будет конфликтов и гарантированно выделится линейная область памяти.
Go to the top of the page
 
+Quote Post
TABKP
сообщение Apr 28 2012, 11:23
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 19-05-11
Пользователь №: 65 130



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

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

u8 *DataBuf;
DataBuf = (u8 *)malloc(1500 * sizeof(u8));
if(DataBuf == NULL) XGpio_DiscreteSet(&Gpio0, GPIO_0_CHANNEL1, 0x07);

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

Видимо линкскрипт в этом окне надо править. Вопрос что и где?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Alex77
сообщение Apr 28 2012, 12:00
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 295
Регистрация: 2-12-05
Пользователь №: 11 695



Цитата(TABKP @ Apr 28 2012, 15:23) *
Да я честно говоря не знаю как линкскрипты писать. Все настройки по умолчанию стоят.

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

u8 *DataBuf;
DataBuf = (u8 *)malloc(1500 * sizeof(u8));
if(DataBuf == NULL) XGpio_DiscreteSet(&Gpio0, GPIO_0_CHANNEL1, 0x07);

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

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

1) Вы я так вижу "не программист" в принципе. 05.gif
2) ISE/EDK которой версии (вер 9 ???)? Не приципиально - но всё же лучше пользоваться более свежей верией (вер 13.4).
3) функция malloc() берёт память из heap, а его размер по умолчанию гораздо меньше чем Вам надо. Подробности в документации.
4) Так же не понятен вид массивов: глобальное или локальное размещение. Требуется полный текст исходников.
Go to the top of the page
 
+Quote Post
TABKP
сообщение Apr 28 2012, 12:25
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 19-05-11
Пользователь №: 65 130



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

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

void main()
{
.......... объявление переменных
u8 *DataBuf;
DataBuf = (u8 *)malloc(1500 * sizeof(u8));

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

}

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

Почему он не дает просто линейный массив создать? Где ему прописать в линкере это?
Go to the top of the page
 
+Quote Post
Mad_max
сообщение Apr 28 2012, 13:40
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 377
Регистрация: 23-12-06
Из: Зеленоград
Пользователь №: 23 811



Цитата(TABKP @ Apr 28 2012, 16:25) *
Почему он не дает просто линейный массив создать? Где ему прописать в линкере это?


В коде
Код
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
}


Дальше, курите доки, я тоже это не с рождения знал.
Go to the top of the page
 
+Quote Post
TABKP
сообщение May 4 2012, 12:15
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 19-05-11
Пользователь №: 65 130



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

З.Ы. а malloc я так и не победил. Даже проект создал пустой, в котором один malloc и был.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 15:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01409 секунд с 7
ELECTRONIX ©2004-2016