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

adnega

Свой
  • Постов

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

  • Посещение

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

    3

Сообщения, опубликованные adnega


  1. В 13.08.2023 в 01:01, jcxz сказал:

    PS: 8 байт должны занять:

    LDR R5, =0x40020418
    LDR R6, =0x40020418

    Ммм..

    ; 20.4ns = 6t
    ; LDR   R5, =0x40020418                                                                                                                                        
    800530a: 4d04        ldr r5, [pc, #16] ; (800531c <cc+0x3c>)                                                                                                   
    ; LDR   R6, =0x40020418                                                                                                                                        
    800530c: 4e03        ldr r6, [pc, #12] ; (800531c <cc+0x3c>)
    
    800531c: 40020418  .word 0x40020418

    Да 8 байт. Но какой толк от второй команды, когда есть MOV ?

    Пока делаю вывод, что у МК с WS0 для кода самая быстрая загрузка imm32 будет с использованием MOV/MOVT, но более расточительна по памяти.

  2. В 13.08.2023 в 01:01, jcxz сказал:

    Но такая команда не скомпилится.

    "=imm32" я понимаю как "[PC, label]". Команда "LDRD R5, R6, [PC, label]" компилируется, и листинг я приводил (данные лежат по метке "cc"):

    80052bc: e9df 5604   ldrd  r5, r6, [pc, #16] ; 80052d0 <cc>
    ..
    080052d0 <cc>: 
    80052d0: 40020418  .word 0x40020418                                                                                                                           
    80052d4: 40020418  .word 0x40020418 

     

  3. В 12.08.2023 в 23:55, jcxz сказал:

    Вот именно: 4 + 4 = 8   Первый класс школы, если что  :wink:

    LDRD - это загрузка двух 32-битных слов (данные занимают 2 * 4 байта = 8 байт). Плюс сама команда 4 байта. 8 + 4 = 12 байт.

  4. В 12.08.2023 в 10:39, jcxz сказал:

    Не хватает варианта с заменой этого на одну LDRD R5, R6, =0x40020418  :wink:

    Имхо: Лучше времена приводить в тактах. Нагляднее.

    80052bc: e9df 5604   ldrd  r5, r6, [pc, #16] ; 80052d0 <cc>
    ..
    080052d0 <cc>: 
    80052d0: 40020418  .word 0x40020418                                                                                                                           
    80052d4: 40020418  .word 0x40020418 

    те же 20.4 нс (6 тактов, 12 байт).

    Но

    80052bc: f44f 6583   mov.w r5, #0x0418                                                                                                                   
    80052c0: f2c4 0502   movt  r5, #0x4002                                                                                                                
    80052c4: f44f 6683   mov.w r6, #0x0418                                                                                                                   
    80052c8: f2c4 0602   movt  r6, #0x4002

    всего 13.4 нс (4 такта, 16 байт)

    Кста, на тему теневого копирования, WS=0 и т.п. недавно сделал пост, но он оказался не замеченным, хотя там беда масштабнее.

  5. В 11.08.2023 в 22:08, jcxz сказал:

    Поставьте обе 

    LDR	R6,	[R5]

    друг за дружкой, и число тактов тоже должно упасть.

    Вот несколько измерений, которые добавлял в середину цепочки из     STR     R4, [R5, #imm]

    	// 13.4 ns
    	MOV 	R5, #0x0418
    	MOVT	R5, #0x4002
    	LDR		R6,	[R5]
    	
    	// 20.4 ns
    	LDR 	R5, =0x40020418
    	LDR		R6,	[R5]
    	
    	// 20.4 ns
    	LDR 	R5, =0x40020418
    	NOP
    	LDR		R6,	[R5]
    	
    	// 24.0 ns
    	LDR 	R5, =0x40020418
    	LDR		R6,	[R5]
    	LDR		R6,	[R5]
    	
    	// 3.5 ns
    	LDR		R6,	[R5]
    	
    	// 16.6 ns
    	LDR 	R5, =0x40020418
    	
    	// 20.4 ns
    	LDR 	R5, =0x40020418
    	LDR 	R5, =0x40020418
    	
    	// 20.4 ns
    	LDR 	R5, =0x40020418
    	LDR 	R6, =0x40020418
    В 11.08.2023 в 22:08, jcxz сказал:

    Дело не только в шинах. Изучите документ: https://www.cse.scu.edu/~dlewis/book3/docs/Cortex-M4%20Instruction%20Timing.pdf

    Интересный документ.

  6. В 11.08.2023 в 12:38, Arlleex сказал:

    Вообще говоря в приведенном коде загрузка константы (адреса) из Flash должна вестись по DCode-шине, выборка инструкций по ICode, а System bus обращается к периферии.

    И тут надо глядеть, есть ли в AT32F узкое горлышко при доступе к Flash: данные будут лежать "недалеко" от инструкций, поэтому возможность параллельной работы зависит от задумки китайцев...

    Вы правы. Если сравнить реализацию в AT32F437

    image.thumb.png.c4a27bf350db1ff3b3216cab02a97d0f.png

    с реализацией в STM32F43x

    image.thumb.png.29e5641ea25ff4b065ff08b1cee3d6b3.png

    то видно, что I и D шины у ST разделены, поэтому ситуация может быть принципиально лучше.

    Но если ответить на часть вопроса, то в AT32F437 выборка инструкций идет на частоте PLL (288 МГц макс), с нулевыми циклами ожидания.

    В случаях, когда команда дергает I и D шины - МК AT32F437 может существенно проигрывать ST.

    Получается, что для загрузки 32-битных значений в регистр по памяти проигрываем (8 против 6), но по тактам можем выиграть сильно (если таких ситуаций много).

    Может, есть какой ключик компилятора на этот случай?

  7. В 08.08.2023 в 21:20, dmitrykhom сказал:

    Кто-нибудь имеет такой опыт? Может ли подсказать, как нивелировать разницу? Или что я не учёл, когда рассчитывал, что все команды будут исполняться где-то за 1-2-4 такта. А 1 такт это около 3,5 нс.

    Я запустил такой код на частоте 288МГц. 1 такт ~3.47нс.

    	MOVS R4, #0x0001
    	LDR R5, =0x40020418
    	STR R4, [R5, #0]
    	STR R4, [R5, #16]
    	STR R4, [R5, #0]
    	STR R4, [R5, #16]
    	LDR R5, =0x40020418
    	LDR	R6,	[R5]
    	LDR R5, =0x40020418
    	LDR	R6,	[R5]
    	STR R4, [R5, #0]
    	STR R4, [R5, #16]
    	STR R4, [R5, #0]
    	STR R4, [R5, #16]
    	STR R4, [R5, #0]
    	STR R4, [R5, #16]

     

    В середине есть блок из пар загрузки из Flash с последующим чтением из периферии.

    Каждая такая пара выполняется за порядка 20нс (~6 тактов). Если убрать либо чтение Flash, либо чтение из периферии, то число тактов резко падает (к 1 такту).

    Я подозреваю какую-то очередь в районе шины AHB. Видимо, не нужно создавать очередей, чтоб код стал эффективно выполняться.

    Например, между этими двумя командами можно поставить NOP, и это никак не повлияет на время выполнения - оно не увеличится.

    Вместо NOP можно поместить более полезную команду, которая не конфликтует за доступ к AHB.

     

    В 11.08.2023 в 11:03, vladec сказал:

    В плане доставаемости в России, об Артери у нас, как то, положительного впечатления не сложилось.

    AT32F437 то пропадают, то появляются по несколько тысяч штук. -ZG и -ZM не принципиально отличаются по цене, и за такой функционал - считаю, даром.

    В идеале хотелось бы, чтоб все устаканилось, и появилась ревизия В, т.к. в А много силиконовых глюков.

    Тоже долго мучились, но решили делать серийное изделие на AT32F437Z

  8. Добрый день!

    Столкнулся с этой же проблемой, но на GD32F405RGT6.

    Пока не подашь RESET - не работает. Если при подаче питания удерживать RESET - не помогает - только второй дополнительный импульс.

    Кста, в заводской загрузчик заходит тоже только после передергивания RESET.

    После дополнительного импульса RESET - все прекрасно работает.

    Если идти от минимального кода, то можно сделать рабочий blink.

    Если blink плавно усложнять, то может сложиться ситуация, когда код перестает запускаться в принципе.

    Это никак не связано со временем выполнения, т.к. blink может работать бесконечно.

    Шьется всегда без проблем.

    В партии обнаружили два МК с таким поведением - один у меня в наличии - могу всячески тестировать.

    Замена МК помогает.

    Если сделать рабочий blink, то при подаче питания - задержка выполнения кода - 140мс;

    если удерживать RESET, подать питание, отпустить RESET - те же 140мс после отпускания RESET;

    если передернуть RESET запитанного МК, то задержка выполнения кода нулевая.

    Кста, размер работающего blink порядка 32кБ, просто в начале исходника перемещаю аналог while(1) и большая часть кода не выполняется.

    Поискал причину: оказывается, что при старте SP не копируется из памяти.

    При сбросе по питанию вижу SP=0xFFFFFFFC. При нормальной работе SP=0x20020000.

  9. В 18.07.2023 в 15:09, quark сказал:

    Почему это не подойдут? Очень даже подойдут! Разъем WF-6 - это прочная штука, с упругими штырями.

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

    Кста, диаметр металлизированных отверстий тоже может "плясать" от партии к партии, или от платы к плате.

    Когда роль играют десятые и сотые доли миллиметра - я даже не берусь.

    В 18.07.2023 в 15:09, quark сказал:

    Выдержит не одну сотню втыканий, если не тысячу. А потребуется заменить - стоит копейки. И на плате разъем из металлизированных отверстий будет далеко не одноразовый (хотя это не нужно). А для отладки - правильнее этот разъем припаять на одной плате. Один раз подобрать отверстия на плате - дальше тиражировать бесплатно. Просто и надежно. Без лишних деталей.

    Pogo-пины всем хороши, но их нужно чем-то прижимать. Кста, если было бы что-то фиксируемое в отверстии М3, то это тоже задачу решило, т.к. вокруг отверстия М3 можно насыпать пятаков и прижиматься к ним pogo-пинами. Могу накустарить фиксатор для М3, но вот если заводское что-нить было...

  10. Ключевое слово "надежный". Вряд ли всякие перекосы/расклинивания и т.п. тут подойдут.

    Я везде использую такой разъем для программирования/отладки:

    image.png.0c54015e6b33c56e8aa1a3c3fa41cc39.png

    Шью ответной частью с подпружиненными иголками.

    image.thumb.png.4053d07c815ff7d7d017967c7c2a3130.png

    Если удается вывести разъем на край платы, то вообще красота:

    image.thumb.png.79a3649552dc260b7bb4aac989410e1e.png

    - цепляюсь самодельной прищепкой. Кста, на Али есть готовые прищепки.

  11. Не знаю как, но на клонах еще утечка на землю появляется на пине RESET самого МК.

    Ставлю подтяжку к VCC посильнее, и еще продолжает работать.

    Сопротивление утечки порядка 200 Ом, если память не изменяет.

  12. \(Y={x_1}\lor\bar{x_1}\bar{x_2}{x_3}={x_1}\cdot(1\lor\bar{x_2}{x_3})\lor\bar{x_1}\bar{x_2}{x_3}={x_1}\lor{x_1}\bar{x_2}{x_3}\lor\bar{x_1}\bar{x_2}{x_3}={x_1}\lor({x_1}\lor\bar{x_1})\cdot\bar{x_2}{x_3}={x_1}\lor1\cdot\bar{x_2}{x_3}={x_1}\lor\bar{x_2}{x_3}\)

    - согласен, сразу не увидел

    \(Y={x_1}\lor\bar{x_2}{x_3}=\overline{\bar{x_1}\cdot\overline{\bar{x_2}{x_3}}}=\overline{\overline{{x_1}\cdot{x_1}}\cdot\overline{\overline{{x_2}\cdot{x_2}}\cdot{x_3}}}\)

    • Like 1
  13. 1. Заменяю ИЛИ на И, но добавляю инверсию аргументам и результату, т.к.

    \(x \lor y = \overline{\bar{x} \cdot \bar{y}}\)

    2. Добавляю четное количество инверсий, т.к. это не меняет результат.

    Все понятно?

  14. \(Y=\bar{x_1}\bar{x_2}{x_3}\lor{x_1}\bar{x_2}\bar{x_3}\lor{x_1}\bar{x_2}{x_3}\lor{x_1}{x_2}\bar{x_3}\lor{x_1}{x_2}{x_3}=\)

    \(=\bar{x_1}\bar{x_2}{x_3}\lor{x_1}\bar{x_2}(\bar{x_3}\lor{x_3})\lor{x_1}{x_2}(\bar{x_3}\lor{x_3})=\)

    \(=\bar{x_1}\bar{x_2}{x_3}\lor{x_1}\bar{x_2}\cdot1\lor{x_1}{x_2}\cdot1=\)

    \(=\bar{x_1}\bar{x_2}{x_3}\lor{x_1}\bar{x_2}\lor{x_1}{x_2}=\)

    \(=\bar{x_1}\bar{x_2}{x_3}\lor{x_1}(\bar{x_2}\lor{x_2})=\)

    \(=\bar{x_1}\bar{x_2}{x_3}\lor{x_1}\cdot1=\)

    \(=\bar{x_1}\bar{x_2}{x_3}\lor{x_1}\)

    -упростили

     

    \(Y=\bar{x_1}\bar{x_2}{x_3}\lor{x_1}\to\overline{\overline{\bar{x_1}\bar{x_2}{x_3}}\cdot\bar{x_1}} \quad /*nNAND*/\to\overline{\overline{\overline{\overline{\bar{x_1}\bar{x_2}}}\cdot{x_3}}\cdot\bar{x_1}} \quad /*2NAND*/\)

    \(\)- привели к 2-И-НЕ или И-НЕ

  15. В 08.06.2023 в 08:01, ecomp42 сказал:

    adnega, а можете подсказать модель китайского датчика и где можно купить? Как раз интересуют тензодатчики на 10 кг.

    Покупал этот набор.

  16. В 06.06.2023 в 12:11, jcxz сказал:

    Мне без разницы на чём оно работает. Если в любой из конфигураций - не работает, то считаем что и в общем случае - не работает. точка.

    У вас же какая-то странная логика: "если работает у меня на столе, в конкретных условиях, значит - всё работает".

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

    Я коллекционирую такие случаи. Пока коллекция пустая.

  17. В 06.06.2023 в 11:31, jcxz сказал:

    Выше объяснял уже.

    Вы указали в объяснении требование. Я привел пример, когда это требование не выполняется, но все работает.

    Хотелось бы узнать на чем основывается ваша уверенность. Есть ли цитата из руководящего документа и т.п.?

    В 06.06.2023 в 11:31, jcxz сказал:

    Проверяете только на одной версии виндов.

    Могу попробовать с Win XP откапать, но там согласен - было хуже, но я как-то выворачивался.

×
×
  • Создать...