Jump to content

    
Sign in to follow this  
GAYVER

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

Recommended Posts

Микроблейз из тестового примера был добавлен в бОльший проект. Для связи с нашими местными акси устройствами наружу с интерконнекта был вытащен один мастер инфтерфейс, который замаплен на адрес 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

 

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

 

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

 

 

Share this post


Link to post
Share on other sites
1 час назад, des00 сказал:

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

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

Share this post


Link to post
Share on other sites
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.

 

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

Share this post


Link to post
Share on other sites
11 hours ago, des00 said:

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

 

7 hours ago, GAYVER said:

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

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

Edited by Strob

Share this post


Link to post
Share on other sites
30.06.2020 в 22:35, Strob сказал:

 

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

 

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this