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

MicroBlaze для начинающих 2

Микроблейз из тестового примера был добавлен в бОльший проект. Для связи с нашими местными акси устройствами наружу с интерконнекта был вытащен один мастер инфтерфейс, который замаплен на адрес 0x20000000.

352029242_3.thumb.png.f87c82ebbd8b68ac49d4492b272315ff.png

1955431834_2.thumb.png.78be415be4816ecd0afe873de7d45ebd.png

 

Задача - достучаться до внешней памяти через этот интерфейс. В сишную тестовую программу вставил команду чтения с этого адреса (адрес взят как дефайн базового адреса этого мастер интерфеса из "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;
}

1302469228_.thumb.png.26e19e58a937b2d3ae184227c32f8094.png

 

Плюс еще запользовал команду тестирования ввода-вывода. Результат тот же - вместо внешнего акси запросы уходят на внутреннюю память данных.

 

Вопрос - где я не прав?

 

 

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


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

могу ошибаться, но разве акси подсистема не с 0x8000_0000 адреса начинается?

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


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

1 час назад, des00 сказал:

могу ошибаться, но разве акси подсистема не с 0x8000_0000 адреса начинается?

поставил адрес 0xA000_0000, результат тот же - запрос идет на LMB. а где можно посмотреть за выделяемые диапазоны? насколько я помню оговаривалось только что есть кэшируемая и не кэшируемая области. причем без конкретики - что с какого адреса начинается

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


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

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.

 

Получил запрос на аксёвой шине, сейчас буду подгонять адреса. Спасибо за заданное направление поиска :)

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


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

11 hours ago, des00 said:

могу ошибаться, но разве акси подсистема не с 0x8000_0000 адреса начинается?

 

7 hours ago, GAYVER said:

вы оказались правы. в ПГ116 (MicroBlaze MCS v3.0) был такой пунктик:

И все же это не так. MCS - это особый случай, прибитый гвоздями вариант, в котором как разработчики поставили адреса, так и будет. Возможно ограничения и есть, но точно не 0х8000_0000. На этот адрес автоматом обычно DDR встает, если есть в проекте.

Изменено пользователем Strob

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


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

30.06.2020 в 22:35, Strob сказал:

 

И все же это не так. MCS - это особый случай, прибитый гвоздями вариант, в котором как разработчики поставили адреса, так и будет. Возможно ограничения и есть, но точно не 0х8000_0000. На этот адрес автоматом обычно DDR встает, если есть в проекте.

 

это понятно что mcs это не mb 11.0.  но хотя бы направление поиска задано. может быть в очередном ПГ наткнусь и на требования к чистому МБ. ну или в даташите на него дочитаюсь до нужной строчки. а пока метод научного тыка показывает что и в чистом МБ есть аналог ИО_модуля, в котором что-то жестко прописано

 

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


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

Мне кажется как раз направление задано ошибочно. Попробуйте отключить кэширование. Я не большой спец в этих вопросах, но как альтернативу, попробуйте не использовать xil_in32, а читать и писать явно по указателю. В этой функции используется волатильная переменная. Возможно это приводит к кэширование.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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