![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_pattern.png)
![](https://electronix.ru/forum/uploads/set_resources_23/84c1e40ea0e759e3f1505eb1788ddf3c_default_photo.png)
adnega
-
Постов
3 603 -
Зарегистрирован
-
Посещение
-
Победитель дней
3
Сообщения, опубликованные adnega
-
-
В 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
-
В 12.08.2023 в 23:55, jcxz сказал:
Вот именно: 4 + 4 = 8 Первый класс школы, если что
LDRD - это загрузка двух 32-битных слов (данные занимают 2 * 4 байта = 8 байт). Плюс сама команда 4 байта. 8 + 4 = 12 байт.
-
В 12.08.2023 в 10:39, jcxz сказал:
Не хватает варианта с заменой этого на одну LDRD R5, R6, =0x40020418
Имхо: Лучше времена приводить в тактах. Нагляднее.
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 и т.п. недавно сделал пост, но он оказался не замеченным, хотя там беда масштабнее.
-
В 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
Интересный документ.
-
В 11.08.2023 в 12:38, Arlleex сказал:
Вообще говоря в приведенном коде загрузка константы (адреса) из Flash должна вестись по DCode-шине, выборка инструкций по ICode, а System bus обращается к периферии.
И тут надо глядеть, есть ли в AT32F узкое горлышко при доступе к Flash: данные будут лежать "недалеко" от инструкций, поэтому возможность параллельной работы зависит от задумки китайцев...
Вы правы. Если сравнить реализацию в AT32F437
с реализацией в STM32F43x
то видно, что I и D шины у ST разделены, поэтому ситуация может быть принципиально лучше.
Но если ответить на часть вопроса, то в AT32F437 выборка инструкций идет на частоте PLL (288 МГц макс), с нулевыми циклами ожидания.
В случаях, когда команда дергает I и D шины - МК AT32F437 может существенно проигрывать ST.
Получается, что для загрузки 32-битных значений в регистр по памяти проигрываем (8 против 6), но по тактам можем выиграть сильно (если таких ситуаций много).
Может, есть какой ключик компилятора на этот случай?
-
Кста, вместо "LDR R5, =0x40020418" можно использовать MOV/MOVT
MOV R5, #0x0418 MOVT R5, #0x4002
- это чуть-чуть быстрее (раза в два)
-
В 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
-
Сделал принудительную инициализацию SP в начале вектора сброса - теперь все работает.
-
Добрый день!
Столкнулся с этой же проблемой, но на GD32F405RGT6.
Пока не подашь RESET - не работает. Если при подаче питания удерживать RESET - не помогает - только второй дополнительный импульс.
Кста, в заводской загрузчик заходит тоже только после передергивания RESET.
После дополнительного импульса RESET - все прекрасно работает.
Если идти от минимального кода, то можно сделать рабочий blink.
Если blink плавно усложнять, то может сложиться ситуация, когда код перестает запускаться в принципе.
Это никак не связано со временем выполнения, т.к. blink может работать бесконечно.
Шьется всегда без проблем.
В партии обнаружили два МК с таким поведением - один у меня в наличии - могу всячески тестировать.
Замена МК помогает.
Если сделать рабочий blink, то при подаче питания - задержка выполнения кода - 140мс;
если удерживать RESET, подать питание, отпустить RESET - те же 140мс после отпускания RESET;
если передернуть RESET запитанного МК, то задержка выполнения кода нулевая.
Кста, размер работающего blink порядка 32кБ, просто в начале исходника перемещаю аналог while(1) и большая часть кода не выполняется.
Поискал причину: оказывается, что при старте SP не копируется из памяти.
При сбросе по питанию вижу SP=0xFFFFFFFC. При нормальной работе SP=0x20020000.
-
-
В 18.07.2023 в 15:09, quark сказал:
Почему это не подойдут? Очень даже подойдут! Разъем WF-6 - это прочная штука, с упругими штырями.
Контакты в сечении - квадрат. Углы быстро слижутся и условный диаметр уменьшится, а с ним и сила прижима контакта.
Кста, диаметр металлизированных отверстий тоже может "плясать" от партии к партии, или от платы к плате.
Когда роль играют десятые и сотые доли миллиметра - я даже не берусь.
В 18.07.2023 в 15:09, quark сказал:Выдержит не одну сотню втыканий, если не тысячу. А потребуется заменить - стоит копейки. И на плате разъем из металлизированных отверстий будет далеко не одноразовый (хотя это не нужно). А для отладки - правильнее этот разъем припаять на одной плате. Один раз подобрать отверстия на плате - дальше тиражировать бесплатно. Просто и надежно. Без лишних деталей.
Pogo-пины всем хороши, но их нужно чем-то прижимать. Кста, если было бы что-то фиксируемое в отверстии М3, то это тоже задачу решило, т.к. вокруг отверстия М3 можно насыпать пятаков и прижиматься к ним pogo-пинами. Могу накустарить фиксатор для М3, но вот если заводское что-нить было...
-
- или так, если нужно отлаживать долго))
-
Ключевое слово "надежный". Вряд ли всякие перекосы/расклинивания и т.п. тут подойдут.
Я везде использую такой разъем для программирования/отладки:
Шью ответной частью с подпружиненными иголками.
Если удается вывести разъем на край платы, то вообще красота:
- цепляюсь самодельной прищепкой. Кста, на Али есть готовые прищепки.
-
На нем же написано ATM8F8040K.
-
В 08.07.2023 в 10:30, MKdemiurg сказал:
подтягивания ресета не работают.
Я говорил про RESET самого МК отладчика, а не тагрета.
-
Не знаю как, но на клонах еще утечка на землю появляется на пине RESET самого МК.
Ставлю подтяжку к VCC посильнее, и еще продолжает работать.
Сопротивление утечки порядка 200 Ом, если память не изменяет.
-
\(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}}}\)
-
1
-
-
1. Заменяю ИЛИ на И, но добавляю инверсию аргументам и результату, т.к.
\(x \lor y = \overline{\bar{x} \cdot \bar{y}}\)
2. Добавляю четное количество инверсий, т.к. это не меняет результат.
Все понятно?
-
\(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-И-НЕ или И-НЕ
-
Дык, упрощать функцию пока все ИЛИ не будут заменены на И.
Знаете как ИЛИ поменять на И?
-
В 08.06.2023 в 08:01, ecomp42 сказал:
adnega, а можете подсказать модель китайского датчика и где можно купить? Как раз интересуют тензодатчики на 10 кг.
Покупал этот набор.
-
В 06.06.2023 в 12:11, jcxz сказал:
Мне без разницы на чём оно работает. Если в любой из конфигураций - не работает, то считаем что и в общем случае - не работает. точка.
У вас же какая-то странная логика: "если работает у меня на столе, в конкретных условиях, значит - всё работает".
Попробую согласиться с вашим мнением о моей логике, но добавлю, что прошу назвать примеры/условия, когда изложенный мной подход не работает.
Я коллекционирую такие случаи. Пока коллекция пустая.
-
В 06.06.2023 в 11:50, jcxz сказал:
На опыте работы с различными USB-CDC под WinXP-Win8.
USB-CDC может работать на драйвере производителя, а может на usbser. Вы различаете две эти ситуации?
-
В 06.06.2023 в 11:31, jcxz сказал:
Выше объяснял уже.
Вы указали в объяснении требование. Я привел пример, когда это требование не выполняется, но все работает.
Хотелось бы узнать на чем основывается ваша уверенность. Есть ли цитата из руководящего документа и т.п.?
В 06.06.2023 в 11:31, jcxz сказал:Проверяете только на одной версии виндов.
Могу попробовать с Win XP откапать, но там согласен - было хуже, но я как-то выворачивался.
AT32F437: эффективность работы команд под WS0
в TI, Allwinner, GigaDevice, Nordic, Espressif и другие
Опубликовано · Пожаловаться
Ммм..
Да 8 байт. Но какой толк от второй команды, когда есть MOV ?
Пока делаю вывод, что у МК с WS0 для кода самая быстрая загрузка imm32 будет с использованием MOV/MOVT, но более расточительна по памяти.