TABKP 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба ПЛИС Virtex 4 XC4VLX80. Создал процессор. Память BRAM используется для команд и данных. Объем 64К. Написал маленькую программу. Отладил. Работает. В программе используются два массива данных. Встала необходимость увеличить их размер до 1,5 кбайт каждый. В результате программа перестала работать - она даже не стартует. Если уменьшить размер массивов в половину - работает. Увеличил объем используемой BRAM до 128К - не изменилось НИЧЕГО. Такое ощущение, что ему не памяти не хватает, а где-то прописано ограничение на длину последовательно размещаемых данных в памяти. Как побороть проблему? Инициализация: u8 DataBuf1[1500]; u8 DataBuf2[1500]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба Такое ощущение, что ему не памяти не хватает, а где-то прописано ограничение на длину последовательно размещаемых данных в памяти. Как побороть проблему? Тут вопрос как вы выделяете память. Возможно программа не правильно линкуется. В линкерскрипте можно прописать смещение и размер ваших буферов под данные, тогда точно не будет конфликтов и гарантированно выделится линейная область памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TABKP 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба Да я честно говоря не знаю как линкскрипты писать. Все настройки по умолчанию стоят. Попытался использовать динамическое выделение памяти: u8 *DataBuf; DataBuf = (u8 *)malloc(1500 * sizeof(u8)); if(DataBuf == NULL) XGpio_DiscreteSet(&Gpio0, GPIO_0_CHANNEL1, 0x07); память не выделилась. Указатель нулевой возвращается. Да чтож такое. Нет в жизни счастья! Видимо линкскрипт в этом окне надо править. Вопрос что и где? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alex77 4 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба Да я честно говоря не знаю как линкскрипты писать. Все настройки по умолчанию стоят. Попытался использовать динамическое выделение памяти: 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) Так же не понятен вид массивов: глобальное или локальное размещение. Требуется полный текст исходников. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TABKP 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба ISE 12.2 Я знаю что heap размером всего 1кб по умолчанию. Это не принципиально - я и 10 байт для пробы пытался зарезервировать - тот же результат, возвращает ноль. Массив объявлен в начале main вместе с другими переменными. void main() { .......... объявление переменных u8 *DataBuf; DataBuf = (u8 *)malloc(1500 * sizeof(u8)); .......... тело программы } Ладно, пусть malloc не работает. Переживу. Почему он не дает просто линейный массив создать? Где ему прописать в линкере это? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mad_kvmg 0 28 апреля, 2012 Опубликовано 28 апреля, 2012 · Жалоба Почему он не дает просто линейный массив создать? Где ему прописать в линкере это? В коде 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 } Дальше, курите доки, я тоже это не с рождения знал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TABKP 0 4 мая, 2012 Опубликовано 4 мая, 2012 · Жалоба Mad_max большое Вам спасибо. Помогло. З.Ы. а malloc я так и не победил. Даже проект создал пустой, в котором один malloc и был. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться