• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Решено Частотомер и WEB

sir999

New member
Arduno ESP8266:
Код:
Start Test at 44 (millis)...
Average data 61.60 (61), worked time: 2916 ms
Start Test at 3060 (millis)...
Average data 61.60 (61), worked time: 2916 ms
...
Arduno ESP32:
Код:
Start Test at 47 (millis)...
Average data 122.02 (121), worked time: 16912 ms
Start Test at 17059 (millis)...
Average data 122.02 (121), worked time: 16909 ms
Start Test at 34068 (millis)......
И врет время. Пишет 16 сек, а проходит более 20... Т.е. даже все потроха FPU сбивает... В зависимости от сборки и включения питания модуля показывает и 0 ms. При этом счет millis() идет только на delay(50+50) в приложенном коде. :) Выходит нечто такое:
Код:
Start Test at 47 (millis)...
Average data 122.02 (121), worked time: 0 ms
Start Test at 147 (millis)...
Average data 122.02 (121), worked time: 0 ms
Start Test at 247 (millis)......
Arduno RTL серии "A" ~ 2300 ms (нет FPU, нет XIP)
Arduno RTL серии "B" ~ 300 ms (есть FPU, есть XIP)

Код:
#if defined(ARDUINO_AMEBA)
#include "flash_api.h"
#define flash_read_dword(faddr, pdata)    flash_read_word(&flashobj, faddr, pdata);
#else
#include "Esp.h"
#define flash_read_dword(faddr, pdata)    ESP.flashRead(faddr, pdata, 4);
#endif

void setup() { Serial.begin(115200); }

#define count (1024*1024)
uint32_t summ = 0;
float f = 0.0;
void test(void) {
  uint32_t faddr = 0;
  uint32_t dw;
  while (faddr < count) {
    flash_read_dword(faddr, &dw);
    faddr += 4;
    for (int i = 0; i < 4; i++) {
      uint8_t b = (uint8_t)dw;
      f += (float)b;
      summ += (uint32_t)b;
      dw >>= 8;
    }
  }
  f /= (float) count;
  summ /= count;
}

void loop() {
  Serial.print("Start Test at ");
  Serial.print(millis());
  Serial.println(" (millis)...");
  delay(50);
  volatile uint32_t mm0 = millis();
  test();
  mm0 = millis() - mm0;
  Serial.print("Average data ");
  Serial.print(f);
  Serial.print(" (");
  Serial.print(summ);
  Serial.print("), worked time: ");
  Serial.print(mm0);
  Serial.println(" ms");
  delay(50);
}
Навеяно гонять double и float массивами этим -> https://esp8266.ru/forum/threads/rtl8710bn-potreblenie-cpu.3190/page-6#post-49118 :)
Конкретно tpm_server/main.c at master · MBleiders/tpm_server · GitHub
На RTL скомпилил это путем мелких замен названий процедур и получил скорость в десятки кsps... А с ESP32 - не выходит... :(
Эх, божешь ты мой.... Это еще и через ардуиновские библиотеки все пропихивается? ... Нахрена?
Вообще, знаете сколько выполняется команда в arduino "Serial.print" ? И до кучи библиотеки "delay"... Как выражаются у нас профи-программисты:- "Говнокодище!"
Берите SDK и используйте хотя бы макросы оттуда, если уж сами не можете человеческий таймер написать, и никогда не используйте ардуиновский "Serial.print" при подсчетах времени.
Поэтому все относительно. Можно через кучу библиотек управлять включением светодиода, и плакаться, что все тормозит, а можно прямым управлением регистра это делать и не создавать себе буфера из море выполняемых библиотек.
Так что Вы тут говнокодом сами себя подставили.
Чем чморить ESP, kучше бы предоставили информацию а-ля "быстрый старт на RTL" со всеми вкусняшками.
 

pvvx

Активный участник сообщества
Эх, божешь ты мой.... Это еще и через ардуиновские библиотеки все пропихивается? ... Нахрена?
Проверить данное безобразие! :);)
Вообще, знаете сколько выполняется команда в arduino "Serial.print" ? И до кучи библиотеки "delay"... Как выражаются у нас профи-программисты:- "Говнокодище!"
Оно в тесте не участвует. Глаза откройте :)
Берите SDK и используйте хотя бы макросы оттуда, если уж сами не можете человеческий таймер написать, и никогда не используйте ардуиновский "Serial.print" при подсчетах времени.
А как-же "дети"?
У меня даже в Arduino к RTL только классический printf().
Поэтому все относительно. Можно через кучу библиотек управлять включением светодиода, и плакаться, что все тормозит, а можно прямым управлением регистра это делать и не создавать себе буфера из море выполняемых библиотек.
Так что Вы тут говнокодом сами себя подставили.
Где? Конкретнее?
Чем чморить ESP, kучше бы предоставили информацию а-ля "быстрый старт на RTL" со всеми вкусняшками.
Обойдетесь. Там так всё всё в базе в норме. Включите биты eFuse отключающие стартовый вывод в логUART - будет ещё быстрее старт.
Вот только не надо повторять за EMW3080 (MXCHIP) - там просто переключают в eFuse входы/выходы logUART на невыведенные ноги :)

ESP32 тоже неплохо (быстро) стартует. Но не в ESP-IDF :)

Та и вы как-то странно подходите... Чипов много и мне без разницы какие... Глюки у ESP есть глюки, зачем их скрывать?
А так-же зачем нужен <а-ля "быстрый старт> на нормальных чипах?
Вы операционку им напишите? Или Ардуино-писатели, такую-же как в ESP-IDF?
Вот чтобы не коверкали код на нормальные чипы сами производители (подстраивали под Arduino и закрывали бинарными либами), Arduino на них не будет.

Объясните что такое void app_main() в ESP-IDF? Где классический int main(argv, argc)?
Что это за идиотское Ардуиновское управление WiFi? Где вообще отдельный драйвер WiFi с каким классическим интерфейсом?
ЗЫЖ ESP-IDF – это чистейшая игра в Arduino blogger freak. Временное модное явление, а не <а-ля "быстрый старт>
 
Последнее редактирование:

pvvx

Активный участник сообщества
Вот тест FPU ESP32 со сбросом "кэш":
Код:
#include "Esp.h"
#include "rom/cache.h"
uint32_t delta_tt = 0;
float delta_d, delta_us, fcpu_mhz;

volatile float f1 = 1.11111111111111111111;
volatile float f2 = 4.44444444444444444444;

volatile float fSum;
volatile float fSqr;
volatile float fMul;
volatile float fDiv;
volatile float fPow;
volatile float fSin;
volatile float fLst;

#define count_tt 100000

void setup() {
  uint32_t tt1, tt2;
  Serial.begin(115200);
  delay(10);
  for (int i = 0; i < count_tt; i++) {
    GET_CCOUNT(tt1);
    GET_CCOUNT(tt2);
    delta_tt += tt2 - tt1;
  }
  delta_d = (float)delta_tt / (float)count_tt;
  delta_tt /= count_tt;
  Serial.print("Get CCOUNT = ");
  Serial.print(delta_d);
  Serial.println(" tik.");
}

uint32_t test(void) {
  uint32_t tt1, tt2;
  GET_CCOUNT(tt1);
  fSum = f1 + f2;
  fSqr = sqrtf(f1);
  fMul = f1 * f2;
  fDiv = f1 / f2;
  fPow = powf(f1, f2);
  fSin = sinf(f1);
  GET_CCOUNT(tt2);
  return tt2 - tt1 - delta_tt;
}

uint32_t loop_count = 0;

void loop() {
  uint32_t tt, tt1, tt2;
  Serial.println();
  Serial.print("Test["); Serial.print(loop_count); Serial.print("]");
  if ((loop_count - 1) & 2) Serial.print(", Cache_Flush");
  if (loop_count & 1) Serial.print(", Call Test()");
  Serial.println("...");
  delay(10);
  GET_CCOUNT(tt1);
  delay(100);
  GET_CCOUNT(tt2);
  tt = tt2 - tt1 - delta_tt;
  fcpu_mhz = (float)tt / 100000.0;
  Serial.print("100 ms = "); Serial.print(tt); Serial.print(" tiks -> CLK CPU ");  Serial.print(fcpu_mhz, 3);  Serial.println(" MHz ?");
  delay(10);
  if (loop_count & 1) tt = test();
  else {
    GET_CCOUNT(tt1);
    fSum = f1 + f2;
    fSqr = sqrtf(f1);
    fMul = f1 * f2;
    fDiv = f1 / f2;
    fPow = powf(f1, f2);
    fSin = sinf(f1);
    GET_CCOUNT(tt2);
    tt = tt2 - tt1 - delta_tt;
  }
  delta_us = (float)tt / fcpu_mhz;
  Serial.print("Worked time: "); Serial.print(tt);  Serial.print(" tiks (");
  Serial.print(delta_us, 3);  Serial.println(" us).");
#if 0
  Serial.print("fSum: "); Serial.print(fSum, 8);
  Serial.print(", fMul: "); Serial.print(fMul, 8);
  Serial.print(", fDiv: "); Serial.print(fDiv, 8);
  Serial.print(", fPow: "); Serial.print(fPow, 8);
  Serial.print(", fSin: "); Serial.println(fSin, 8);
#endif
  if (loop_count & 2) {
    Cache_Flush(0);
    Cache_Flush(1);
  }
  loop_count++;
  delay(3000);
}
Код:
Get CCOUNT = 1.00 tik.

Test[0], Cache_Flush...
100 ms = 24000000 tiks -> CLK CPU 240.000 MHz ?
Worked time: 27828 tiks (115.950 us).

Test[1], Call Test()...
100 ms = 24000000 tiks -> CLK CPU 240.000 MHz ?
Worked time: 2614 tiks (10.892 us).

Test[2]...
100 ms = 24000000 tiks -> CLK CPU 240.000 MHz ?
Worked time: 1496 tiks (6.233 us).

Test[3], Cache_Flush, Call Test()...
100 ms = 24000000 tiks -> CLK CPU 240.000 MHz ?
Worked time: 28665 tiks (119.438 us).

Test[4], Cache_Flush...
100 ms = 24000000 tiks -> CLK CPU 240.000 MHz ?
Worked time: 28665 tiks (119.438 us).

Test[5], Call Test()...
100 ms = 24000000 tiks -> CLK CPU 240.000 MHz ?
Worked time: 2615 tiks (10.896 us).

Test[6]...
100 ms = 24000000 tiks -> CLK CPU 240.000 MHz ?
Worked time: 1496 tiks (6.233 us)
Первый проход: 27828 тактов
Второй проход с вызовом подпрограммы: 2614 тактов
Третий проход: 1496 тактов (всё "кешированно")
После сброса "кэш" XIP - 28665 тактов

При отсутствии кода в "кэш" XIP падение производительности в 20 раз -> как CPU на 12 MГц

*Код для тестовой последовательности взят с сайта ESP, уточнение и сравнения тут.
 
Последнее редактирование:

Алексей.

Active member
При 240 МГц модули ESP32 не стартуют от USB - провал по питанию из-за 500 мА при инициализации WiFi и инициализация выходит не успешная (или виснет, или потом беды с WiFi, или ... ).
Есп32 ДевКит вопреки стартует от юсб (от десктопа), wifi клиенту транслирует rtp видео поток который получает от spi. Самое хреновое в этом решении - неожиданные лаги в wifi.
Разницы в температуре для 240 МГц когда модуль работает фактически шлюзом, я не заметил.
 

pvvx

Активный участник сообщества
Есп32 ДевКит вопреки стартует от юсб (от десктопа), wifi клиенту транслирует rtp видео поток который получает от spi. Самое хреновое в этом решении - неожиданные лаги в wifi.
Разницы в температуре для 240 МГц когда модуль работает фактически шлюзом, я не заметил.
Это не техническая информация :) Более походит на "Я так хочу".

С лагами в rtp возможно и не сам модуль виноват, а вся сеть WiFi.

Температура и затрачиваемая энергия давно измерена. Если вы её смогли уменьшить, то лучше бы описали решение - как?
Часть замеров давалась тут. После этого было найдено как заставить работать модуль на полный трансфер, но тогда у него температура уходит за +80С.
В основном, падение трансфера происходит от наличия в сети WiFi устройств с низкими характеристиками - из-за них Роутеры понижают и переключает протоколы на более медленные варианты... Это первое. Ну а далее - надо успевать подавать пакеты на передачу и правильно писать софт. Тогда модуль перегревается :) Не сбалансирован у ESP32 тепловой пакет и технические характеристики, что вынуждает тротлить трансфер. При этом он выходит за рамки в 500 мА ограничения питания по умолчанию на обычном USB питании.
Ведь у вас, кроме простого теста передачи внутренних данных работают ещё дополнительные контролеры - к примеру SPI на полную катушку, что добавляет ещё потребление и нагрев...
Было-бы всё хорошо с потреблением, не стали бы так долго отлаживать ESP-IDF и понижать частоту CPU по умолчанию и при старте...
Да и проблема перегрева решилась сама собой - ПО стало жирным и не лезет в "кэш" XIP, что само тротлит производительность CPU на уровень ниже 80 MHz.
Отношение "кэш" XIP к объему средней прошивки на ESP32 чрезмерно завышено...

По RTP - берете ESP32_FCC_WIFI_BT_20170502.bin и смотрите что рекомендует производитель - там delay между пакетами 52 (ms наверно или что?). Тогда потребление укладывается в тепловой пакет (1.25 Вт) при внешке +25С, а не в заяву operating temperature range of -40°C to 85°C.
---

В итого выходит - Алексей. работает в отделе рекламы Espressif. Можно ли у вас получить более расширенную техническую документацию по ESP32?
В частности интересует процедура default инициализации RF части WiFi для передачи готового пакета. Требуется только default загрузка регистров (без названий фиксированными значениями) и какие значения поправить для указания адреса передачи пакета из фиксированного блока в SRAM и какой бит/байт отслеживать об конце исполнения передачи. Пример кода такой процедуры можно в личку...
 
Последнее редактирование:

sir999

New member
При 240 МГц модули ESP32 не стартуют от USB - провал по питанию из-за 500 мА при инициализации WiFi и инициализация выходит не успешная (или виснет, или потом беды с WiFi, или ... ).
Памяти и так в чипе мало (безобразно мало для двух ядер и общей частоты CPUs к пол ГГц). Т.е. память забыли вообще поставить в ESP32. Поставили только "кэш", а внешнюю не предусмотрели - бюджета ноги чипу не хватило :)
Вот это абсолютнейшая ерунда. НИКОГДА не было глюка по старту, если сам в коде не накосячишь.
 

pvvx

Активный участник сообщества
Вот это абсолютнейшая ерунда.
Безусловно ерунда, т.к. ESP-32S это всего очередной бракованный чип и его не используют для рабочих вещей.
НИКОГДА не было глюка по старту, если сам в коде не накосячишь.
Вы разве не читали инструкции на чип от производителя?
Там значится внешний БП от 500 мА.
Читать вы тоже походу не умеете - в ESP-IDF и Arduino уже встроены задержки и понижение частоты при инициализации, чтобы не вылетало. В первых версиях этого не было, а так-же нет в тестовых для сертификации... Люди уже более года стараются, пишут адаптацию под Arduino в ESP-IDF...
 

pvvx

Активный участник сообщества
Это функция (void), которая ничего не возвращает, в отличие от int ...
Почему app_main()? Если мне не требуются какие-то части SDK, а нужен только WiFi драйвер, без 80211 и прочего - как написать инициализацию? Ну типа int rtl8711b_hal_init(PADAPTER padapter, ...) ?
 

pvvx

Активный участник сообщества
Счетчик Импульсов:
Pulse Counter — ESP-IDF Programming Guide v3.0-dev-1839-gc97b875 documentation
PWM:
LED Control — ESP-IDF Programming Guide v3.0-dev-1839-gc97b875 documentation
ШИМ, для генерации 40 МГц используется только в двоичном режиме (вкл-выкл) с 50% скважностью.
По таймерам для ШИМ - там же.
DMA то где?
Там-же? :D
 

sir999

New member
Безусловно ерунда, т.к. ESP-32S это всего очередной бракованный чип и его не используют для рабочих вещей.
Вы наверно себе сейчас не сможете уложить в свое сознание, но мои разработки на ESP32 в виде промышленных контроллеров на базе этого чипа, работают в Росатоме, в бурятии, в поле, круглосуточно, управляя насосными системами а также внутренними контроллерами УБЗ, частотниками Danfoss, передавая всю информацию по Modbus TCP и Modbus RTU (rs-485) на верхний уровень.
Разработка полностью с нуля, с проектирования эл. схемы и ПП, все вопросы решаемы, многие программные вопросы решаемы возможностями IDF. Памяти используется только около 5%, при этом алгоритм на 4000 строк, не считая библиотек.
И уже более простые 8266 работают на сборе информации в ЖКХ передавая по Modbus TCP в режиме Мастер.
Так что где-то вы "недогнали" по ESP32, но все охватить невозможно, главное то, к чему прикоснулся, грамотно применить.
Поэтому еще раз советую, не чморить непонятое, а рассказывать о возможностях изученного и сосзнанного.
Покажите для других свой интерес к тому, что Вам, лично Вам, интересно, и люди проявят такой же интерес к этому.
Наверное, все замечали, когда чем-то активно увлекаешься, то люди тоже начинают активно этим же увлекаться. Это происходит не только на работе, но и в командировках.
А если Вы только стараетесь чморить, то и люди отвечают вам тем же, ивлекаясь по вашему примеру.;)
 

Алексей.

Active member
Вы наверно себе сейчас не сможете уложить в свое сознание, но мои разработки на ESP32 в виде промышленных контроллеров на базе этого чипа, работают в Росатоме, в бурятии, в поле, круглосуточно
Доказывать чего либо смысла нет, и у меня работает а не не должно, и rtp с интервалами менее 25ms, в mpeg4 вполне приемлемо, на h264 похуже.
И что? всё равно этого не может быть :)
 

pvvx

Активный участник сообщества
Вы наверно себе сейчас не сможете уложить в свое сознание, но мои разработки на ESP32 в виде промышленных контроллеров на базе этого чипа, работают в Росатоме, в бурятии, в поле, круглосуточно, управляя насосными системами а также внутренними контроллерами УБЗ, частотниками Danfoss, передавая всю информацию по Modbus TCP и Modbus RTU (rs-485) на верхний уровень.
Страшно становиться...
Поэтому еще раз советую, не чморить непонятое, а рассказывать о возможностях изученного и сосзнанного.
Ну вас и просил - опишите где DMA на таймеры?
Покажите для других свой интерес к тому, что Вам, лично Вам, интересно, и люди проявят такой же интерес к этому.
Наверное, все замечали, когда чем-то активно увлекаешься, то люди тоже начинают активно этим же увлекаться. Это происходит не только на работе, но и в командировках.
А если Вы только стараетесь чморить, то и люди отвечают вам тем же, ивлекаясь по вашему примеру.;)
Во первых чморить вы начали и не только чипы. Я расписывал TTX чипов.
Что-то можете опровергнуть?
и почему-то у pvvx на это ни слова - продажник RTL7810???...
sir999 недобросовестный рекламщик ESP32???
Что не покупают у вас ESP32? :) :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
Доказывать чего либо смысла нет, и у меня работает а не не должно, и rtp с интервалами менее 25ms, в mpeg4 вполне приемлемо, на h264 похуже.
И что? всё равно этого не может быть :)
Про лаги не я писал, а вы. Теперь, описав вам что надо учесть - заработало? :)
Есп32 ДевКит вопреки стартует от юсб (от десктопа), wifi клиенту транслирует rtp видео поток который получает от spi. Самое хреновое в этом решении - неожиданные лаги в wifi.
Ну как в рекламе. Хороший товар в рекламе не нуждается.

RTP драйвер не подкинете?
 
Последнее редактирование:

pvvx

Активный участник сообщества
В упор не вижу линковки DMA к таймерам, или PWM, или capture...
Вы издеваетесь?
In the ESP32, 13 peripherals are capable of using DMA for data transfer, namely, UART0, UART1, UART2, SPI1, SPI2, SPI3, I2S0, I2S1, SDIO slave, SD/MMC host, EMAC, BT, and Wi-Fi.

Теперь ясен ваш пост ранее. Написать всякой небылицы, чтобы люди пытались повторить, путем покупки ESP32S и у них ничего не вышло.
Мне как-то более ближе - "предупрежден - значит вооружен"
 
Последнее редактирование:

pvvx

Активный участник сообщества
какой драйвер? rtp я (есп32) получаю в контейнере из spi, есп32 работает слейвом, мастером работает другой МСУ, задача есп32 обеспечить прокси и только.
Зачем тогда ESP32? На это годятся более дешевые чипы и дрова к ним есть на Linux.
Вам со сколькими антеннами для большего трансфера? Выбрать сможете сами и интерфейс у многих SDIO. В простой SPI не лезет трафик в 300 Mb/s
 
Последнее редактирование:

pvvx

Активный участник сообщества
@sir999 – вы сами пишите “можно применить те же STM32” и что “с ESP32 есть одна великая засада, которая растет по мере раскопок, это непрозрачность работы ядра”. Это и решилось бы при наличии DMA у таймеров, как в STM32 или RTL871xBx:
Код:
  * TIM4:
  *        - Base Address: TIM4
  *        - Channels: 1
  *        - Clock Source: XTAL, normally is 40MHz
  *        - Resolution: 16bit
  *        - Prescaler: 8bit
  *        - Count Mode: Upcounting
  *        - Input Pin: 1 input capture
  *        - Interrupt/DMA Generation
  *        - Support Upcounting mode/Statistic Pulse Width mode/Statistic Pulse Number mode
  * TIM5:
  *        - Base Address: TIM5
  *        - Channels: 6
  *        - Clock Source: XTAL, normally is 40MHz
  *        - Resolution: 16bit
  *        - Prescaler: 8bit
  *        - Count Mode: Upcounting
  *        - Interrupt/DMA Generation
  *        - Input Pin: 1 input capture
  *        - Ouput Pin: 6 PWM out
  *        - Support Upcounting mode/Input capture mode/PWM mode/One Pulse mode

  * TIM4:
  *        - Input Pin (TRIG):  PA_18
  *
  * TIM5:
  *        - Input Pin (TRIG):  PA_19
  *        - Output Pin:
  *            channel 0    channel 1    channel 2    channel 3    channel 4    channel 5
  *       S0:   PA_23        PA_15        PA_0         PA_30        PA_13        PA_22
  *       S1:   PA_14        PA_16        PA_17        PA_12        PA_5         NULL
  *       S2:   NULL         NULL         NULL         PA_21        PA_29        NULL
Тот-же частотомер будет выглядеть как запуск DMA на 2 канала приема + и – длительностей и последующего анализа принятого буфера, пока набирается другой. Ну и вывод частоты, девиации, джиттера и мин/макс длительности.
О PWM с управлением каждого пульса от DMA и разговора нет.

Но использовать можно всё. Есть и такое – “Суп из топора” / "Каша из топора" (с)
Для непонятливых: топор = ESP32
 
Последнее редактирование:

Алексей.

Active member
Зачем тогда ESP32? На это годятся более дешевые чипы
Не я их выбирал :)
В простой SPI не лезет трафик в 300 Mb/s
При максимальной расчетной нагрузке 5Mb/s а реальной менее 1Mb/s нет смысла обеспечивать трафик в 300 Mb/s
Точно так же как нет смысла покупать автобус для поездок на работу, хотя автобус и дешевле стОит порой.
 
Сверху Снизу