-
Постов
2 052 -
Зарегистрирован
-
Посещение
Весь контент Krys
-
Нашёл ещё парочку подсказок: http://forums.xilinx.com/xlnx/board/crawl_...essage.id=29935 http://www.xilinx.com/support/answers/39667.html http://www.xilinx.com/support/answers/56628.html Мне правда они не помогли, но может кому-то будет польза...
-
Решил для себя проблему прогрузки больших данных так: Я в начале спрашивал про flash, но в конечном счёте данные мне нужны были в DDR. Таким действием я напрямую в DDR и кидаю данные перед каждым стартом программы. Удобно. Знал бы сразу... а то уже реализовал чтение с CompactFlash (см. ссылку на тему выше), времени кучу потратил, пока боролся с её багами... Скорость прогрузки примерно та же. Достоинство - грузит с первого раза (с флэшки почему-то часто ошибки чтения были, приходилось перечитывать), не потребляет программное место и не требует места в памяти данных под кэш.
-
Ну лучше бы Вам конкретизировать вопрос )) Моя корка на выходе имеет фифошку по идеологии стрима (по желанию можно взять готовую AXI-Stream FIFO из CoreGen'а, но у меня обычная, т.к. необходимо конвертировать разрядность, а та не умеет. Главное любая из них должна быть в режиме FWFT). Ну у меня тоже DDR, всё точно так же. Единственное: tkeep это для чего сигнал? Я его чото не использовал. Ещё смущает последовательность описанных действий: Если я правильно понял. Вы хотите дождаться ready от датамувера, а затем посылать ему команду на пересылку? Это неправильно, он без команды не даст реади. Исключение - по сбросу 4 такта. Точно на пару? Должно на 4 судя по эпюрам в моём первом посте. И это не "должно" (как Вы пишете), а "так получилось" (недокументированная фича), т.е. это противоречит логике дальнейшей работы. Поэтому если "должно" соответствует Вашей логике, то она неправильная. Попробуйте разобраться повторно. Если что - спрашивайте конкретные вопросы - постараюсь ответить. Это утверждение верно. Но у меня судя по наблюдениям не всегда полный бёрст вычитывает, иногда меньше почему-то. Может я хочу сильно много. Поставил максимально возможный для установки - 256 слов.
-
Топикстартер: вот тут ещё есть решение (на всякий случай): http://electronix.ru/forum/index.php?showtopic=124706 Остальным недовольным вопросами: а вы в школу почему ходили и учителя слушали, а не сами штудировали учебник алгебры? А в вузе зачем на на лекциях по радиоэлектронике сидели, а не Гоноровского всё это время дома читали? Я конечно понимаю, что есть какая-то разумная грань между чтением доки, гуглением и прямым задаванием вопросов. Но в общем случае, если такую грань не переходить, я не осуждаю задающих вопросы. И сам таковым являюсь. Если токо доки читать, то наша работа будет двигаться в 10 раз медленнее. Зато мы будем офигенными гуру в каждом инструменте. А как только с ним полгодика не поработаем - весь наш гуризм растает. Кому вообще нужен этот гуризм, при том ещё и быстро тающий? Работодателю нужно, чтобы мы быстрее выдали результат. Тут я уже начинал развивать эту тему. Поэтому я зачастую не стесняюсь задать вопрос и получить ответ в разумные сроки, чем неразумное время читать тонны доков в поиске ответов. И если мне зададут вопрос, а объяснение у меня займёт разумное время - я с радостью буду готов помочь человеку сократить время.
-
На этот раз помогло перезагрузить компьютер, запустить сначала Debug конфигурацию через Debug As - System debugger (TCF). Затем отсоединиться (Disconnect), переключиться на Release и выполнить Run As... (GDB). Пока работается - поработаю на этом. Как ещё раз вылезет - посмотрим что ещё делать...
-
aabmail, спасибо за разъяснения. У меня ISE 14.7 и все инструменты из этой версии. Для такого условия понятно. Вы могли бы ещё разъяснить, при каких условиях используется download.bit? Только когда программа не загружается через отладчик, а содержится в самой прошивке? Прошёлся поиском по проекту, у меня файлов *.bmm аж 4: planahead\fft_sp605\fft_sp605.runs\impl_1\module_1_stub.bmm planahead\fft_sp605\fft_sp605.runs\impl_1\module_1_stub_bd.bmm planahead\fft_sp605\fft_sp605.srcs\sources_1\edk\module_1\implementation\module_1.bmm planahead\fft_sp605\fft_sp605.srcs\sources_1\edk\module_1\implementation\module_1_stub.bmm Начал путаться, какие файлы являются исходниками, а какие результатами? При том есть просто module_1_stub, а есть module_1_stub_bd. Вы не знаете, что из каких образуется? При том в папке .srcs лежат такие же файлы, как и в .runs, но меньшего размера. Я посмотрел по размеру, получается, что в SDK_EXPORT попадает файл из .runs. Какая тут логика и взаимосвязь, не в курсе? (Вопрос отчасти связан с тем, что я пытаюсь найти набор файлов, достаточных для хранения в репозитории, из которых потом можно развернуть весь проект). Не помогло...
-
Пока что-то делал, опять перестала запускаться, сейчас такая фигня вылазит: Надоела уже... опять что ли проект пересоздавать... по нескольку раз на дню... должно же быть какое-то решение? Не у меня же одного...
-
Пока пересоздал проект, вроде помогло...
-
Ещё вопросы новичка: у меня сейчас и программа, и все переменные хранятся в DDR. Реально программа у меня скорее всего влезла бы и в блочную память, вместе с переменными. Но есть одно НО. Среди переменных у меня есть несколько массивов по нескольку мегабайт. А в программе используется библиотека xilfatfs доступа к файлам на компакт флешке борды SP-605. В настройках BSP для этой библиотеки я указал большущий размер кэша (иначе считывание происходит почему-то с ошибками). У меня есть самописная корка БПФ, которая очень активно использует DDR. Чтобы повысить быстродействие доступа корки к DDR я на данном этапе отладки хотел бы перенести свою программу вместе с переменными в блочную память, чтобы микроблэйз не лез в DDR за каждой переменной и следующей инструкцией программы и не отнимал время доступа к DDR у моей корки. Кто может подсказать, как, что и где мне нужно настроить, чтобы программа со всеми переменными легла в блочную память, кэш библиотеки xilfatfs лёг в DDR и те гигантские массивы, о которых я писал в начале, тоже остались в DDR (с ними работает только корка, а микроблэйз к ним должен иметь доступ, чтобы прописать адреса в DataMover, а также для последующей небыстрой верификации результата)? Я предполагаю, что мне нужно править линкер скрипт. Но какие конкретно сегменты, что туда прописать? Если бы у меня не было нескольких массивов, которые я бы хотел бы оставить в DDR, и не было бы кэша библиотеки xilfatfs, то я бы и сам решил этот вопрос. А так слишком много тонкостей для новичка. И ещё вопрос новичка: как посмотреть объём программы, влезет ли она и переменные в блочную память?
-
Здравствуйте. Периодически не получается в SDK сделать RUN AS для Release конфигурации, выдаёт ошибку и не запускается. При том это начинается на пустом месте, ни с того ни с сего. Уже 2й раз заловил. Потом мучился-мучился, как-то заработало. Работало-работало, потом перестала. Чото делал-делал, один раз заработало, потом опять не работало... При этом DEBUG AS работает нормально. Программа у меня целиком в DDR, и данные, и код. Вот линкер скрипт: /*******************************************************************/ /* */ /* This file is automatically generated by linker script generator.*/ /* */ /* Version: Xilinx EDK 14.7 EDK_P.20131013 */ /* */ /* Copyright © 2010 Xilinx, Inc. All rights reserved. */ /* */ /* Description : MicroBlaze Linker Script */ /* */ /*******************************************************************/ _STACK_SIZE = DEFINED(_STACK_SIZE) ? _STACK_SIZE : 0x989680; _HEAP_SIZE = DEFINED(_HEAP_SIZE) ? _HEAP_SIZE : 0x5F5E100; /* Define Memories in the system */ MEMORY { microblaze_0_i_bram_ctrl_microblaze_0_d_bram_ctrl : ORIGIN = 0x00000050, LENGTH = 0x00001FB0 mcb_ddr3_S0_AXI_BASEADDR : ORIGIN = 0xA8000000, LENGTH = 0x08000000 } /* Specify the default entry point to the program */ ENTRY(_start) /* Define the sections, and where they are mapped in memory */ SECTIONS { .vectors.reset 0x00000000 : { KEEP (*(.vectors.reset)) } .vectors.sw_exception 0x00000008 : { KEEP (*(.vectors.sw_exception)) } .vectors.interrupt 0x00000010 : { KEEP (*(.vectors.interrupt)) } .vectors.hw_exception 0x00000020 : { KEEP (*(.vectors.hw_exception)) } .text : { *(.text) *(.text.*) *(.gnu.linkonce.t.*) } > mcb_ddr3_S0_AXI_BASEADDR .init : { KEEP (*(.init)) } > mcb_ddr3_S0_AXI_BASEADDR .fini : { KEEP (*(.fini)) } > mcb_ddr3_S0_AXI_BASEADDR .ctors : { __CTOR_LIST__ = .; ___CTORS_LIST___ = .; KEEP (*crtbegin.o(.ctors)) KEEP (*(EXCLUDE_FILE(*crtend.o) .ctors)) KEEP (*(SORT(.ctors.*))) KEEP (*(.ctors)) __CTOR_END__ = .; ___CTORS_END___ = .; } > mcb_ddr3_S0_AXI_BASEADDR .dtors : { __DTOR_LIST__ = .; ___DTORS_LIST___ = .; KEEP (*crtbegin.o(.dtors)) KEEP (*(EXCLUDE_FILE(*crtend.o) .dtors)) KEEP (*(SORT(.dtors.*))) KEEP (*(.dtors)) PROVIDE(__DTOR_END__ = .); PROVIDE(___DTORS_END___ = .); } > mcb_ddr3_S0_AXI_BASEADDR .rodata : { __rodata_start = .; *(.rodata) *(.rodata.*) *(.gnu.linkonce.r.*) __rodata_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .sdata2 : { . = ALIGN(8); __sdata2_start = .; *(.sdata2) *(.sdata2.*) *(.gnu.linkonce.s2.*) . = ALIGN(8); __sdata2_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .sbss2 : { __sbss2_start = .; *(.sbss2) *(.sbss2.*) *(.gnu.linkonce.sb2.*) __sbss2_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .data : { . = ALIGN(4); __data_start = .; *(.data) *(.data.*) *(.gnu.linkonce.d.*) __data_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .got : { *(.got) } > mcb_ddr3_S0_AXI_BASEADDR .got1 : { *(.got1) } > mcb_ddr3_S0_AXI_BASEADDR .got2 : { *(.got2) } > mcb_ddr3_S0_AXI_BASEADDR .eh_frame : { *(.eh_frame) } > mcb_ddr3_S0_AXI_BASEADDR .jcr : { *(.jcr) } > mcb_ddr3_S0_AXI_BASEADDR .gcc_except_table : { *(.gcc_except_table) } > mcb_ddr3_S0_AXI_BASEADDR .sdata : { . = ALIGN(8); __sdata_start = .; *(.sdata) *(.sdata.*) *(.gnu.linkonce.s.*) __sdata_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .sbss (NOLOAD) : { . = ALIGN(4); __sbss_start = .; *(.sbss) *(.sbss.*) *(.gnu.linkonce.sb.*) . = ALIGN(8); __sbss_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .tdata : { __tdata_start = .; *(.tdata) *(.tdata.*) *(.gnu.linkonce.td.*) __tdata_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .tbss : { __tbss_start = .; *(.tbss) *(.tbss.*) *(.gnu.linkonce.tb.*) __tbss_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .bss (NOLOAD) : { . = ALIGN(4); __bss_start = .; *(.bss) *(.bss.*) *(.gnu.linkonce.b.*) *(COMMON) . = ALIGN(4); __bss_end = .; } > mcb_ddr3_S0_AXI_BASEADDR _SDA_BASE_ = __sdata_start + ((__sbss_end - __sdata_start) / 2 ); _SDA2_BASE_ = __sdata2_start + ((__sbss2_end - __sdata2_start) / 2 ); /* Generate Stack and Heap definitions */ .heap (NOLOAD) : { . = ALIGN(8); _heap = .; _heap_start = .; . += _HEAP_SIZE; _heap_end = .; } > mcb_ddr3_S0_AXI_BASEADDR .stack (NOLOAD) : { _stack_end = .; . += _STACK_SIZE; . = ALIGN(8); _stack = .; __stack = _stack; } > mcb_ddr3_S0_AXI_BASEADDR _end = .; } Вот тут кое-какой ответ есть: http://www.xilinx.com/support/answers/45834.html Но мне такой ответ не подходит, т.к. у меня это не всегда не работает, а периодами. И я не хочу, как там советуют, использовать Debug As, мне надо Run As, т.к. конфигурация не Debug, а Release, и инструмент запуска должен быть соответствующий. Я не уверен, но предполагаю, что неправильно конфигурацию Release запускать через Debug As, т.к. может что-то не так работать или быстродействие будет ниже (мне крайне важно быстродействие при обмене по DDR, заметил, что оно хуже для конфигурации Debug и запуска через Debug As примерно в 2 раза). Если я неправ, то поправьте, пожалуйста. Я новичок во встраиваемых системах, поэтому вполне допускаю, что я просто "не умею их готовить". Заодно вопрос почти по теме (возможно ещё и в этом загвоздка): когда я загружаю прошивку, я могу указать бинарник либо system.bit, либо download.bit. И *.bmm файл могу указывать, а могу и нет. Я так понял, что в *.bmm лежит дамп того, что требуется залить в блочную память. Если у меня все сегменты расположены в DDR, то и *.bmm мне вообще не нужен? Как вообще здесь правильно надо какие файлы подставлять?
-
Здравствуйте. Ни у кого такого не было, чтобы Planahead в связке с XPS внезапно начал давать ошибку синтеза, мол, негде брать внутренности module_1: При том на картинке видно, что я его ещё дополнительно "мордой тыкнул" в ngc-шку от искомых внутренностей - бесполезно. Перегенерировать проект XPS не помогает. Коллеги у меня сталкивались с этим, сказали, что проще создать новый проект, так всё работает, как и раньше, без проблем. Я всё же хотел бы докопаться, кто же виноват и как поправить. Ни у кого такого не было? Одно из возможных предположений, что я сразу после начала синтеза захотел его отменить и нажал на закрытие модального диалогового окна (или как там его), которое появляется в первоначальный момент запуска синтеза, там пишется что-то типа синтезирую ядро XPS (оно на самом деле уже заранее сгенерировано).
-
Копию нужно либо делать автоматически какой-то прогой. Если вручную - то можно допустить следующую роковую ошибку - забыть сделать копию перед манипуляциями )))))
-
Большое спасибо
-
Спасибо за подсказки. Правда, я извиняюсь, я не очень понял, где эта команда находится purge all. Я использую Planahead и XPS, а также SDK. В SKD я видел clean project. Гугл тоже навскидку ничего конкретного не подсказал. Далее Вы пишете: А не потрутся ли мои правки при следующем экспорте? Я пока добавил базовый адрес своего таймера не в xparameters.h, а в свой самодельный файл, т.к. боялся, что затрёт. Ну и эти пляски я видимо проделаю, когда узнаю, где там пружить ))) Как всегда сам спросил, сам отвечу (Golikov A. в любом случае спасибо). Проблема была в том, что мне нужно было вручную в BSP Settings установить другое значение для таймера: Если ставить generic, то в xparameters.h добавит базовый адрес, но картинка из первого поста не изменится. Если ставить tmrctr, то к этому добавится дока и пример на картинке из первого поста.
-
Тренируюсь на борде SP-605. Planahead, XPS. Добавил в работающий проект корку axi-timer из стандартного репозитория. Экспортнул в SDK, как обычно. Проблема в том, что не вижу в файле xparameters.h никакого упоминания об этом таймере. Хотя там есть упоминания даже о моих самодельных корках. Таймер - это не самодельная недоделка, так что уж для готовых корок то должно быть всё прописано правильно. При том нет ни ссылки на датащит, ни примеров: Касаемо базовых адресов в xparameters.h - это я пока временно обошёл, прописав ручками. Но хотел ещё стандартными драйверами (функциями) для прогрузки регистров таймера воспользоваться - даже не знаю теперь где это искать. Тоже пока буду ручками напрямую регистры прогружать. Так что жить можно, но хотелось бы знать, что нажать, что проделать, чтобы в xparameters.h появилось всё как надо и примеры и драйвера появились.
-
Да, неприятный косяк, но, как я понимаю, с этим все смирились. Нужно просто на процессе правой кнопкой нажать и дать команду Force Process Up-to-Date. Косяк в том, что иногда допускаешь ошибку - забываешь перед какими-то действиями проделать этот обходной манёвр, и тогда всё перезапускается с нуля. Когда полная имплементация длится порядка суток это становится роковой ошибкой )))
-
Здравствуйте. Подскажите, пожалуйста, как в скрипте Matlab узнать папку, в которой этот самый скрипт находится? Внутри скрипта используются относительные пути в предположении, что скрипт находится в текущей папке, т.к. он когда-то был главным скриптом проекта. Но потребовалось этот скрипт вызывать из другого скрипта другого проекта. И теперь текущая папка указывает на положение вызывающего скрипта, соответственно в вызываемом не срабатывают пути. Нужно как-то сделать так, чтобы независимо от текущей папки, пути внутри скрипта были указаны относительно положения файла этого самого скрипта.
-
Всё, признался он, что не документирована эта фича в старой версии ))
-
А, нет, потом дописали, мол, глаза разуйте, всё документировано. Правда не в той версии датамувера. Но всё же это говорит о том, что им видимо уже на это жаловались, и они включили описание такого поведения для следующих версий датамувера. Но у меня то предыдущая версия. И это версия датамувера, а не версия документа. Поэтому я не могу просто взять и читать документацию на самую свежую версию датамувера, т.к. в общем случае поведение разных версий датамуверов может быть разное, и то, что документировано в последней версии, может чисто физически не иметь место в предыдущих версиях... Индусы не понимают что ли, что эту фичу нужно документировать не только для последней версии датамувера, а и для всех ранних, где это наблюдается? )))
-
Готово: http://forums.xilinx.com/t5/Embedded-Proce...ter/td-p/550684 Как выяснилось, это не баг, а недокументированная фича ))) Т.е. с этим жить можно, просто надо знать, как обходить.
-
Короче за этим доступом к файлам флешки нужен глаз да глаз. То не виснет, но считывает, а внутри где-то ошибки. Намучился. Пришлось городить контрольную сумму. И, если не сошлось, считывать заново... Пока такой workarround. Как просто вылечить -не нашёл, просто обошёл. Этим удовлетворился, больше копать не буду, пока такого решения достаточно.
-
немного локализовал проблему: причина в длине файлов (несколько МБ), точнее в длине считывания. Если поставить 256 байтов на считывание - то не подвисает. Но и прошивка как-то влияет: на прошлой прошивке любая длина считывания не подвисает. Текущую прошивку на всякий случай пересобрал 2й раз - не помогло. Тайминги все выполняются, это тестовая борда SP-605
-
Внезапно появились проблемы с чтением флешки по указанным выше функциям. Даю команду bytes_read_x = sysace_fread(x_buf, 1, sizeof(x_buf), ps); Она может выполняться до бесконечности. Нажимаю на паузу, смотрю, где застряла - почти всегда застревает на функции XSysAce_WaitForLock(BaseAddress): int XSysAce_ReadSector(u32 BaseAddress, u32 SectorId, u8 *BufferPtr) { int NumRead; // Request and wait for the lock XSysAce_WaitForLock(BaseAddress); ... Буквально на прошлой неделе всё работало, тут ни с того ни с сего перестало. Из изменений в прошивке - добавил только новые сигналы к Chipscope Analyzer и пересобрал. Больше ничего... Получается, что не может получить монопольный доступ к флешке... Кто-нибудь сталкивался с таким? Как лечить?
-
Спасибо. Правда в его потоке слов непонятно, как он это победил.
-
Покажите плиз Извините, не понял вопроса. Данные на мастере стрима уже готовы, ждут, пока им дадут реди. Реди даёт датамувер. Но датамуверу ещё не дали команду, он находился в сбросе. Затем сброс убрали, а он уже сразу же скушал 4 слова, при том без какой-либо команды. Т.е. реади 4 такта держал.