Руководство по выбору Wi-Fi-/Bluetooth-модулей от Espressif

=AK=

New member
Для Enterprise модули вообще не пригодны.
Вчера столкнулся с тем что у юзеров зоопарк броузеров причем нормальных нет: IE да Edge. Как там работает JS сами знаете.
Т.е Enterprise модуль должен генерировать статический html который покажет даже ископаемый браузер. Это уже другие требования к ресурсам модулей.
Мне браузер не нужен. От слова "совсем". Надо к только AP подключиться, а приложение у нас свое.

...не надо. Те же яйца только в 5 раз дороже и потребление почти такое же если внимательно изучить документы.
Потребление меня тоже не сильно колышет. Достаточно, чтобы отработал несколько дней от батарейки, изредка, раз в 5-10 минут, подключаясь к WiFi для короткого сеанса связи.В этом плане ESP8266 безо всяких выкрутасов вполне устраивает.

А вот WiFi Enterprise - нужен обязательно. Но это на ESP и пр. как следует не работает. У кого-то даже иногда работает, но предсказуемости нет. Я пока тыркался с этим хламом только время зря потерял.
 

pvvx

Активный участник сообщества
Производительный двухядерный процессор работает на частотах от 80 до 240 МГц.
Каким образом он работает на 240 МГц да на два ядра. В BogoMIPS-ах (?), т.е. сколько CPU может бездельничать тактов в секунду (циклов [inline]while(i--);[/inline] в сек)?

Реальная скорость ограничена 'кеш' (буфер памяти для аппаратного отображения SPI-Flash в адресное пространство), которой кот наплакал для двух ядер, а софт SDK раздули до безумия.
Чтение в 'кеш' (аппаратное отображение SPI-Flash в адресное пространство) не превышает 20 МБ в секунду (QSPI 80MHz).
У данного процессор средний размер команды, пусть будет, 2.5 байта.
20/2.5=8.
Линейная производительность ESP равна всего 8 миллионов команд в сек на все ядра!
Это уровень первых i8086... т.е. 1978 год.


Аналогично и у ESP8266.
Пример теста скорости аппаратного отображения SPI-Flash в адресное пространство:
Код:
#include "osapi.h"
#include "user_interface.h"
#define GET_CCOUNT(x) __asm__ __volatile__("rsr.ccount %0" : "=r"(x))
extern "C" unsigned xthal_get_ccount(void);
#define TEST_CNT 1024 // размер буфера 8064258
#define FLASH_BASE     0x40200000
#define FLASH_SEG_SIZE 0x00100000
uint32_t tbuf[TEST_CNT];

void setup() {
  Serial.begin(115200);
  Serial.println("\n\nStart...");
}

uint32_t test_memcpy(void) {
  uint32_t ts, te, tt = 0;
  volatile uint32_t * fptr = (volatile uint32_t *)FLASH_BASE;
  do {
    ets_intr_lock();
    GET_CCOUNT(ts);
    os_memcpy((void *)tbuf, (void *)fptr, sizeof(tbuf));
    GET_CCOUNT(te);
    ets_intr_unlock();
    fptr += TEST_CNT; // + sizeof(tbuf);
    tt += te - ts;
  } while (((uint32_t)fptr & FLASH_SEG_SIZE) == 0);
  return tt;
}

uint32_t test_fread(void) {
  uint32_t i, ts, te, tt = 0;
  volatile uint32_t * fptr = (volatile uint32_t *)FLASH_BASE;
  do {
    ets_intr_lock();
    i = TEST_CNT;
    GET_CCOUNT(ts);
    while(i--)
      *fptr++;
    GET_CCOUNT(te);
    ets_intr_unlock();
    tt += te - ts;
  } while (((uint32_t)fptr & FLASH_SEG_SIZE) == 0);
  return tt;
}

void test() {
  delay(500);
  uint32_t x = system_get_cpu_freq();
  float a, f = x*1000000.0;
  Serial.print("CPU CLK ");
  Serial.print(x);
  Serial.print(" MHz, 1MB sflash memcpy: ");
  delay(100);
  x = test_memcpy();
  a = f/x;
  Serial.print(a);
  Serial.print(" MB/s (");
  a = x/1048576.0;
  Serial.print(a);
  Serial.print(" tCLK/byte)");
  Serial.print(", read/summ: ");
  delay(100);
  x = test_fread();
  a = f/x;
  Serial.print(a);
  Serial.print(" MB/s (");
  a = x/1048576.0;
  Serial.print(a);
  Serial.print(" tCLK/byte)");
  Serial.println();
  delay(500);
}

void loop() {
  system_update_cpu_freq(160);
  test();
  system_update_cpu_freq(80);
  test();
}
Лог:
Start...
CPU CLK 160 MHz, 1MB sflash memcpy: 19.88 MB/s (7.68 tCLK/byte), read/summ: 18.80 MB/s (8.12 tCLK/byte)
CPU CLK 80 MHz, 1MB sflash memcpy: 15.33 MB/s (4.98 tCLK/byte), read/summ: 14.12 MB/s (5.40 tCLK/byte)
CPU CLK 160 MHz, 1MB sflash memcpy: 19.84 MB/s (7.69 tCLK/byte), read/summ: 18.80 MB/s (8.12 tCLK/byte)
CPU CLK 80 MHz, 1MB sflash memcpy: 15.33 MB/s (4.98 tCLK/byte), read/summ: 14.12 MB/s (5.40 tCLK/byte)
CPU CLK 160 MHz, 1MB sflash memcpy: 19.84 MB/s (7.69 tCLK/byte), read/summ: 18.80 MB/s (8.12 tCLK/byte)
...
 

nikolz

Well-known member
Каким образом он работает на 240 МГц да на два ядра. В BogoMIPS-ах (?), т.е. сколько CPU может бездельничать тактов в секунду (циклов [inline]while(i--);[/inline] в сек)?

Реальная скорость ограничена 'кеш' (буфер памяти для аппаратного отображения SPI-Flash в адресное пространство), которой кот наплакал для двух ядер, а софт SDK раздули до безумия.
Чтение в 'кеш' (аппаратное отображение SPI-Flash в адресное пространство) не превышает 20 МБ в секунду (QSPI 80MHz).
У данного процессор средний размер команды, пусть будет, 2.5 байта.
20/2.5=8.
Линейная производительность ESP равна всего 8 миллионов команд в сек на все ядра!
Это уровень первых i8086... т.е. 1978 год.


Аналогично и у ESP8266.
Пример теста скорости аппаратного отображения SPI-Flash в адресное пространство:
Код:
#include "osapi.h"
#include "user_interface.h"
#define GET_CCOUNT(x) __asm__ __volatile__("rsr.ccount %0" : "=r"(x))
extern "C" unsigned xthal_get_ccount(void);
#define TEST_CNT 1024 // размер буфера 8064258
#define FLASH_BASE     0x40200000
#define FLASH_SEG_SIZE 0x00100000
uint32_t tbuf[TEST_CNT];

void setup() {
  Serial.begin(115200);
  Serial.println("\n\nStart...");
}

uint32_t test_memcpy(void) {
  uint32_t ts, te, tt = 0;
  volatile uint32_t * fptr = (volatile uint32_t *)FLASH_BASE;
  do {
    ets_intr_lock();
    GET_CCOUNT(ts);
    os_memcpy((void *)tbuf, (void *)fptr, sizeof(tbuf));
    GET_CCOUNT(te);
    ets_intr_unlock();
    fptr += TEST_CNT; // + sizeof(tbuf);
    tt += te - ts;
  } while (((uint32_t)fptr & FLASH_SEG_SIZE) == 0);
  return tt;
}

uint32_t test_fread(void) {
  uint32_t i, ts, te, tt = 0;
  volatile uint32_t * fptr = (volatile uint32_t *)FLASH_BASE;
  do {
    ets_intr_lock();
    i = TEST_CNT;
    GET_CCOUNT(ts);
    while(i--)
      *fptr++;
    GET_CCOUNT(te);
    ets_intr_unlock();
    tt += te - ts;
  } while (((uint32_t)fptr & FLASH_SEG_SIZE) == 0);
  return tt;
}

void test() {
  delay(500);
  uint32_t x = system_get_cpu_freq();
  float a, f = x*1000000.0;
  Serial.print("CPU CLK ");
  Serial.print(x);
  Serial.print(" MHz, 1MB sflash memcpy: ");
  delay(100);
  x = test_memcpy();
  a = f/x;
  Serial.print(a);
  Serial.print(" MB/s (");
  a = x/1048576.0;
  Serial.print(a);
  Serial.print(" tCLK/byte)");
  Serial.print(", read/summ: ");
  delay(100);
  x = test_fread();
  a = f/x;
  Serial.print(a);
  Serial.print(" MB/s (");
  a = x/1048576.0;
  Serial.print(a);
  Serial.print(" tCLK/byte)");
  Serial.println();
  delay(500);
}

void loop() {
  system_update_cpu_freq(160);
  test();
  system_update_cpu_freq(80);
  test();
}
Лог:
Start...
CPU CLK 160 MHz, 1MB sflash memcpy: 19.88 MB/s (7.68 tCLK/byte), read/summ: 18.80 MB/s (8.12 tCLK/byte)
CPU CLK 80 MHz, 1MB sflash memcpy: 15.33 MB/s (4.98 tCLK/byte), read/summ: 14.12 MB/s (5.40 tCLK/byte)
CPU CLK 160 MHz, 1MB sflash memcpy: 19.84 MB/s (7.69 tCLK/byte), read/summ: 18.80 MB/s (8.12 tCLK/byte)
CPU CLK 80 MHz, 1MB sflash memcpy: 15.33 MB/s (4.98 tCLK/byte), read/summ: 14.12 MB/s (5.40 tCLK/byte)
CPU CLK 160 MHz, 1MB sflash memcpy: 19.84 MB/s (7.69 tCLK/byte), read/summ: 18.80 MB/s (8.12 tCLK/byte)
...
альтернатива есть?
иначе это просто ворчание на тему "Все в мире плохо"
 

pvvx

Активный участник сообщества
альтернатива есть?
иначе это просто ворчание на тему "Все в мире плохо"
Какое ещё ворчание?
За всю историю ESP пробовал хоть что-то слепить на нем, но ничего не вышло.
Трафик с простейших дешевых i2c устройств что ESP8266, что ESP32 не в состоянии прокачать через свой WiFi.
С кодеками или при шифрации/дешифрации вообще полный тормоз, т.к. код в таких темах в линеечку и не помещается в "кеш" (IRAM).
С I/O вообще беда - максимальный шаг переключения (стробирования) порта GPIO ~6.6 МГц
Плюс ещё строб шины на все внутренние устройства у ядра ESP CPU - 26 МГц.
Отсутствие нормального DMA - да и негде его использовать, т.к. RAM под буфера в ESP нет. Там для кода то места нет...

Альтернатива - любой другой WiFi SoC, т.к. в большинстве дизайнов код в них исполняется из SRAM или встроенной 'параллельной' flash (иногда и с необходимой реальной cache у ядер).
Лет так эдак более 15 назад дешевый сегмент MCU уже имел Flash на 70 МГц 16 бит. 70-80 МГц держалось, т.к. более быстрее было дороже... Потом немного на этом уровне постояли и поехали далее, за счет распараллеливания и других ухищрений...
В итоге - даже старенькие STM32 перегоняют ESP в кодеках...
 

pvvx

Активный участник сообщества
Если копнуть поглубже, то в итоге обе серии ESP выходят самым не эффективными SoC по потреблению. CPU тактируется на высокой частоте, а толку кроме повышения потребления от этого нет. Незащищенные соединения по WiFi, да и без SSL в IoT и в "умный дом" не используются...
 
Сверху Снизу