Ruslan
и чё? if быстрее?
Evgen
ха, как и ожидалось... классика жанра.
Evgen
Я б на счётчик вызовов функций посмотрел для начала
намекал я, но коллега намеков не понял
Evgen
а что с ним? ну, текст я привёл, посмотри
direct_if took: 4239792 micros, count 50000000 direct_switch took: 4281665 micros, count 100000000 indirect_version took: 5079378 micros, count 150000000
Evgen
да оно просто не вызывает функции, благодаря оптимизации
да оно вообще ничего не вызывает - смотрит - результаты не используются - значит нафиг, а с индиректом не умеет так оптимизировать
Evgen
да оно просто не вызывает функции, благодаря оптимизации
а правильно надо было бы какой-то попугай считать и например суммировать в каждой функции, а потом этот попугай обязательно вывести, чтоб не уоптимизировало
Evgen
а вот 15% разницы это уже много
сделай правильно, а не как я - в каждую функцию засунул count++; - разница будет меньше int fn_1(int a) { count++; return a * 8; }
Evgen
особенно прикольно с оптимизацией в отладчике отлаживать.... начинаешь думать, что кукуха отъехала, а потом вспоминаешь, что забыл оптимизацию отключить
Ruslan
я чеклисты пишу, полезная тема
Evgen
хмм... а вот с делением я промазал....
Ruslan
)))
Ruslan
📕 Книга «Программирование на Ардуино. От простого к сложному» (Djvu с возможностью поиска 29.7 Mb) Автор: Мамичев Д.И. Год издания: 2018 Содержание: Книга для начинающих учиться программированию с использованием платформы Arduino. Многие эксперименты и скетчи могут показаться слишком простыми в повторении, даже для «непосвящённых в азы», но постижение сложного происходит от принятия простого. Чем надежнее вы освоите первые шаги, тем проще будет наращивать потенциал. Книга содержит шесть глав, первые пять рассказывают об экспериментах с платой Arduino UNO. Шестая глава содержит описания законченных конструкций. Страница с содержанием книги на втором скрине! #Arduino #UNO #Ардуино #Книга #Обучение #Программирование
Ruslan
SSR
Ахахах
Evgen
хм. В древнем lpc1768 деление float раза в 1.5 тормознее умножения и не сильно медленнее целочисленного деления-умножения. А на esp32 деление медленнее в 14 раз
Ruslan
Старый баян, настало твоё время https://t.me/doque_embedded/173
Konstantin
Раз нестабильно железо работает, то возможно имеет смысл рассмотреть защиту от сбоя в протоколе обмена. Повторную передачу если не поступило подтверждение к примеру.
Мне повторная отправка не подходит, т.к. фиксированное время доставки пакета приоритетнее, чем гарантированная доставка, но с плавающей задержкой. Но вообще, я вчера выяснил, что ESPNOW поддерживает ретрансмиты "из коробки", т.к. в EspnowTransmitter.cpp можно настроить избыточность (по-умолчанию равна единице, т.е. отключена). uint8_t _broadcastTransmissionRedundancy = 1; Если значение больше единицы и за время таймаута пакет не был доставлен, ESPшка отправит его повторно и так N раз. Таймаут по-умолчанию 40 мс uint32_t _espnowTransmissionTimeoutMs = 40;
Konstantin
В общем, проблема точно не софтовая. Сейчас расположил рядом оба модуля и дал им поработать 5 минут. На 80199 отправленных пакетов 0 недоставленных. Попробую начать с замены PCB-антенн на нормальные дипольки, может станет получше.
В продолжение темы ESPNOW. Как и ожидалось, проблема была в штатных PCB-антеннах ESP12 — они, мягко говоря, хрeновенькие. Отрезал антенну на одном модуле, припаял туда u.fl и подключил дипольку, настроенную на 2.4 ГГц, ошибок отправки стало меньше. Повторил процедуру на втором модуле и статистика по доставленным / недоставленным пакетам улучшилась кардинально: на расстоянии 1-2 м было от 0.5 до 1.5% потерь, стало 0.07% из другой комнаты (5-6 м) было 3-5% потерь, стало 0.1 - 0.2% На скриншоте первое число — доставленные, второе — потерянные пакеты.
Konstantin
Вот так выглядела замена штатной PCB-антенны на U.FL. Перерезал выход на антенну, вскрыл в трёх местах маску, залудил, затем поставил разъем феном. Вся процедура заняла 5 минут, а качество связи выросло в разы. З.Ы. Про ESP-07 в курсе, но их у меня нет, поэтому пришлось колхозить.
Konstantin
Konstantin
Konstantin
Konstantin
iҚØN🐾🐾
Вот так выглядела замена штатной PCB-антенны на U.FL. Перерезал выход на антенну, вскрыл в трёх местах маску, залудил, затем поставил разъем феном. Вся процедура заняла 5 минут, а качество связи выросло в разы. З.Ы. Про ESP-07 в курсе, но их у меня нет, поэтому пришлось колхозить.
У меня была подобная хрень. Роутер стоял в 70 см и постоянно вылетало, а ртт пинга было 400 мс. Роутер норм пробивает аж с 5го этажа на улицу, а тут не алё. Подключил внешний диполь и сразу все стало хорошо и ни единого разрыва (с)
iҚØN🐾🐾
У меня такого не было) я просто поймал баг постоянного реконнекта и потом "no ssid found", потом я репу почесал такой и думаю, wtf блин
Konstantin
У меня была подобная хрень. Роутер стоял в 70 см и постоянно вылетало, а ртт пинга было 400 мс. Роутер норм пробивает аж с 5го этажа на улицу, а тут не алё. Подключил внешний диполь и сразу все стало хорошо и ни единого разрыва (с)
Я еще с разводкой платы мог накосячить, на которой распаян модуль: зазор между антенной и полигонами земли совсем небольшой, и компоненты стоят тоже вплотную к антенне. Про необходимость выдерживать зазор я знал, но забил на это в угоду компактности (и_так_сойдёт.jpg).
Konstantin
ещё бывает что сигнал слишком сильный, работает отлично на расстоянии а вот на одном столе проблемы.
Этот вариант я успел проверить. Опускал мощность до +10 дБм — становилось только хуже :)
iҚØN🐾🐾
А канал какой? Возможно всё соседи на том-же висят.
Не-не, я спецом выбрал тот, на котором никого нет) сперва прощупав армоном
iҚØN🐾🐾
В общем, все магически пофиксилось после подключения внешней антенны
iҚØN🐾🐾
Да там такой рассадник) хорошо у меня дуал-бэнд, на 5ке сижу
iҚØN🐾🐾
Жаль esp не доросли
Жексон
Жаль esp не доросли
Ну хоть 40 могут :)))
iҚØN🐾🐾
Жексон
Что 40?
Полоса
iҚØN🐾🐾
Кстати, никто не в курсе, как сделать ширину 20МГц вместо 40?
Жексон
Тоже интересно.
Жексон
Кстати, никто не в курсе, как сделать ширину 20МГц вместо 40?
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/network/esp_wifi.html#_CPPv422esp_wifi_set_bandwidth16wifi_interface_t16wifi_bandwidth_t
Жексон
Я не пробовал ... Завтра протестую.
iҚØN🐾🐾
А то у меня блютуз проседает рядом с esp32 во время работы в ap ;)
iҚØN🐾🐾
Кривой чип, но если переводишь в 20 весь вайфай - все работает ок
Жексон
Да ну тебя... Я столько написал , заново не буду...
iҚØN🐾🐾
О, там есть и другие вкусности, типа esp_wifi_set_inactive_time и тд
iҚØN🐾🐾
Еще интересен SmartConfig, тоже надо попробовать как-нибудь
iҚØN🐾🐾
А еще прикольный документик: https://www.espressif.com/sites/default/files/documentation/esp32_errata_en.pdf
Evgen
Пока не верю вам :(
берешь ARM в ручки и проверяешь, делов то
Mr.Mait
Пока не верю вам :(
https://developer.arm.com/documentation/ddi0439/b/Floating-Point-Unit/FPU-Functional-Description/FPU-instruction-set P.S. Правда это cortex-m4, но там деление в 14 тактов
Evgen
https://developer.arm.com/documentation/ddi0439/b/Floating-Point-Unit/FPU-Functional-Description/FPU-instruction-set P.S. Правда это cortex-m4, но там деление в 14 тактов
Ну так Армы родили это самое fpu не просто так. Хотя умножение там вообще за такт...
Evgen
или вот так
Anton
короче, алгоритм для целых чисел такой: вычитаем из нашего выражения максимальные значиния, являющиеся сдвигом исходного вправо на эн бит, не превышающие остаток от предыдущего деления. но именно для тройки получается максимально длинно, поскольку это минимальное натуральное число после 1 и 2, делить на которые тривиально
Anton
то есть: x/3 = a; x/3 = x/4+x/12; x/12 = x/16 + x/48; x/48 = x/64 + x/192; -- и так далее, пока x/Y не будет меньше 1 в заданном диапазоне значений для x
Anton
и что?
то что ты считаешь общий случай, который оптимизировать нельзя
Anton
то есть: x/3 = a; x/3 = x/4+x/12; x/12 = x/16 + x/48; x/48 = x/64 + x/192; -- и так далее, пока x/Y не будет меньше 1 в заданном диапазоне значений для x
как следствие, для 8-битных можно такую оптимизацию очень легко и быстро получить
Evgen
то что ты считаешь общий случай, который оптимизировать нельзя
ничего не понимаю. Речь шла о разнице времени выполнения деления и умножения. Я утверждал, что на 32 битных процессорах разницы особой быть не должно, но я ошибся. Но вот для арма cortex M3 показываю, что разницы нет
Anton
в изначальном моём коде я взял пример подсчёта сколько экранных точек может поместиться в буфер заданного размера при определённом числе бит на точку
Anton
поэтому числа там целые
Evgen
ты считаешь флоат, а речь была про целые числа
вообще весь кипешь как раз про флоат, именно поэтому рекомендации заменять деление умножением, начиная с фиг знает какого времени, как бы не с фортрана и Бэсм-6
Anton
если операция деления дорогая