GAYVER 2 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба Микроблейз из тестового примера был добавлен в бОльший проект. Для связи с нашими местными акси устройствами наружу с интерконнекта был вытащен один мастер инфтерфейс, который замаплен на адрес 0x20000000. Задача - достучаться до внешней памяти через этот интерфейс. В сишную тестовую программу вставил команду чтения с этого адреса (адрес взят как дефайн базового адреса этого мастер интерфеса из "xparameters.h"). Результат - на выходе микроблейза появляется чтение по этому адресу ("внешнее" акси) но не на порту акси-данных, а на порту внутренней памяти, висящей на LMB шине. При этом, несмотря на несовпадение адресов, стоящий внутри блока памяти декодера-"маскировщика" и в целом вылета адреса за доступный диапазон памяти данных микроблейза, ответ оттуда приходит #include "xparameters.h" //Библиотека с параметрами IP-блоков #include "xgpio.h" //Библиотека с функциями GPIO #include "xil_io.h" #include "xil_testio.h" XGpio gpio; //Создаем "программную" модель GPIO int main(){ u32 i = 0; //используем для задержки u32 led = 0; //состояние светодиода u32 pr=XPAR_M02_AXI_0_BASEADDR; //+0x10000000 u32 pr2; u32 cons=6; int err=3; XGpio_Initialize(&gpio, XPAR_GPIO_0_DEVICE_ID);//Находим и инициализируем GPIO xil_printf("Hello, world!!!");//Автоматически цепляется Uartlite и выводит сообщение err=Xil_TestIO32(XPAR_M02_AXI_0_BASEADDR, 4, cons, 0, 0); while(1==1){ //Бесконечный цикл мигания i++; //увеличиваем счётчик if(i == 1000){//Если достигнуто значение 1_000_000 led = !led;//Инвертируем состояние светодиода i = 0;//Сбрасываем сётчик XGpio_DiscreteWrite(&gpio, 1, led);//Записываем состояние светодиода в GPIO pr2=Xil_In32(pr); pr=pr+4; //xil_printf(pr2); } } return 0; } Плюс еще запользовал команду тестирования ввода-вывода. Результат тот же - вместо внешнего акси запросы уходят на внутреннюю память данных. Вопрос - где я не прав? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба могу ошибаться, но разве акси подсистема не с 0x8000_0000 адреса начинается? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба 1 час назад, des00 сказал: могу ошибаться, но разве акси подсистема не с 0x8000_0000 адреса начинается? поставил адрес 0xA000_0000, результат тот же - запрос идет на LMB. а где можно посмотреть за выделяемые диапазоны? насколько я помню оговаривалось только что есть кэшируемая и не кэшируемая области. причем без конкретики - что с какого адреса начинается Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 30 июня, 2020 Опубликовано 30 июня, 2020 · Жалоба 4 часа назад, des00 сказал: могу ошибаться, но разве акси подсистема не с 0x8000_0000 адреса начинается? вы оказались правы. в ПГ116 (MicroBlaze MCS v3.0) был такой пунктик: I/O ModuleThe I/O Module core is a light-weight implementation of a set of standard I/O functions commonly used in a MicroBlaze processor sub-system. Detailed information about the I/O Module core can be found in the I/O Module Product Guide (PG111) [Ref 5]. The I/O Module core registers are mapped at address 0x80000000, and the I/O Bus is mapped at address 0xC0000000-0xFFFFFFFF in the MicroBlaze memory space. The fixed I/O Module parameter values can be found in Table 4-3. Получил запрос на аксёвой шине, сейчас буду подгонять адреса. Спасибо за заданное направление поиска :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 30 июня, 2020 Опубликовано 30 июня, 2020 (изменено) · Жалоба 11 hours ago, des00 said: могу ошибаться, но разве акси подсистема не с 0x8000_0000 адреса начинается? 7 hours ago, GAYVER said: вы оказались правы. в ПГ116 (MicroBlaze MCS v3.0) был такой пунктик: И все же это не так. MCS - это особый случай, прибитый гвоздями вариант, в котором как разработчики поставили адреса, так и будет. Возможно ограничения и есть, но точно не 0х8000_0000. На этот адрес автоматом обычно DDR встает, если есть в проекте. Изменено 30 июня, 2020 пользователем Strob Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GAYVER 2 2 июля, 2020 Опубликовано 2 июля, 2020 · Жалоба 30.06.2020 в 22:35, Strob сказал: И все же это не так. MCS - это особый случай, прибитый гвоздями вариант, в котором как разработчики поставили адреса, так и будет. Возможно ограничения и есть, но точно не 0х8000_0000. На этот адрес автоматом обычно DDR встает, если есть в проекте. это понятно что mcs это не mb 11.0. но хотя бы направление поиска задано. может быть в очередном ПГ наткнусь и на требования к чистому МБ. ну или в даташите на него дочитаюсь до нужной строчки. а пока метод научного тыка показывает что и в чистом МБ есть аналог ИО_модуля, в котором что-то жестко прописано Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strob 0 2 июля, 2020 Опубликовано 2 июля, 2020 · Жалоба Мне кажется как раз направление задано ошибочно. Попробуйте отключить кэширование. Я не большой спец в этих вопросах, но как альтернативу, попробуйте не использовать xil_in32, а читать и писать явно по указателю. В этой функции используется волатильная переменная. Возможно это приводит к кэширование. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться