Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Microblaze + DDR + custom IP
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Системы на ПЛИС - System on a Programmable Chip (SoPC)
shpongle
Здравствуйте.
Делаю проект (707 плата) в котором есть процессор Microblaze. Программа к процессору большая и линкер складывает ее в память DDR.
Мне необходимо использовать память DDR для временного хранения информации. Как правильно это сделать?
1. Я могу использовать для этого прямой доступ к памяти из процессора и писать по определенному адресу, после чего читать из него при помощи своего ядра по AXI.
2. Я могу вызвать функцию malloc выделить кусок памяти и сохранить там информацию, после чего считать данные при помощи своего ядра по AXI. Но, насколько я знаю, этой функцией пользоваться не желательно.
В первом случае, как я понимаю, я могу перезаписать данные относящиеся к программе Microblaze, во втором случае такого не должно быть.
Поправьте если ошибаюсь.

Inanity
Мало инфы, от задачи зависит. Если аккуратно работать с указателями и размерами, то microblaze и ваше ядро спокойно уживутся в одной памяти при обоих подходах. Выделяете кусок в .heap, делаете с ним что надо, потом ядру своему передаёте указатель на этот кусок и его размер. Чтобы не было коллапса нужно на момент работы вашего ядра с этим куском памяти приостановить все телодвижения с .heap, чтобы исключить порчу данных. Я имею ввиду ситуации, когда менеджер памяти вдруг сделает дефрагментацию и буфер, с которым сейчас работает ваше AXI ядро вдруг куда-то уплывёт. Если есть возможность подождать, то второй вариант просто каноничнее. Если нет, тогда безопаснее класть данные туда, где их точно не испортят.
shpongle
Цитата(Inanity @ Nov 2 2015, 01:25) *


Спасибо за информацию.
Мне нужно сохранить в память 10МБ данных, полученных по USB или ETH, после чего я буду их вычитывать своим ядром нонстоп.
Где можно посмотреть адрес и размер .heap секции? Если открыть линкер скрипт, то в нем написано Heap size 0xA000, это значит то под кучу выделено 40960 байт?
Как узнать с какого адреса начинается секция .heap?

Код
MEMORY
{
   microblaze_0_local_memory_ilmb_bram_if_cntlr_microblaze_0_local_memory_dlmb_bram
_if_cntlr : ORIGIN = 0x00000050, LENGTH = 0x00007FB0
   mig_7series_0 : ORIGIN = 0x80000000, LENGTH = 0x40000000
}


ELF файл:
text data bss dec hex filename
190500 2276 753784 946560 e7180 bsp.elf



Inanity
Верно, всё указано в линкер скрипте. По поводу размера - да, но, насколько я знаю, это 40960 байт с учётом служебных полей, так что выделить все 0xA000 под буфер не выйдет, берите с запасом небольшим. Где .heap врать не хочу, не помню, вроде после .bss был, изучайте этот вопрос. А так ли это имеет значение где он?
shpongle
В линкер скрипте много полей:
Код
.text
.init
.fini
...
.bss
.heap
.stack


Как я понимаю, размер каждой области памяти известен после сборки проетка. В моем случае 946560 байт и так как .heap и .stack идут после .bss, то их адрес и размер 946560+40К+40К, остальная память будет не доступна для проца и я могу писать и читать в нее напрямую. Вот зачем мне надо знать где кончается .heap и .stack.

Подскажит где можно прочитать подробнее про память Microblaze?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.