Jump to content

    

Aleksei_Rostov

Свой
  • Content Count

    311
  • Joined

  • Last visited

Posts posted by Aleksei_Rostov


  1. Just now, gosha-z said:

    Ну так закатайте rootfs в cpio и грузите как ramdisk в FIT - зачем вам в эиуляторе MicroSD?

    rootfs.cpio.ext4 у меня есть и настройки в Petalinux выставлял для rootfs не microSD, а initramfs, тогда ругается на нехватку памяти и виснет (хотя редактировать объем памяти в uboot еще не пробовал)

  2. 1 minute ago, gosha-z said:

    А что у вас за пин на отладочной плате????

    P.S. Никогда не понимал применения эмуляторов при наличии живого железа...

    Насчет пина пока разбираюсь, это предположение сделал на основании ответов с форума xilinx. По поводу наличия железа и применения эмуляторов абсолютно разделяю Ваше мнение, но иногда работаю удаленно и отладку запустить возможности нет, поэтому пробую запуск приложений на эмуляторе.

  3. Добрый день! Уважаемые товарищи подскажите пожалуйста решение следующей проблемы. Собрал для Zynq Arty z7-20 платы свой Linux образ с помощью Petalinux 2019.1. Rootfs разворачиваю на microSD. Пытаюсь  запустить собранную ОС на QEMU.

    запуск по команде 

    petalinux-boot --qemu --image ./images/linux/zImage --dtb ./images/linux/system.dtb

    Система запускается, но виснет на загрузке Rootfs

    Waiting for root device /dev/mmcblk0p2...
    cdns-i2c e0004000.i2c: timeout waiting on completion

    На плате запуск происходит без проблем. Делаю вывод, что QEMU требуется сообщить, что microSD готова для загрузки Rootfs, т.е. определенный пин должен встать в состояние '1' (как это происходит на отладочной плате). Какой пин и как нужно выставить? Я так понимаю достаточно отредактировать system-user.dtsi?

  4. 13 minutes ago, Eddy_Em said:

    Блин! ЗАчем здесь clock? оно ж не время считает!!!

    Вот, пожалуйста, мой пример:

    
    #include <sys/time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    static double dtime(){
        double t;
        struct timeval tv;
        gettimeofday(&tv, NULL);
        t = tv.tv_sec + ((double)tv.tv_usec)/1e6;
        return t;
    }
    
    static void mularr0(int *a1, int *a2, int *a3){
            for(int i = 0; i < 1000; ++i) a3[i] = a1[i] * a2[i];
    }
    
    static void mularr8(int *a1, int *a2, int *a3){
            #pragma omp parallel for num_threads(8)
            for(int i = 0; i < 1000; ++i) a3[i] = a1[i] * a2[i];
    }
    
    void main(){
            int arr1[1000], arr2[1000], arr3[1000];
            for(int i = 0; i < 1000; ++i){ arr1[i] = rand(); arr2[i] = rand();}
            double start = dtime();
            for(int x = 0; x < 1000000; ++x) mularr0(arr1, arr2, arr3);
            printf("1 thread: %gs\n", dtime() - start);
            start = dtime();
            for(int x = 0; x < 1000000; ++x) mularr8(arr1, arr2, arr3);
            printf("8 threads: %gs\n", dtime() - start);
    }

    Проверяем без openmp:

    
    gcc 1.c && ./a.out 
    1 thread: 2.37255s
    8 threads: 2.35688s

    А теперь - с openmp:

    
    gcc 1.c -fopenmp && ./a.out 
    1 thread: 2.40718s
    8 threads: 1.47267s

    Прикола ради добавил 4 потока, получил:

    
    gcc 1.c -fopenmp && ./a.out 
    1 thread: 2.44632s
    4 threads: 1.4663s
    8 threads: 1.48998s

    Хотя у меня 8 "железных" ядер... Но накладные расходы во втором случае все съедают.

     

     

    Спасибо еще раз! Заработало!

  5. Just now, Eddy_Em said:

    Читаем man clock:

    И понимаем, что в многопоточном режиме она выдаст СУММАРНОЕ время по всем потокам!

    Спасибо, уже понял, что некорректно ее использовать: в VS по точкам дебага временные затраты другие иллюстрируются.... 

  6. 3 minutes ago, Eddy_Em said:

    Блин! ЗАчем здесь clock? оно ж не время считает!!!

    Разницу между start и end. На Винде с клоком тоже работает...

     cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;

     

    Вот вывод консоли для Windows

    Start programm
    Time taken by for_loop: 0.401 seconds
    Time taken by for_loop with openmp: 0.143 seconds
    Done !

    Размер массивов задал 8192х8192. Выйгрыш во времени более чем в два раза

  7. 7 minutes ago, Eddy_Em said:

    А нельзя ли сделать MWE такой, чтобы гадость (opencv) с собой не тащило? Могу на генте проверить.

     

     

    Запускаю на Windows в VS 2019, программа работает как и ожидается: использование OpenMP позволило ускорить for в несколько раз. На Ubuntu и на ARM Linux не получается ....

  8. 29 minutes ago, Eddy_Em said:
    
    randn(rnd_image

    А ничего, что эта штука - общая переменная для обоих потоков. И они вынуждены вызывать синхронизацию, в результате чего время будет больше, чем без OMP!

    Заводите временные переменные прямо внутри цикла.

    Исправил, вынес инициализацию вне for

     

    root@imx8m-var-dart:~/test# ./a.out
    Start programm
    Time taken by for_loop: 0.05834 seconds
    Time taken by for_loop with openmp: 0.100663 seconds
    root@imx8m-var-dart:~/test#

    без изменений...

    Запускаю эту же программу под Ubuntu 16.04

    alexey@ubuntu:~/test$ g++ main.cpp -fopenmp -I /usr/include/opencv2 -L /usr/lib -lopencv_core
    alexey@ubuntu:~/test$ ./a.out 
    Start programm
    Time taken by for_loop: 0.091176 seconds 
    Time taken by for_loop with openmp: 0.017327 seconds 
    alexey@ubuntu:~/test$ 

     

  9. 8 minutes ago, aaarrr said:

    Ну, я бы все же довел время выполнения тестового фрагмента до десятков-сотен мс, чтобы точно отвязаться от возможных погрешностей измерения.

    Я понимаю что вы имеете в виду, но у меня в задаче 4 канала и в каждом канале набор последовательных арифметических действий (умножение\деление\фильтрация) над массивами (изображениями). Вот и пытаюсь оптимизировать программу по быстродействию. 

    Увеличил размер перемножаемых массивов до 2048 х 2048

    результат

    root@imx8m-var-dart:~/test# ./a.out
    Start programm
    Time taken by for_loop: 0.931792 seconds
    Time taken by for_loop with openmp: 1.80278 seconds
    root@imx8m-var-dart:~/test#

    С openmp время увеличилось в два раза...

  10. 3 minutes ago, aaarrr said:

    Так 4 итерации цикла - маловато для оценки, мягко говоря.

    Но в каждой итерации у меня перемножаются по два массива... Как я понимаю каждое ядро выполняет по одной итерации. Более того, запускаю программу на Windows в Visual studio, прирост в производительности есть.

  11. Здравствуйте! Подскажите пожалуйста почему при подключении openmp не удается уменьшить время работы программы.

    Плата imx8 с Cortex A53

    Содержимое файла main.cpp

    #include <iostream>
    #include <opencv2/opencv.hpp>
    #include <vector>
    #include <math.h>
    #include <time.h>
    #include <omp.h>
    
    #define CHANNELS 4
    using namespace std;
    using namespace cv;
    
    int main()
    {
        cout << "Start programm" << endl;
    
        vector<Mat>      matrix_1(CHANNELS);
        vector<Mat>      matrix_2(CHANNELS);
        vector<Mat>      result(CHANNELS);
        Mat rnd_image = Mat(32, 32, CV_32FC1, Scalar(0));
        // matrix initialization
    
        clock_t start, end;
        double cpu_time_used;
    	
    	start = clock();
        for (int i = 0; i < CHANNELS; i++) {
            randn(rnd_image, Scalar(0), Scalar(16000));
            rnd_image.copyTo(matrix_1[i]);
            randn(rnd_image, Scalar(0), Scalar(16000));
            rnd_image.copyTo(matrix_2[i]);
            multiply(matrix_1[i], matrix_2[i], result[i]);
        }
        end = clock();
        cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
    
        cout << "Time taken by for_loop: " << cpu_time_used << " seconds " << endl;
    	
        start = clock();
    	
    	#pragma omp parallel num_threads(2)
    	for (int i = 0; i < CHANNELS; i++) {
    		randn(rnd_image, Scalar(0), Scalar(16000));
    		rnd_image.copyTo(matrix_1[i]);
    		randn(rnd_image, Scalar(0), Scalar(16000));
    		rnd_image.copyTo(matrix_2[i]);
    		multiply(matrix_1[i], matrix_2[i], result[i]);
    	}
    
        end = clock();
        cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;
    
        cout << "Time taken by for_loop with openmp: " << cpu_time_used << " seconds " << endl;
        return 0;
    }

    Команда для компиляции (флаг -fopenmp добавлен)

     g++ main.cpp -fopenmp -I /usr/include/opencv2 -L /usr/lib -lopencv_core

    Прописал переменную 

    root@imx8m-var-dart:~/test# printenv OMP_NUM_THREADS
    2
    root@imx8m-var-dart:~/test#

    Компилирую и запускаю программу

    root@imx8m-var-dart:~/test# g++ main.cpp -fopenmp -I /usr/include/opencv2     -L /usr/lib     -lopencv_core
    root@imx8m-var-dart:~/test# ./a.out
    Start programm
    Time taken by for_loop: 0.000802 seconds
    Time taken by for_loop with openmp: 0.000789 seconds
    root@imx8m-var-dart:~/test#

    По идее время на выполнение должно быть в два раза меньше... Что делаю не так?

  12. 8 minutes ago, magvrn said:

    Выкладывайте как прописывали адресацию, и как и где дефолтрут. В таблице маршрутизации ничего нет.

    Спасибо, проблему решил.

    Подсети на imx8 разные выставил:

    root@imx8m-var-dart:~# ip route
    192.168.1.0/24 dev usb0 proto kernel scope link src 192.168.1.99
    192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.33

    На ПК IP выставил 192.168.2.2.

    Теперь пинг проходит по каждому интерфейсу

     

    root@imx8m-var-dart:~# ping -I eth0 192.168.2.2
    PING 192.168.2.2 (192.168.2.2) from 192.168.2.33 eth0: 56(84) bytes of data.
    64 bytes from 192.168.2.2: icmp_seq=1 ttl=128 time=2.44 ms
    
    --- 192.168.2.2 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    
    root@imx8m-var-dart:~# ping -I usb0 192.168.1.100
    PING 192.168.1.100 (192.168.1.100) from 192.168.1.99 usb0: 56(84) bytes of data.
    64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.699 ms
    64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0.641 ms
    
    --- 192.168.1.100 ping statistics ---
    2 packets transmitted, 2 received, 0% packet loss, time 1028ms


     

  13. 5 minutes ago, magvrn said:

    Выложите полный вывод команд

    netstat -rn

    ip route

     

     

     

    root@imx8m-var-dart:~# netstat -rn
    Kernel IP routing table
    Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
    192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
    192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 usb0

     

    root@imx8m-var-dart:~# ip route
    192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.33
    192.168.1.0/24 dev usb0 proto kernel scope link src 192.168.1.99


    Интерфейс usb0 имеет статический ip 192.168.1.99 для соединения с сервером с ip 192.168.1.100 port 0x5555, интерфейс eth0 используется пока для удаленной компиляции на плате imx8 c ПК.

    После reboot и назначения ip для usb0 и eth0 пинг проходит только по интерфейсу eth0. При дебаге кода (тестовый tcp клиент), программа не выполняет connect() для usb0 интерфейса

  14. 7 minutes ago, Jury093 said:
    
    inet addr:192.168.2.33  Bcast:192.168.2.255  Mask:255.255.255.0
    
    192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.33

    во второй строке не ошиблись?

    изменил IP и скопировал. правильно 192.168.2.0/24 

    Я понимаю, что что-то неправильно делаю при реализации двух сетевых интерфейсов под linux.

    Обязательно должно быть: 

    - разные роут для каждого интерфейса

  15. Добрый день! Запускаю на arm64 imx8 board сеть с использованием RNDIS интерфейса и eth0.

     

    root@imx8m-var-dart:~# ifconfig
    
    eth0      Link encap:Ethernet  HWaddr f8:dc:7a:1b:f1:ae
              inet addr:192.168.2.33  Bcast:192.168.2.255  Mask:255.255.255.0
              inet6 addr: fe80::fadc:7aff:fe1b:f1ae/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:3917 errors:0 dropped:0 overruns:0 frame:0
              TX packets:945 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:300204 (293.1 KiB)  TX bytes:233024 (227.5 KiB)
    
    lo        Link encap:Local Loopback
              inet addr:127.0.0.1  Mask:255.0.0.0
              inet6 addr: ::1/128 Scope:Host
              UP LOOPBACK RUNNING  MTU:65536  Metric:1
              RX packets:138 errors:0 dropped:0 overruns:0 frame:0
              TX packets:138 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:12968 (12.6 KiB)  TX bytes:12968 (12.6 KiB)
    
    usb0      Link encap:Ethernet  HWaddr 26:16:ff:7d:bb:80
              inet addr:192.168.1.99  Bcast:192.168.1.255  Mask:255.255.255.0
              inet6 addr: fe80::2416:ffff:fe7d:bb80/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:52 errors:0 dropped:0 overruns:0 frame:0
              TX packets:587 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:3416 (3.3 KiB)  TX bytes:131753 (128.6 KiB)

    Включаю интерфейсы по отдельности, пинг проходит.

    как только запускаю два интерфейса одновременно, то пингуется только тот, который был запущен первым

    Роут у них общий

    root@imx8m-var-dart:~# ip route
    192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.33
    192.168.1.0/24 dev usb0 proto kernel scope link src 192.168.1.99

    разносил на разные подсети, проблема не решилась.

    Что необходимо для корректной работы двух интерфейсов одновременно?
     

  16. Здравствуйте! Уважаемые форумчане, возможно кто  нибудь подскажет, как подключить opencv при удаленной компиляции в Microsoft Visual Studio с помощью расширения Linux development with C++ ? 

    Есть отладочный набор DART-MX8M development board. На ARM поставил собранный с помощью yocto образ Linux. В VS2017 с помощью расширения Linux development with C++ выполняю удаленную компиляцию. Helloword запускается, но при попытке запустить код с объявленным Mat выдает ошибку 'Mat' was not declared in this scope. Как компоновщику указать на opencv в DART-MX8M development board?

  17. Выложу исходники, может кому пригодится.

    Получилось так, записываю:

     

    во флеш по адресу 0х00000000 файл с проинициализированной BRAM:

              download.bit

     

    По адресу 0х00440000 файл:

              first_elf.elf

     

    по адресу 0х00840000 файл:

             second_elf.elf

     

    При подаче питания запускается download.bit, потом загружается и исполняется first_elf.elf, и далее second_elf.elf.

     

    Код для формирования bootloader'а download.bit взял от trenz electonics^

     

    #include "spi_flash.h"
    #include <stdio.h>
    //-----------------------------------------------------------------------------
    #define SSB_START_ADDR			0x00440000
    #define XIL_BIT_SYNC			0x665599AA
    #define ELF_EHSIZE				52
    #define ELF_SHENTSIZE			40
    #define ELFMAG					0x464C457F
    #define SHT_PROGBITS			1
    #define ELF_HDR_SHNUM_OFF		48
    #define ELF_HDR_SHOFF_OFF		8
    #define ELF_HDR_SHTYPE_OFF		4
    #define ELF_HDR_SHADDR_OFF		3
    #define ELF_HDR_SHOFFSET_OFF	4
    #define ELF_HDR_SHSIZE_OFF		5
    #define MEM_TEST_RANGE			0x1000
    #define SPI_READ_CMD			0x0300
    //-----------------------------------------------------------------------------
    u8	e_shnum, section, sh_type;
    u32	e_shoff, sh_addr, sh_offset, sh_size;
    int (*reset_func) () = 0;
    u32	int_read_buf[13];
    u32	int_readtest_buf[64];
    u8* char_readtest_buf = (u8*)int_readtest_buf;
    u8* char_read_buf = (u8*)int_read_buf;
    u8 *mem_section;
    volatile u32 *ddr_mem = (u32*)XPAR_MIG_7SERIES_0_BASEADDR;
    //-----------------------------------------------------------------------------
    void pause(int p){
    	volatile int v;
    	for(v = 0; v < (400000 * p); v++);
    }
    //-----------------------------------------------------------------------------
    int main(void){
    	int i;
    
    	print("\r\nTrenz Electronic ELF bootloader "__DATE__" "__TIME__"\r\n\r\n");
    	spi_flash_init(XPAR_AXI_QUAD_SPI_0_DEVICE_ID);	// Init SPI Flash
    	// Test memory before use it!
    	for(i = 0; i < MEM_TEST_RANGE; i++)
    		ddr_mem[i] = i;
    	for(i = 0; i < MEM_TEST_RANGE; i++){
    		if(ddr_mem[i] != i){
    			xil_printf("ERROR: Memory test failed!\r\n");
    			while(1);
    		}
    	}
    
    	////////////////////////////////////
    	// Read SSB
    	spi_flash_read(SSB_START_ADDR, ELF_EHSIZE, char_read_buf);
    	if(int_read_buf[0] != ELFMAG){
    		xil_printf("ERROR: Boot image not found\r\n");
    		while(1);
    	}
    
    	e_shnum	= char_read_buf[ELF_HDR_SHNUM_OFF];
    	e_shoff = int_read_buf[ELF_HDR_SHOFF_OFF];
    
    	for(section = 0; section < e_shnum; section++){	// Sections loop
    		spi_flash_read((SSB_START_ADDR + e_shoff + section * ELF_SHENTSIZE),
    			ELF_SHENTSIZE, char_read_buf);
    
    		sh_type = char_read_buf[ELF_HDR_SHTYPE_OFF];
    		sh_addr = int_read_buf[ELF_HDR_SHADDR_OFF];
    		sh_offset = int_read_buf[ELF_HDR_SHOFFSET_OFF];
    		sh_size = int_read_buf[ELF_HDR_SHSIZE_OFF];
    		mem_section = (u8*)sh_addr;
    
    		if(sh_type == SHT_PROGBITS){	// Process only sections with data
    			if(sh_addr == 0){
    				if(sh_size == 8)
    					spi_flash_read((SSB_START_ADDR + sh_offset), sh_size,
    						mem_section);
    			}
    			else	// Usual sections
    				spi_flash_read((SSB_START_ADDR + sh_offset), sh_size,
    					mem_section);
    		}
    	}	// Sections loop
    	xil_printf("\r\nBoot...\r\n");
    	pause(1);
    	reset_func();	// Start Second Stage
    	while(1);
    }
    

     

    Полученный при компиляции elf файл размещаю в BRAM и при прошивке ПЛИС получаю download.bit

     

    Код для формирования first_elf.elf:

     

    #include "spi_flash.h"
    #include <stdio.h>
    //-----------------------------------------------------------------------------
    #define SSB_START_ADDR			0x00840000
    #define XIL_BIT_SYNC			0x665599AA
    #define ELF_EHSIZE				52
    #define ELF_SHENTSIZE			40
    #define ELFMAG					0x464C457F
    #define SHT_PROGBITS			1
    #define ELF_HDR_SHNUM_OFF		48
    #define ELF_HDR_SHOFF_OFF		8
    #define ELF_HDR_SHTYPE_OFF		4
    #define ELF_HDR_SHADDR_OFF		3
    #define ELF_HDR_SHOFFSET_OFF	4
    #define ELF_HDR_SHSIZE_OFF		5
    #define MEM_TEST_RANGE			0x1000
    #define SPI_READ_CMD			0x0300
    //-----------------------------------------------------------------------------
    u8	e_shnum, section, sh_type;
    u32	e_shoff, sh_addr, sh_offset, sh_size;
    int (*reset_func) () = 0;
    u32	int_read_buf[13];
    u32	int_readtest_buf[64];
    u8* char_readtest_buf = (u8*)int_readtest_buf;
    u8* char_read_buf = (u8*)int_read_buf;
    u8 *mem_section;
    volatile u32 *ddr_mem = (u32*)XPAR_MIG_7SERIES_0_BASEADDR;
    //-----------------------------------------------------------------------------
    void pause(int p){
    	volatile int v;
    	for(v = 0; v < (400000 * p); v++);
    }
    //-----------------------------------------------------------------------------
    int main(void){
    	int i;
    
    	print("\r\nTrenz Electronic ELF bootloader "__DATE__" "__TIME__"\r\n\r\n");
    	spi_flash_init(XPAR_AXI_QUAD_SPI_0_DEVICE_ID);	// Init SPI Flash
    	//////////////////////////////////////////////////////////
    	////////// ANY USER APP /////////////////////////////////
    
    	for(i = 0; i < 100; i ++){
    
    		xil_printf("data from first app is %d", i);
    	}
    
    
    
    
    	///////////////////////////////////////////////////////
    	//////////////// END ANY USER APP /////////////////////
    	///////////////////////////////////////////////////////
    
    	////////////////////////////////////
    	// Read SSB
    	spi_flash_read(SSB_START_ADDR, ELF_EHSIZE, char_read_buf);
    	if(int_read_buf[0] != ELFMAG){
    		xil_printf("ERROR: Boot image not found\r\n");
    		while(1);
    	}
    
    	e_shnum	= char_read_buf[ELF_HDR_SHNUM_OFF];
    	e_shoff = int_read_buf[ELF_HDR_SHOFF_OFF];
    
    	for(section = 0; section < e_shnum; section++){	// Sections loop
    		spi_flash_read((SSB_START_ADDR + e_shoff + section * ELF_SHENTSIZE),
    			ELF_SHENTSIZE, char_read_buf);
    
    		sh_type = char_read_buf[ELF_HDR_SHTYPE_OFF];
    		sh_addr = int_read_buf[ELF_HDR_SHADDR_OFF];
    		sh_offset = int_read_buf[ELF_HDR_SHOFFSET_OFF];
    		sh_size = int_read_buf[ELF_HDR_SHSIZE_OFF];
    		mem_section = (u8*)sh_addr;
    
    		if(sh_type == SHT_PROGBITS){	// Process only sections with data
    			if(sh_addr == 0){
    				if(sh_size == 8)
    					spi_flash_read((SSB_START_ADDR + sh_offset), sh_size,
    						mem_section);
    			}
    			else	// Usual sections
    				spi_flash_read((SSB_START_ADDR + sh_offset), sh_size,
    					mem_section);
    		}
    	}	// Sections loop
    	xil_printf("\r\nBoot...\r\n");
    	pause(1);
    	reset_func();	// Start Second Stage
    	while(1);
    }
    

    По сути тот же bootloader только адрес указывает на расположение следующего elf файла (0x00840000) и файл разместил в DDR, но не с начального адреса, а со смещением.

     

    Второй second_elf.elf это уже любой elf файл, размещенный в DDR с начального адреса.

  18. 3 hours ago, andrew_su said:

    .....16 кБайт BRAM недостаточно, а увеличить нельзя......

    Можно. Вот тут обсуждается

    И еще на сайте Xilinx    https://www.xilinx.com/support/answers/52063.html

    Конечно можно) К сожалению в проекте вся блочная память разделена между остальными ядрами и на процессор остается только 16 Кбайт

  19. 1 hour ago, misyachniy said:

    Я так глубоко не копал, но по моему ELF формат тут не подойдет.

    Спасибо за ответ. У меня получается так: во флеш с нулевого адреса записывается bit файл с инициализированной bram. Инициализирована bram elf файлом, в котором программа просто находит elf файл по заданному указателю и вычитывает ИСПОЛНЯЕМЫЙ код  в ДДР. То есть компилировать в screc формат нет необходимости, т.к. это elf файл из BRAM вычитывает только исполняемую часть elf для DDR.

  20. Здравствуйте! Уважаемые товарищи подскажите пожалуйста, какие варианты решения для следующей задачки:

    необходимо последовательно запустить два elf файла на microblaze, который загружается из FLASH памяти.

    Сейчас создаю свой bootloader в виде bit файла с проинициализированной BRAM (16 КБайт), который записываю во FLASH (адресом выше записываю основной elf файл для работы процессора ). При подаче питания в ПЛИС подгружается  bit файл и запускается elf из BRAM памяти, который вычитывает основной elf в DDR и сбрасывает Microblaze для выполнения кода уже из DDR. Тут все просто.

    Теперь возникла необходимость перед запуском основного elf файла записать массив  user data во FLASH (выше bit, elf). Проинициализировать BRAM bootloader'ом и массивом user data не получится, т.к. 16 кБайт BRAM недостаточно, а увеличить нельзя.

    Вот и необходимо сделать так: подали питание, загрузили bit с инициализированной BRAM, процессор вычитал в DDR elf с массивом user data и вычитал elf с основным ПО, выполнил elf с массивом user data (записал данные во FLASH), потом сбросили процессор и сказали ему выполнять код уже из основного elf файла. Как указать microblaze на указатель откуда в DDR выполнять код?

  21. On 4/20/2016 at 5:26 PM, aabmail said:

    Откуда эта ошибка ошибка выскакивает, постепенно проясняется. Отключил свою user-кору от AXI-interconnect, и ошибка пропала.

    В 2017.4 vivado заново пересобрал проект и ошибка пропала. Скорее всего среда что то подтягивает от предыдущих попыток сборки.

  22. С чего вдруг? Создание кадра — всего лишь создание трёх сигналов синхронизации.

     

    Нет, во время Вы не можете, только по прошествии — я же сразу сказал, что входной кадр сперва надо разобрать, а выходной затем собрать...
  23. Нет, во время Вы не можете, только по прошествии — я же сразу сказал, что входной кадр сперва надо разобрать, а выходной затем собрать, потому что все синхросигналы по определению не совместимы, Вы не можете непосредственно использовать ни один входной сигнал в качестве выходного.

     

    Также, всё в том же одном абзаце чуть выше я показал, что здесь достаточно всего двух буферов, на 640 точек каждый, входной и выходной соответственно, и рассказал, в какой момент они должны меняться местами.

     

    Собираемый выходной кадр необходимо хранить во внешней памяти, а у меня условие использовать только внутренние ресурсы ПЛИС.