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

Krys

Свой
  • Постов

    2 052
  • Зарегистрирован

  • Посещение

Весь контент Krys


  1. Нашёл ещё парочку подсказок: 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 Мне правда они не помогли, но может кому-то будет польза...
  2. Решил для себя проблему прогрузки больших данных так: Я в начале спрашивал про flash, но в конечном счёте данные мне нужны были в DDR. Таким действием я напрямую в DDR и кидаю данные перед каждым стартом программы. Удобно. Знал бы сразу... а то уже реализовал чтение с CompactFlash (см. ссылку на тему выше), времени кучу потратил, пока боролся с её багами... Скорость прогрузки примерно та же. Достоинство - грузит с первого раза (с флэшки почему-то часто ошибки чтения были, приходилось перечитывать), не потребляет программное место и не требует места в памяти данных под кэш.
  3. Ну лучше бы Вам конкретизировать вопрос )) Моя корка на выходе имеет фифошку по идеологии стрима (по желанию можно взять готовую AXI-Stream FIFO из CoreGen'а, но у меня обычная, т.к. необходимо конвертировать разрядность, а та не умеет. Главное любая из них должна быть в режиме FWFT). Ну у меня тоже DDR, всё точно так же. Единственное: tkeep это для чего сигнал? Я его чото не использовал. Ещё смущает последовательность описанных действий: Если я правильно понял. Вы хотите дождаться ready от датамувера, а затем посылать ему команду на пересылку? Это неправильно, он без команды не даст реади. Исключение - по сбросу 4 такта. Точно на пару? Должно на 4 судя по эпюрам в моём первом посте. И это не "должно" (как Вы пишете), а "так получилось" (недокументированная фича), т.е. это противоречит логике дальнейшей работы. Поэтому если "должно" соответствует Вашей логике, то она неправильная. Попробуйте разобраться повторно. Если что - спрашивайте конкретные вопросы - постараюсь ответить. Это утверждение верно. Но у меня судя по наблюдениям не всегда полный бёрст вычитывает, иногда меньше почему-то. Может я хочу сильно много. Поставил максимально возможный для установки - 256 слов.
  4. Топикстартер: вот тут ещё есть решение (на всякий случай): http://electronix.ru/forum/index.php?showtopic=124706 Остальным недовольным вопросами: а вы в школу почему ходили и учителя слушали, а не сами штудировали учебник алгебры? А в вузе зачем на на лекциях по радиоэлектронике сидели, а не Гоноровского всё это время дома читали? Я конечно понимаю, что есть какая-то разумная грань между чтением доки, гуглением и прямым задаванием вопросов. Но в общем случае, если такую грань не переходить, я не осуждаю задающих вопросы. И сам таковым являюсь. Если токо доки читать, то наша работа будет двигаться в 10 раз медленнее. Зато мы будем офигенными гуру в каждом инструменте. А как только с ним полгодика не поработаем - весь наш гуризм растает. Кому вообще нужен этот гуризм, при том ещё и быстро тающий? Работодателю нужно, чтобы мы быстрее выдали результат. Тут я уже начинал развивать эту тему. Поэтому я зачастую не стесняюсь задать вопрос и получить ответ в разумные сроки, чем неразумное время читать тонны доков в поиске ответов. И если мне зададут вопрос, а объяснение у меня займёт разумное время - я с радостью буду готов помочь человеку сократить время.
  5. На этот раз помогло перезагрузить компьютер, запустить сначала Debug конфигурацию через Debug As - System debugger (TCF). Затем отсоединиться (Disconnect), переключиться на Release и выполнить Run As... (GDB). Пока работается - поработаю на этом. Как ещё раз вылезет - посмотрим что ещё делать...
  6. 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. Какая тут логика и взаимосвязь, не в курсе? (Вопрос отчасти связан с тем, что я пытаюсь найти набор файлов, достаточных для хранения в репозитории, из которых потом можно развернуть весь проект). Не помогло...
  7. Пока что-то делал, опять перестала запускаться, сейчас такая фигня вылазит: Надоела уже... опять что ли проект пересоздавать... по нескольку раз на дню... должно же быть какое-то решение? Не у меня же одного...
  8. Ещё вопросы новичка: у меня сейчас и программа, и все переменные хранятся в DDR. Реально программа у меня скорее всего влезла бы и в блочную память, вместе с переменными. Но есть одно НО. Среди переменных у меня есть несколько массивов по нескольку мегабайт. А в программе используется библиотека xilfatfs доступа к файлам на компакт флешке борды SP-605. В настройках BSP для этой библиотеки я указал большущий размер кэша (иначе считывание происходит почему-то с ошибками). У меня есть самописная корка БПФ, которая очень активно использует DDR. Чтобы повысить быстродействие доступа корки к DDR я на данном этапе отладки хотел бы перенести свою программу вместе с переменными в блочную память, чтобы микроблэйз не лез в DDR за каждой переменной и следующей инструкцией программы и не отнимал время доступа к DDR у моей корки. Кто может подсказать, как, что и где мне нужно настроить, чтобы программа со всеми переменными легла в блочную память, кэш библиотеки xilfatfs лёг в DDR и те гигантские массивы, о которых я писал в начале, тоже остались в DDR (с ними работает только корка, а микроблэйз к ним должен иметь доступ, чтобы прописать адреса в DataMover, а также для последующей небыстрой верификации результата)? Я предполагаю, что мне нужно править линкер скрипт. Но какие конкретно сегменты, что туда прописать? Если бы у меня не было нескольких массивов, которые я бы хотел бы оставить в DDR, и не было бы кэша библиотеки xilfatfs, то я бы и сам решил этот вопрос. А так слишком много тонкостей для новичка. И ещё вопрос новичка: как посмотреть объём программы, влезет ли она и переменные в блочную память?
  9. Здравствуйте. Периодически не получается в 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 мне вообще не нужен? Как вообще здесь правильно надо какие файлы подставлять?
  10. Здравствуйте. Ни у кого такого не было, чтобы Planahead в связке с XPS внезапно начал давать ошибку синтеза, мол, негде брать внутренности module_1: При том на картинке видно, что я его ещё дополнительно "мордой тыкнул" в ngc-шку от искомых внутренностей - бесполезно. Перегенерировать проект XPS не помогает. Коллеги у меня сталкивались с этим, сказали, что проще создать новый проект, так всё работает, как и раньше, без проблем. Я всё же хотел бы докопаться, кто же виноват и как поправить. Ни у кого такого не было? Одно из возможных предположений, что я сразу после начала синтеза захотел его отменить и нажал на закрытие модального диалогового окна (или как там его), которое появляется в первоначальный момент запуска синтеза, там пишется что-то типа синтезирую ядро XPS (оно на самом деле уже заранее сгенерировано).
  11. Копию нужно либо делать автоматически какой-то прогой. Если вручную - то можно допустить следующую роковую ошибку - забыть сделать копию перед манипуляциями )))))
  12. Спасибо за подсказки. Правда, я извиняюсь, я не очень понял, где эта команда находится purge all. Я использую Planahead и XPS, а также SDK. В SKD я видел clean project. Гугл тоже навскидку ничего конкретного не подсказал. Далее Вы пишете: А не потрутся ли мои правки при следующем экспорте? Я пока добавил базовый адрес своего таймера не в xparameters.h, а в свой самодельный файл, т.к. боялся, что затрёт. Ну и эти пляски я видимо проделаю, когда узнаю, где там пружить ))) Как всегда сам спросил, сам отвечу (Golikov A. в любом случае спасибо). Проблема была в том, что мне нужно было вручную в BSP Settings установить другое значение для таймера: Если ставить generic, то в xparameters.h добавит базовый адрес, но картинка из первого поста не изменится. Если ставить tmrctr, то к этому добавится дока и пример на картинке из первого поста.
  13. Тренируюсь на борде SP-605. Planahead, XPS. Добавил в работающий проект корку axi-timer из стандартного репозитория. Экспортнул в SDK, как обычно. Проблема в том, что не вижу в файле xparameters.h никакого упоминания об этом таймере. Хотя там есть упоминания даже о моих самодельных корках. Таймер - это не самодельная недоделка, так что уж для готовых корок то должно быть всё прописано правильно. При том нет ни ссылки на датащит, ни примеров: Касаемо базовых адресов в xparameters.h - это я пока временно обошёл, прописав ручками. Но хотел ещё стандартными драйверами (функциями) для прогрузки регистров таймера воспользоваться - даже не знаю теперь где это искать. Тоже пока буду ручками напрямую регистры прогружать. Так что жить можно, но хотелось бы знать, что нажать, что проделать, чтобы в xparameters.h появилось всё как надо и примеры и драйвера появились.
  14. Да, неприятный косяк, но, как я понимаю, с этим все смирились. Нужно просто на процессе правой кнопкой нажать и дать команду Force Process Up-to-Date. Косяк в том, что иногда допускаешь ошибку - забываешь перед какими-то действиями проделать этот обходной манёвр, и тогда всё перезапускается с нуля. Когда полная имплементация длится порядка суток это становится роковой ошибкой )))
  15. Здравствуйте. Подскажите, пожалуйста, как в скрипте Matlab узнать папку, в которой этот самый скрипт находится? Внутри скрипта используются относительные пути в предположении, что скрипт находится в текущей папке, т.к. он когда-то был главным скриптом проекта. Но потребовалось этот скрипт вызывать из другого скрипта другого проекта. И теперь текущая папка указывает на положение вызывающего скрипта, соответственно в вызываемом не срабатывают пути. Нужно как-то сделать так, чтобы независимо от текущей папки, пути внутри скрипта были указаны относительно положения файла этого самого скрипта.
  16. А, нет, потом дописали, мол, глаза разуйте, всё документировано. Правда не в той версии датамувера. Но всё же это говорит о том, что им видимо уже на это жаловались, и они включили описание такого поведения для следующих версий датамувера. Но у меня то предыдущая версия. И это версия датамувера, а не версия документа. Поэтому я не могу просто взять и читать документацию на самую свежую версию датамувера, т.к. в общем случае поведение разных версий датамуверов может быть разное, и то, что документировано в последней версии, может чисто физически не иметь место в предыдущих версиях... Индусы не понимают что ли, что эту фичу нужно документировать не только для последней версии датамувера, а и для всех ранних, где это наблюдается? )))
  17. Готово: http://forums.xilinx.com/t5/Embedded-Proce...ter/td-p/550684 Как выяснилось, это не баг, а недокументированная фича ))) Т.е. с этим жить можно, просто надо знать, как обходить.
  18. Короче за этим доступом к файлам флешки нужен глаз да глаз. То не виснет, но считывает, а внутри где-то ошибки. Намучился. Пришлось городить контрольную сумму. И, если не сошлось, считывать заново... Пока такой workarround. Как просто вылечить -не нашёл, просто обошёл. Этим удовлетворился, больше копать не буду, пока такого решения достаточно.
  19. немного локализовал проблему: причина в длине файлов (несколько МБ), точнее в длине считывания. Если поставить 256 байтов на считывание - то не подвисает. Но и прошивка как-то влияет: на прошлой прошивке любая длина считывания не подвисает. Текущую прошивку на всякий случай пересобрал 2й раз - не помогло. Тайминги все выполняются, это тестовая борда SP-605
  20. Внезапно появились проблемы с чтением флешки по указанным выше функциям. Даю команду 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 и пересобрал. Больше ничего... Получается, что не может получить монопольный доступ к флешке... Кто-нибудь сталкивался с таким? Как лечить?
  21. Покажите плиз Извините, не понял вопроса. Данные на мастере стрима уже готовы, ждут, пока им дадут реди. Реди даёт датамувер. Но датамуверу ещё не дали команду, он находился в сбросе. Затем сброс убрали, а он уже сразу же скушал 4 слова, при том без какой-либо команды. Т.е. реади 4 такта держал.
×
×
  • Создать...