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

AlexRayne

Участник
  • Постов

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

  • Посещение

  • Победитель дней

    1

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


  1. 1) это читаемо и явно для каждого поля. 2) если у вас поля битовые, или структурка константная, или она в регистрах/волатилях - такое присваивание самое простое. Иначе надо городить временные переменные.
  2. я ж написал - мне нужна отдельная секция. иначе искать инструмент который может переписать символ в эльфе, я такого не ведаю Я вас не про отдельное place-правило спрашивал. А про выделение секции .checksum в блок CHECKSUM. Зачем? если не положить секцию в блок - линкер её кладет в первое подходящее правило, а на втором выдает ошибку множественного подходящего патерна. как исключить секцию из правила не ведаю.
  3. я ж показал листинг "P3": 0x2 CHECKSUM 0x2'e884 0x2 <Block> .checksum zero 0x2'e884 0x2 crc_fw.o [9] - 0x2'e886 0x2 отдельным правилом линкер заводит отдельную секцию P3 для checksum. эту секцию я потом могу менять
  4. это секция объектного файла. А в итоговом elf все секции объектов кидаются в секции elf - для rw - своя, для ro - своя. и вот для cheksum - получается своя. Их именование перпендикулярно тому что мы привыкли видеть в линкере - он както по своему именует: "A0": place at address 0x0 { ro section .intvec }; "A1": place at address 0xc0 { ro section .Reset_Handler_text }; "P1": place in [from 0x0 to 0x7'ffff] { ro }; define block CSTACK with size = 1K, alignment = 8 { }; define block HEAP with size = 1K, alignment = 8 { }; "P2": place in [from 0x2000'0000 to 0x2000'ffff] { rw, block CSTACK, block HEAP }; define block CHECKSUM { ro section .checksum }; "P3": place in [from 0x0 to 0x7'ffff] { last block CHECKSUM }; Вот эти An, Pn - это и есть секции в итоговом elf Классические gnu тулы могут конешн видеть символы, но исходных секций объектов - их просто нет, а есть секции итогового образа. Еслиб тулы позволяли заменять содержимое символов - небыло б проблем. Но objcopy умеет менять только содержимое целой секции, поэтому checksum мне надо отдельно
  5. только оно положило в конец секции c ro, а мне надо отдельной секцией блок CHECKSUM, поэтому я его отдельным правилом и добавлял
  6. вот мой icf ... define block CHECKSUM { ro section .checksum }; initialize by copy { readwrite }; do not initialize { section .noinit }; keep { section .checksum* }; place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; place at address mem:__Reset_Handler_text_start__ { readonly section .Reset_Handler_text }; place in ROM_region { readonly }; place in RAM_region { readwrite, block CSTACK, block HEAP }; place in ROM_region { last block CHECKSUM }; а линкер отчитывается так: ******************************************************************************* *** PLACEMENT SUMMARY *** "A0": place at address 0x0 { ro section .intvec }; "A1": place at address 0xc0 { ro section .Reset_Handler_text }; "P1": place in [from 0x0 to 0x7'ffff] { ro }; define block CSTACK with size = 1K, alignment = 8 { }; define block HEAP with size = 1K, alignment = 8 { }; "P2": place in [from 0x2000'0000 to 0x2000'ffff] { rw, block CSTACK, block HEAP }; define block CHECKSUM { ro section .checksum }; "P3": place in [from 0x0 to 0x7'ffff] { last block CHECKSUM }; initialize by copy { rw }; keep { section .checksum* }; "P1", part 1 of 2: .text ... .rodata ... "P3": 0x2 CHECKSUM 0x2'e884 0x2 <Block> .checksum zero 0x2'e884 0x2 crc_fw.o [9] - 0x2'e886 0x2 "P1", part 2 of 2: 0x1b8 Initializer bytes const 0x2'e886 0x1b8 <for P2-1> - 0x2'ea3e 0x1b8 "P2", part 1 of 3: 0x2c21 P2-1 0x2000'0000 0x2c21 <Init block> .data inited 0x2000'0000 0xc8 cosem_app_calendar.o [11] ... В документации ненашел в какой секции держатся данные инициализации, поэтому и способа их положить явно ненашел
  7. А удавалось ли Вам положить в самый конец прошивы секцию? У меня ИАР после last section еще докладывает секцию с "Initializer bytes const" - она делается после сборки всех секций, и не удается мне положить чтото за ней, чтобы подсчитать реальный размер прошивы
  8. А есть в ИАР способ задания диапазона подсчета КС не по фиксированым адресам а по диапазону прошивки?
  9. А как вы КС считаете в рантайме с этим? в два захода - по таблице векторов + после CRC?
  10. терминологию я не четкую пользую. Поясню: дешевые туристические панельки идут в варианте либо прямого выхода порядка 18/24В с батареи, либо со стабилизатором 5В на УСБ разъем. Я ориентируюсь на 2й вариант - в этом случае имею встроенную в панельку дешевую импульсную понижайку со стабилизацией близко 5В. соответственно если я начну с такого "УСБ" напрямую заряжать суперкондер на слабой панельке - понижайка просто коротнет панель прямо на кондер. Панелька будет долго и мучительно заряжать его не в полную силу. Надо ловить МППТ чтоб забрать на суперкондер побольше
  11. дело не в разряде а в панельке - когда сонца мало надо ловить её МППТ, ограничивать ток заряда, чтоб напруга в 0 не высаживалась. чтоб это ограничение ловить - надо чутко смотреть напругу на выходе понижайки 5В в панели. И не уверен что это нормальный способ - может надо лезть всеж до самой панели. Но вскрывать панельку чето неохота
  12. понижайка должна работать по току - ток заряда надо ограничивать, и подбирать МППТ. может и не нужны, но нужны по питанию УСБ детекторы с чуствительностью в десятоки мВ. В идеале всеж надо мерять потребляемый от панельки ток, чтобы на тот же УСБ выставлять доступный режим. Нет в дешевых кетайских панелях этой функции.
  13. Вы не правы - про цену и качество я не говорил а видимо надо - цена не важна, а качество важно. Искомый девайс из разряда турстического или спорт оборудования. Если Вы смотрели сколько они платят за свои шалабушки, то ожидаемые цены должны быть понятны. (Да блина они строй-утеплитель продщают по цене 700р/кв метр. А в спорт-мастере - за 2.500/м:2. А за приличную пенку, хитрый кусок пластика я отвалил 2тыр, и не жалел ) нечто подобное и мыслится, но лезут нюансы - нужны токовые детекторы, а это злой аналог. Поэтому МК имхо потянет эту задачу с нетривиальным аналоговым обвесом. Скорее всего возьму готовую повышайку батарейного питания, а вот понижайку с програмируемым током видимо на МК придется таки делать.
  14. ну 2 ионистора - значит 2, а почему 2 то? Вы считаете что нет 5В ионисторов - они есть на 6В вроде. в чипдипе в наличии были полгоданазад, причем отечественные, к моему удивлению. Про импульсный контроллер -ессно. ТОлько егоодного недостаточно - надо еще микроконтроллер для логики, управления этими ДСДС, интерфейса УСБ. Собственон об этой системе и вопрос топика - встречал ли кто такое на рынке уже готовое, или надо колхозить?
  15. Вижу я прискорбное российское явление - вместо советов по делу куча советчиков непо делу. Но не буду посылать далеко, а всеж отвечу совопросникам: 1) очевидный вариант с повербанкой мне не нравится по причине того что повербанка не будет работать на минусе. Редкий аккум работает ниже 0. нужен дорогущий индустриальный. А из того что на алике продают - такие коты из мешка выпрыгивают. Не везет мне на этих котов - покупал повербанку - оказалась фуфлой, аккумы по началу дали менее четверти от заявленой емкости, а через год вобще сдохли. 2) обычные аккумы не хранятся разряженые - они деградируют. А саморазряд у них нехороший - тоесть надо регулярно вытаскивать их и заряжать. Мне это не подходит. 3) Мне думается нечто легкое, по виду адаптера втыкающегося в произвольную солнечную батарею- тоесть отдельное от батареи устройство. А солнечные панели с аккумуляторами из теч что я видел - моноблок, чахлые панельки прямо на повербанке. 4) сколько емкости дает ионистор - если ограничится током 100мА (да даже 0.5А) - его может хватить на секунды. Этого достаточно чтоб зарядка телефона включилась и схавала заряд в свой аккум.
  16. Здравствуйте! Прикупил солнечную панельку с банальным StepDown конвертером в USB. пока свет яркий оно вроде бодро работает. Но как солнышко уйдет - чето пытается казаться зарядкой, но при подключении чахлого телефона уже ничего из себя не представляет. Поэтому собрался сделать адаптер - сборщик слабого заряда (на ионисторе) и выдачей накопленого нормальным током заряда в УСБ. Подскажите - видел ли кто чтото подобное в продаже? чтоб не пилить мне велосипед. Полазил по чип-дипу, интернетам, магазинам в поисках чегото подобного и не нашел намеков. Есть серьезные устройства зарядки на сотни ват через аккумуляторы. А туристической мелочи на 15-30вт не встретил.
  17. А полагаете в аналогой части, до фильтра, он не насытит канал?
  18. кажется он думает шта разрабатывать аналоговые фильтры Nго-порядка проще чем цифровые )))
  19. RGMII интерфейс делается в 2х вариантах: 1) Center-aligned - когда надо формировать клок TX запаздывающий на 90* 2) Edge-aligned - клок нужен синхронный с данными, приемник сам задерживает этот клок У меня 2й случай. Поэтому убрал задержку клока. Взял от интела рекомендованые констрейны для него: proc constrain_rgmii_output_pins_edgealigned { name src_clk clk_src clk_pin data_pins } { puts "Inserting timing constraints for RGMII edge-aligned output pins $name" puts "RGMII clock : $src_clk" puts "RGMII clock source: $clk_src" puts "RGMII clock pin: $clk_pin" puts "RGMII data pins: $data_pins" ##1ns setup time and 1ns hold time ## create_generated_clock -name "${name}_tx_clk_125m" -source [get_pins "$clk_src"] [get_ports "$clk_pin"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -max -1 [get_ports "$data_pins"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -min -3 [get_ports "$data_pins"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -max -1 -clock_fall [get_ports "$data_pins"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -min -3 -clock_fall [get_ports "$data_pins"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -max -1 [get_ports "$clk_pin"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -min -3 [get_ports "$clk_pin"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -max -1 -clock_fall [get_ports "$clk_pin"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -min -3 -clock_fall [get_ports "$clk_pin"] # set_clock_groups \ # -exclusive \ # -group [get_clocks "$src_clk" "${name}_tx_clk_125m"] # Set multicycle paths to align the launch edge with the latch edge set_multicycle_path 0 -setup -end -rise_from [get_clocks "$src_clk"] -rise_to [get_clocks "${name}_tx_clk_125m"] set_multicycle_path 0 -setup -end -fall_from [get_clocks "$src_clk"] -fall_to [get_clocks "${name}_tx_clk_125m"] ## edge-aligned output ## Set false paths to remove irrelevant setup and hold analysis ##setup time, set false path, rise-->fall, fall-->rise set_false_path -rise_from [get_clocks "$src_clk"] -fall_to [get_clocks "${name}_tx_clk_125m"] -setup set_false_path -fall_from [get_clocks "$src_clk"] -rise_to [get_clocks "${name}_tx_clk_125m"] -setup ##hold time, set false path, rise-->rise, fall-->fall set_false_path -rise_from [get_clocks "$src_clk"] -rise_to [get_clocks "${name}_tx_clk_125m"] -hold set_false_path -fall_from [get_clocks "$src_clk"] -fall_to [get_clocks "${name}_tx_clk_125m"] -hold } времянка setup-hold теперь ожидаемая - выровнены совпадающие перепады клоков. но ошибка Port Rate так и осталась
  20. добавил set_false_path -from rgmii_rx_clk_125m -to [get_ports {rgmii_tx* rgmii_gtxc}] set_clock_groups -asynchronous -group {rgmii_rx_clk_125m} set_clock_groups -asynchronous -group {rgmii_clk_125m rgmii_tx_clk_125m} это не убрало проблему с Port Rate.
  21. почемуто он на остальные порты rgmii_tx_ctl, rgmii_txd* не сагрился, это может както связано с тем что rgmii_gtxc с отдельного клока (задержаного) берется: rgmii_rxc -> IO_BUF:rgmii_rxc~input -> LCELL:rgmii_tx_clk_d -> CLKCTRL: gmii_tx_clk_d~clkctrl -> ALTDDIO_OUT -> rgmii_gtxc констрейны взял у Форенчича: create_clock -period 8.000 -add -name rgmii_clk_125m [get_pins {rgmii_rxc~input|o}] #proc constrain_rgmii_input_pins { name clk_pin data_pins } # ("rgmii" "rgmii_rxc" "rgmii_rx_ctl rgmii_rxd*") create_clock -name "virt_${name}_rx_clk_125m" -period 8.000 create_clock -name "${name}_rx_clk_125m" -period 8.000 "$clk_pin" -waveform {2 6} set_input_delay -add_delay -clock "virt_${name}_rx_clk_125m" -max 1.25 [get_ports "$data_pins"] set_input_delay -add_delay -clock "virt_${name}_rx_clk_125m" -min -0.25 [get_ports "$data_pins"] set_input_delay -add_delay -clock "virt_${name}_rx_clk_125m" -clock_fall -max 1.25 [get_ports "$data_pins"] set_input_delay -add_delay -clock "virt_${name}_rx_clk_125m" -clock_fall -min -0.25 [get_ports "$data_pins"] set_false_path -rise_from [get_clocks "virt_${name}_rx_clk_125m"] -fall_to [get_clocks "${name}_rx_clk_125m"] -setup set_false_path -fall_from [get_clocks "virt_${name}_rx_clk_125m"] -rise_to [get_clocks "${name}_rx_clk_125m"] -setup set_false_path -rise_from [get_clocks "virt_${name}_rx_clk_125m"] -rise_to [get_clocks "${name}_rx_clk_125m"] -hold set_false_path -fall_from [get_clocks "virt_${name}_rx_clk_125m"] -fall_to [get_clocks "${name}_rx_clk_125m"] -hold #proc constrain_rgmii_output_pins { name src_clk clk_src clk_pin data_pins } # ("rgmii" "rgmii_clk_125m" "rgmii_rxc~input|o" "rgmii_gtxc" "rgmii_tx_ctl rgmii_txd*") create_generated_clock -name "${name}_tx_clk_125m" -source [get_pins "$clk_src"] [get_ports "$clk_pin"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -max 1 [get_ports "$data_pins"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -min -1 [get_ports "$data_pins"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -max 1 -clock_fall [get_ports "$data_pins"] set_output_delay -add_delay -clock [get_clocks "${name}_tx_clk_125m"] -min -1 -clock_fall [get_ports "$data_pins"] set_false_path -rise_from [get_clocks "$src_clk"] -fall_to [get_clocks "${name}_tx_clk_125m"] -setup set_false_path -fall_from [get_clocks "$src_clk"] -rise_to [get_clocks "${name}_tx_clk_125m"] -setup set_false_path -rise_from [get_clocks "$src_clk"] -rise_to [get_clocks "${name}_tx_clk_125m"] -hold set_false_path -fall_from [get_clocks "$src_clk"] -fall_to [get_clocks "${name}_tx_clk_125m"] -hold чтото тут нетак
  22. Здравствуйте! Имею борду alinx AC4075 c плисой EP4CE75F23C8, на несущей плате AV6045 c Phy RTL8211EG подключеным по RGMII интерфейсу. Уровни питания интерфейса RTL8211 сконфигурированы в 3,3В (перемычкой производителя) вот распиновка интерфейса обмена: set_location_assignment PIN_B3 -to rgmii_txd[3] set_location_assignment PIN_A7 -to rgmii_txd[2] set_location_assignment PIN_B1 -to rgmii_txd[1] set_location_assignment PIN_B2 -to rgmii_txd[0] set_location_assignment PIN_A9 -to rgmii_gtxc set_location_assignment PIN_C8 -to rgmii_tx_ctl set_location_assignment PIN_F2 -to rgmii_rxd[3] set_location_assignment PIN_A6 -to rgmii_rxd[2] set_location_assignment PIN_F1 -to rgmii_rxd[1] set_location_assignment PIN_A5 -to rgmii_rxd[0] set_location_assignment PIN_B6 -to rgmii_rxc set_location_assignment PIN_B10 -to rgmii_rx_ctl set_location_assignment PIN_A3 -to gmii_rx_er проект выдает такой ошику: Report Minimum Pulse Width: Found 1 results (1 violated). Worst case slack is -5.445 Tcl Command: report_min_pulse_width -multi_corner -panel_name {Minimum Pulse Width: rgmii_tx_clk_125m} -detail full_path -nworst 100 [get_clocks {rgmii_tx_clk_125m}] Delay Model: Slow 1200mV 85C Model Node rgmii_gtxc Clock rgmii_tx_clk_125m Type Port Rate Actual Width 8.000 Required Width 13.445 Slack -5.445 (VIOLATED) ЧЯНДТ? Насколько я понимаю он гворит мне что порт не умеет в мои частоты? Как правильно подключать RGMII в портам плисы? Кто побеил такое, памагите!
  23. вот поэтому их надо перекладывать в другой объект, чтоб компилятор не мог заинлайнить. И по моей практике - не инлайнит он на АРМах, надо особенно его еще уговорить заинлайнить, особенно с ключом Os
×
×
  • Создать...