Jump to content

    

doom13

Свой
  • Content Count

    1571
  • Joined

  • Last visited

Everything posted by doom13


  1. Пока проблему вижу в Xilinx SDK (может быть можно как-то настроить?). В настройках проекта в дефолтном состоянии установлены флаги для компилятора -ffunction-sections -fdata-sections и линкера --gc-sections (Enable garbage collector), которые и приводят к данной проблеме. Для кода int TestFunction(int x1, int x2); int main() { while(1) { } return 0; } int TestFunction(int x1, int x2) { return x1 + x2; } c установленными в опциях проекта галками Enable garbage collector получаем следующее в elf-файле Disassembly of section .vectors.reset: 00000000 <_start>: } return 0; } int TestFunction(int x1, int x2) { 0: b0000000 imm 0 4: b8080050 brai 80 // 50 <_start1> Disassembly of section .vectors.sw_exception: 00000008 <_vector_sw_exception>: 8: b0000000 imm 0 c: b808095c brai 2396 // 95c <_exception_handler> Disassembly of section .vectors.interrupt: 00000010 <_vector_interrupt>: 10: b0000000 imm 0 return x1 + x2; 14: b80809d0 brai 2512 // 9d0 <__interrupt_handler> Disassembly of section .vectors.hw_exception: 00000020 <_vector_hw_exception>: } 20: b0000000 imm 0 24: b80802f0 brai 752 // 2f0 <_hw_exception_handler> Disassembly of section .text: если убрать разрешение Enable garbage collector, то всё сразу круто (за исключением размера бинарника) Disassembly of section .vectors.reset: 00000000 <_start>: 0: b0000000 imm 0 4: b8080050 brai 80 // 50 <_start1> Disassembly of section .vectors.sw_exception: 00000008 <_vector_sw_exception>: 8: b0000000 imm 0 c: b808099c brai 2460 // 99c <_exception_handler> Disassembly of section .vectors.interrupt: 00000010 <_vector_interrupt>: 10: b0000000 imm 0 14: b8080a00 brai 2560 // a00 <__interrupt_handler> Disassembly of section .vectors.hw_exception: 00000020 <_vector_hw_exception>: 20: b0000000 imm 0 24: b8080330 brai 816 // 330 <_hw_exception_handler> Disassembly of section .text: Криво сформированный elf-файл и приводит к тому, что SDK (если в Debug Configurations поставить галку Stop at program entry) отображает выполнение кода, который не должен был выполняться (реально выполняется startup sequence crt0.S). Как исправить - вопрос открытый.
  2. Нашёл такую особенность, если в настройках компилятора установить Debug Level -> None (-g0), то картинка меняется. Баг SDK???
  3. Приветствую. При старте программы MicroBlaze и остановке на main() наблюдаю непонятное содержимое в стеке вызовов. Может кто сталкивался с подобным поведением и с чем оно связано? Думал это связано с С++ проектом, но нашёл аналогичную проблему и для проекта на С тут. Использую Vivado/SDK 2018.2, думал ситуация изменится при использовании Vitis 2020.1, но не помогло.
  4. Приветствую. Не могу найти в какой доке можно почитать про атрибуты для памяти, которые устанавливает: void Xil_SetTlbAttributes(UINTPTR Addr, u64 attrib); 1. Хочу выделить некэшируемую область памяти. 2. Хочу ограничить возможность записи в определённые области памяти.
  5. Так для анализа состояния пина много кода и не потребуется.
  6. Спасибо, попробую. По старту синтеза наверное будет правильнее чем по открытию проекта.
  7. для hook_open_project добавил cd $prj_dir, дальше получилось стартануть скрипт спасибо
  8. Можно пример, как стартануть скрипт из папки проекта по нажатию кнопки синтеза Такое set_property STEPS.SYNTH_DESIGN.TCL.PRE {C:/Data/report.tcl} [get_runs synth_1] не предлагать, спасибо.
  9. Попробовал так set_property STEPS.SYNTH_DESIGN.TCL.PRE "version/pre_synth.tcl" [get_runs synth_1] синтез погнал, реакции ноль, если явно указать полный путь через гуи - работает.
  10. Как из настроек проекта теперь достучаться к ::env(PWD), чтоб стартануть свой скрипт из папки проекта?
  11. Так он же целых пять минут сочинялся) set_param xicom.use_bitstream_version_check false puts "Script is processing" ### proc hook_proc {name hook_name} { if {[llength [namespace which {${name}_}]]==0} { rename ::${name} ::${name}_ rename ${hook_name} ::${name} } } ### proc hook_open_project args { puts "Hook of open_project" # processing input options for {set i 0} {$i < [llength $args]} {incr i} { set option [string trim [lindex $args $i]] switch -regexp -- $option { "-part" { incr i } "-read_only" { } "-quiet" { } "-verbose" { } default { # is incorrect switch specified? if { [regexp {^-} $option] } { send_msg_id Vivado-projutils-001 ERROR "Unknown option '$option', please type 'open_project -help' for usage info.\n" return } set prj_file [file normalize $option] } } } set prj_dir [file dirname $prj_file] set ::env(PWD) $prj_dir uplevel 1 ::open_project_ $args puts "Script is done!!!" } hook_proc "open_project" "hook_open_project" Пытаюсь разобраться, как оно работает, получаю лог *** Running vivado with args -log xczu9eg.vds -m64 -product Vivado -mode batch -messageDb vivado.pb -notrace -source xczu9eg.tcl ****** Vivado v2018.2 (64-bit) **** SW Build 2258646 on Thu Jun 14 20:02:38 MDT 2018 **** IP Build 2256618 on Thu Jun 14 22:10:49 MDT 2018 ** Copyright 1986-2018 Xilinx, Inc. All Rights Reserved. Sourcing tcl script '/home/andrei/Programs/Xilinx/Vivado/2018.2/scripts/Vivado_init.tcl' Script is processing source xczu9eg.tcl -notrace WARNING: [Common 17-1361] You have specified a new message control rule that is equivalent to an existing rule with attributes ' -ruleid {11} -id {[BD 41-1271]} -suppress '. The existing rule will be replaced. WARNING: [Common 17-1361] You have specified a new message control rule that is equivalent to an existing rule with attributes ' -ruleid {10} -id {[BD 41-1306]} -suppress '. The existing rule will be replaced. WARNING: [Common 17-1361] You have specified a new message control rule that is equivalent to an existing rule with attributes ' -ruleid {3} -id {[BD 41-1271]} -suppress '. The existing rule will be replaced. WARNING: [Common 17-1361] You have specified a new message control rule that is equivalent to an existing rule with attributes ' -ruleid {4} -id {[BD 41-1306]} -suppress '. The existing rule will be replaced. WARNING: [Common 17-1361] You have specified a new message control rule that is equivalent to an existing rule with attributes ' -ruleid {5} -id {[BD 41-1271]} -suppress '. The existing rule will be replaced. WARNING: [Common 17-1361] You have specified a new message control rule that is equivalent to an existing rule with attributes ' -ruleid {7} -id {[BD 41-1271]} -suppress '. The existing rule will be replaced. WARNING: [Common 17-1361] You have specified a new message control rule that is equivalent to an existing rule with attributes ' -ruleid {6} -id {[BD 41-1306]} -suppress '. The existing rule will be replaced. add_files: Time (s): cpu = 00:00:07 ; elapsed = 00:00:07 . Memory (MB): peak = 2551.223 ; gain = 920.449 ; free physical = 1915 ; free virtual = 11697 Command: synth_design -top xczu9eg -part xczu9eg-ffvb1156-2-i Starting synth_design Attempting to get a license for feature 'Synthesis' and/or device 'xczu9eg' INFO: [Common 17-349] Got license for feature 'Synthesis' and/or device 'xczu9eg' INFO: Launching helper process for spawning children vivado processes INFO: Helper process launched with PID 1454 Что-то не так? hook_proc не вызывался Да, есть такое, спасибо.
  12. Форматирование какое-то видно было неправильное, ещё раз скопировал - не ругается. Но значение pwd не изменилось, на дефолтную директорию ссылается.
  13. Перед стартом синтеза, скрипт должен сгенерить константы для контроля версии. Я попробовал добавить, но всё не так просто) cd [get_property directory [current_project]]
  14. Вопрос в скриптах. Нужно опцию tcl.pre с относительным путём прописать.
  15. Приветствую. Возможно ли при открытии проекта в Vivado запустить TCL скрипт. Хочу, чтоб при при открытии проекта переменная PWD указывала на директорию проекта (без привязки к конкретной директории и ПК).
  16. Сделал аналогично. Не сразу нашёл эту доку, больше смотрел по ZynqMP, а там предлагают из FSBL делать переброс на рабочую прошивку, работает, но не понял зачем такие сложности, если можно просто поменять их местами. В моём случае самая обидная ситуация - залить прошивку с нерабочим Ethernet. Используется FreeRTOS и при обновлении hdf-файла настройки bsp всё время сбрасываются. Если не проконтролировать, высока вероятность получить нерабочее устройство. Хороший вариант со счётчиком загрузок, вообще думали в новой версии железа вытащить порт процессора, по которому загрузчик определял бы рабочий или аварийный режим запуска.
  17. LwIP link up/down

    Спасибо, с этим понятно. Думал так делать, но пока пытаюсь понять. есть ли стандартная опция/возможность. Если кабель дёргать то сообщения в stdout кидает (если не ошибаюсь), поэтому решил, что оно само мониторит состояние сети и возможно есть какая-то возможность привязаться к данному событию. //netif.h #if LWIP_NETIF_LINK_CALLBACK /** This function is called when the netif link is set to up or down */ netif_status_callback_fn link_callback; #endif /* LWIP_NETIF_LINK_CALLBACK */ #if LWIP_NETIF_LINK_CALLBACK void netif_set_link_callback(struct netif *netif, netif_status_callback_fn link_callback); #endif /* LWIP_NETIF_LINK_CALLBACK */ Такое вот нахожу
  18. LwIP link up/down

    Приветствую. Есть ли какое-то событие/семафор/др. при срабатывании link up/down? Хочу сделать, чтобы задача спала, пока нет линка или засыпала, когда пропал.
  19. Что-то не могу повторить полученный ранее результат. Вопрос где хранится timestamp образа и как его туда поместить? Для формирования boot.bin используется bif-файл с содержимым: //arch = zynqmp; split = false; format = BIN the_ROM_image: { [pskfile]/home/user/workspace/xczu9eg/boot/psk0.pem [sskfile]/home/user/workspace/xczu9eg/boot/ssk0.pem [auth_params]spk_id = 0x00000000; ppk_select = 0 [fsbl_config]a53_x64, bh_auth_enable [bootloader, authentication = rsa]/home/user/workspace/xczu9eg/xczu9eg.sdk/fsbl/Debug/fsbl.elf [pmufw_image]/home/user/workspace/xczu9eg/xczu9eg.sdk/pmufw/Debug/pmufw.elf [authentication = rsa, destination_device = pl]/home/user/workspace/xczu9eg/xczu9eg.runs/impl_1/xczu9eg.bit [authentication = rsa, destination_cpu = a53-0, exception_level = el-3]/home/user/workspace/xczu9eg/xczu9eg.sdk/app_a53_0/Debug/app_a53_0.elf [authentication = rsa, destination_cpu = a53-1, exception_level = el-3]/home/user/workspace/xczu9eg/xczu9eg.sdk/app_a53_1/Debug/app_a53_1.elf }
  20. Уже нет убута и Linux. Нужно чтобы система позволяла безопасно обновить ПО в QSPI. Пока поддерживает перепрошивку QSPI, но если произошёл сбой в процессе перепрошивки QSPI, то система превращается в кирпич. Нашёл, что есть такая фишка, как MultiBoot (что успешно реализовано для платы с Kintex UltraScale+), но не совсем понимаю, как правильно реализовать его поддержку в случае ZynqMP. Пока протестил, что если положить две прошивки (первая golden image, которая никогда не перезаписывается, и вторая, которая будет обновляться), то будет стартовать более новую версию прошивки, которая и обновлялась. Но, если при перепрошивке рабочего ПО (второго образа) произошёл сбой, могу получить вариант с частично испорченной прошивкой. Система пытается её загрузить, сбрасывается, и так по кругу (или вариант, когда стартует битую прошивку и остаётся в нерабочем состоянии). Golden image никогда не запускается. Вот пытаюсь понять, что тут делаю неправильно и как заставить систему остаться в режиме golden image. Всю систему грузит только FSBL. Читал xilinx-wiki по реализации MultiBoot. Но так и не понял, что они тут советуют. Предлагается перезаписать мултибут регистр и делать сброс системы XFsbl_UpdateMultiBoot while (FsblStage<=XFSBL_STAGE_DEFAULT) { switch (FsblStage) { case XFSBL_STAGE1: { /** * Initialize the system */ FsblStatus = XFsbl_Initialize(&FsblInstance); if (XFSBL_SUCCESS != FsblStatus) { FsblStatus += XFSBL_ERROR_STAGE_1; FsblStage = XFSBL_STAGE_ERR; } else { /** * * Include the code for FSBL time measurements * Initialize the global timer and get the value */ FsblStage = XFSBL_STAGE2; } /** * 24.12.2019 * Edited by Andrei Hres * This code support MultiBoot option. * Application image (IMAGE1) is placed at address 0x04000000. * BootROM will try to find valid boot image at every 32kB offset. * Offset 2048 - start boot at 32768*2048 = 0x04000000 */ XFsbl_UpdateMultiBoot(2048); }break; static void XFsbl_UpdateMultiBoot(u32 MultiBootValue) { u32 RegValue; XFsbl_Out32(CSU_CSU_MULTI_BOOT, MultiBootValue); /** * Due to a bug in 1.0 Silicon, PS hangs after System Reset if RPLL is used. * Hence, just for 1.0 Silicon, bypass the RPLL clock before giving * System Reset. */ if (XGetPSVersion_Info() == (u32)XPS_VERSION_1) { RegValue = XFsbl_In32(CRL_APB_RPLL_CTRL) | CRL_APB_RPLL_CTRL_BYPASS_MASK; XFsbl_Out32(CRL_APB_RPLL_CTRL, RegValue); } /* make sure every thing completes */ dsb(); isb(); if(FsblInstance.ResetReason != XFSBL_APU_ONLY_RESET) { /* Soft reset the system */ XFsbl_Printf(DEBUG_GENERAL,"Performing System Soft Reset\n\r"); RegValue = XFsbl_In32(CRL_APB_RESET_CTRL); XFsbl_Out32(CRL_APB_RESET_CTRL, RegValue|CRL_APB_RESET_CTRL_SOFT_RESET_MASK); /* wait here until reset happens */ while(1) { ; } } else { for(;;){ /*We should not be here*/ } } return; } Попробовал, зациклил систему на старте FSBL и сбросе.
  21. Загрузка с QSPI. Смотрю, что умеет стартануть более свежую прошиву, которая лежит во flash. Если эту более свежую частично испортить, то можно получить нерабочую систему без возможности её восстановления. Вопрос, как сделать так, чтоб при сбое во время обновления конфигурационной QSPI система могла всегда быть восстановлена?
  22. Приветствую. Поделитесь опытом по реализации MultiBoot для ZynqMP. Интересует сам принцип механизма. Правильно ли понимаю, что тут нет возможности перебросить загрузчик на нужный адрес, будет искать валидный хедер через каждые 32кБ? Только так? Спасибо.