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

Разработка ‘библиотеки’ малого webсервера на esp8266.

shaman1010

Member
Я проверял на FT2232C. Драйвера у CP2104 часто не ставят скорости отличные от прописанного в них табличного значения
Пока пытаюсь все прогонять вообще на стандартной 115200.
А со скоростью что? 115200 Baud - это до 10 килобайт в секунду.
На realterminal-е имелось ввиду:
realterm.png
Про дуплекс уже писал - синхронизить пакеты надо, но всё равно скорость падает из-за самой ESP8266... Проще передавать пачками побольше - WiFi в ESP так лучше...
Пока проверяю в симплексе, сначала 15 сек. в одну сторону, затем 15сек. в другую. (буфер, естественно дождался, пока доедет) На 115200 может быть так (разница значительная, причем не в ту сторону, в которую ее можно ожидать):
tcp2uart-test.png
а может и порвать пакет, а модуль отправить в перезагрузку.
 

wifimifi

New member
Вопрос к знатокам WebBase, не подскажете, если MemAnalyzer выдал такую картину bss| Uninitialized Data (RAM)| 3FFE9CF0| 3FFF1B90| 32416. Означает-ли это, что эту память можно использовать под свои задачи, и 32416 не затрется, там какие-то данные. Надо делать кормушку для домашних. Дальномер для слепых, у кого есть время, только, есть-ли у данного модуля прерывание по событию "захват"? Или точнее, каким образом можно поискать адреса свободного от операций пространства RAM. спасибо
 
Последнее редактирование:

wifimifi

New member
А зачем? Компилятор сам памятью распорядится
Компилятор должен знать, какой объем данных будет через ram в irom перегоняться в свободный участок за WebFiles, иначе, не зная объем и распределение памяти, свои переменные при исчезновении питания не сохранишь. Функция записи во flash берет указатель на ram, а сколько там можно не опасаясь резервировать, чтобы буфер статически там не висел, компилятор будет-ли знать? Или, не дает-ли объективной информации о ram MemAnalyzer? Я новичок, и таких нюансов не знаю, а эта память, кого-хочешь запутает.
 
Последнее редактирование:

pvvx

Активный участник сообщества
подскажете, если MemAnalyzer выдал такую картину bss| Uninitialized Data (RAM)| 3FFE9CF0| 3FFF1B90| 32416.
Это значит, что на стек процессора выделено 32416 байта в памяти. Стек в SDK используется активно, дырки в нем есть, т.к. код китайцев плохо по стеку оптимизирован и при старте занимает на всегда, в пустую, достаточное кол-во памяти....
 

pvvx

Активный участник сообщества
Значит остальные 131072-32416 байт используются хаотично и остается полагаться только на компилятор?
Остальное используется по назначению. В heap - это "куча" где распределяется память данных. Rodata - это где хранятся константы. Iram - это где находятся не "кешируемые" процедуры для быстрого доступа (но она частично и бесцельно забита китайским загрузчиком). Ещё есть встроенная в чип ROM и внешняя flash. И маленькая доступная область памяти в часах (RTC) со своим питанием на 512 байт. Но ножка питания часиков не выведена на всех модулях из-за коммерческих причин у китайцев...
 

pvvx

Активный участник сообщества
Наконец проект достиг своей главной задачи - на модуле можно помигать встроенным светодиодиком :) :
 

Andy Korg

Moderator
Команда форума
А вот такая мысля есть в статье WINC1500 — Wi-Fi для IoT от Atmel по поводу энергосбережения:
"При работе в режиме станции можно включить режим энергосбережения с длинным названием Automatic Deep Power Save mode. При этом WINC1500 автоматически распознает интервал между маяками (beacons), которые излучает точка доступа, и «засыпает» в интервалах между ними. Перед излучением маяка микросхема просыпается и принимает сообщения, если таковые имеются. Другими словами, такой режим энергосбережения является «прозрачным» для точки доступа и удаленных устройств, ибо не влияет на процессы приема/передачи данных."
Может и на esp8266 такое можно сделать?
 

pvvx

Активный участник сообщества

windalser

New member
А вот такая мысля есть в статье WINC1500 — Wi-Fi для IoT от Atmel по поводу энергосбережения:

Может и на esp8266 такое можно сделать?
Да, такой режим предусмотрен - это light sleep.
http://esp8266.ru/forum/threads/razrabotka-biblioteki-malogo-webservera-na-esp8266.56/page-15 - здесь я писал про него.
Однако добиться ожидаемого потребления менее 2 мА у меня не получилось.
 

pvvx

Активный участник сообщества
Однако добиться ожидаемого потребления менее 2 мА у меня не получилось.
Web и ни один код в исходниках при этом не активен. Активны только SDK и LwIP. Можно посмотреть и покопать, что делает таймер у LwIP и как-то уменьшать его активность. Но он вроде не часто срабатывает - не сильно чаще "беакона".
Измерять сложно - необходим ещё один специальный макет, в котором все проводки, кроме питания, от модуля отключены. А у меня для тестов несколько макетов и там подключены внешние интерфейсы (FT2232) и отдирать всё туда-сюда для замеров неудобно.
WINC1500 Atmel по поводу энергосбережения
http://wless.ru/technology/?action=details&id=577&pf=tech&pf_id=7&prod=7&tech=7&type=141
Эксплуатационные характеристики:
  • Питание: 2.5 - 4.2 В
  • Габариты: 5.0 х 5.0 x 0.85 мм
  • Энергопотребление:
    172 мА (передача) 70 мА (приём)
    1 мА (Doze) :)
    600 мкА (Standby)
    3 мкА (Deep Sleep)
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
Ну и ладно, ну и не очень то и хотелось :)
Datasheet у Atmel конечно круче чем у esp.
 

windalser

New member
Web и ни один код в исходниках при этом не активен. Активны только SDK и LwIP. Можно посмотреть и покопать, что делает таймер у LwIP и как-то уменьшать его активность. Но он вроде не часто срабатывает - не сильно чаще "беакона".
Я пробовал на простейшей программе - hello world. Установил режим станции и light sleep. Даже таймер не запускал.
Может ли запущенный таймер блокировать низкое потребление - не знаю. Вообще-то не должен, если для его работы не требуется работающий микропроцессор.
Произойдет ли запуск тактовой процессора по исчерпанию таймера - скорее, нет. Говорят, что выход из light sleep возможен по внешнему прерыванию (уровневому).

Измерять сложно - необходим ещё один специальный макет, в котором все проводки, кроме питания, от модуля отключены. А у меня для тестов несколько макетов и там подключены внешние интерфейсы (FT2232) и отдирать всё туда-сюда для замеров неудобно.
Эт точно. Да и у меня нет чудо-измерителя.. Измерять желательно, как минимум раз в 1 мс.. Для полного исключения подпитки модуля достаточно отключать TX (CP2103..) - важно для deep sleep измерений. Для light sleep , думаю, TX отключать не обязательно.
 

pvvx

Активный участник сообщества
Эт точно. Да и у меня нет чудо-измерителя.. Измерять желательно, как минимум раз в 1 мс.. Для полного исключения подпитки модуля достаточно отключать TX (CP2103..) - важно для deep sleep измерений. Для light sleep , думаю, TX отключать не обязательно.
Без отключения выходов с FT-шки получаю провалы в 0 mA :) Прет из USB. Схема запитки выходов i/o FT - наипростейшая = резистор порядка 100 Ом от 5V USB + конденсатор с параллельно включенным светодиодом (белым - у них у многих такое падение при токе 10..20mA), на котором происходит ограничение до 3.1..3.3V. Т.е. FT не может дать тока на все свои выходы более 20 mA при 3.3V. Но этого вполне хватает на питание модуля в режиме приема и свечения штатным светодиодиком в его питании через внутренние диоды ESP8266 на входах модуля...
У CP обычно стоит стабилизатор 3.3V на 1A :) Нога выхода CP дает более 20 mA и без CTS/RTS соединение UART при коммуникации по сети не делают. Модуль сохраняет полную работоспособность (включая передачу и запись flash) при питании 1.71В...
По этому, что там намеряли для рекламы китайцы - неизвестно.
 
Последнее редактирование:

windalser

New member
Без отключения выходов с FT-шки получаю провалы в 0 mA :)
Сталкивался с таким.. даже ограничивал напряжение на выходе до 3V, чтобы не мешало.. (на GSM модулях)..
А вот почему ток потребления не снижается - загадка. Правда на новом SDK 1.0.0 еще не пробовал.
 

pvvx

Активный участник сообщества
Сталкивался с таким.. даже ограничивал напряжение на выходе до 3V, чтобы не мешало.. (на GSM модулях)..
А вот почему ток потребления не снижается - загадка. Правда на новом SDK 1.0.0 еще не пробовал.
Достаточно посмотреть реализацию этого дела в коде... Отличий от 0.9.5 там практически нет.
Отличия 1.0.0 от 0.9.5:
1) Перенесли адрес банка памяти (названной "для пользователя") в RTC
2) Дописан глюк при инициализации SDK, приводящий к множеству ошибок с большими Flash. Включен бездарный и никчемный код разбора по заголовку в Flash. Всё для дополнения их новым загрузчиком.
3) Увеличено кол-во никчемных буферов в "heap" для хранения никому не нужных переменных. Как итог - доступный размер памяти для приложений сократился.
4) Несколько функций дополнено дополнительной проверкой входных параметров. Но сделано это кое-как, не трогая старое. Итог - неодекватностей стало больше.
5) Путем увеличения кода и используемой памяти "запатчено" пару ошибок с управлением настроек WiFi.
6) В очередной раз патчена espconn. Но многие её уже и не используют. Я - тоже. По тому сказать что там изменилось, специально не смотрев - не могу.
7) Добавлены ещё флаги (занимающие память) в процедурах обработки WDT и т.д.
8) Приписан ненужный интерфейс работы с частотой CPU, просто переадресующий к процедурам ROM-BIOS. Итог - увеличение кода и доп. затраты стека при их вызове.

Никчемные функции в SDK 1.0.0 (беглый реверс):
Код:
uint8 cpu_overclock;
bool system_update_cpu_freq(uint8 freq)
{
    if(freq == 80) {
        HWREG(PERIPHS_DPORT_BASEADDR,0x14) &= 0x7E;
        system_update_cpu_freq(80);
        return true;
    }
    if(freq == 160) {
        HWREG(PERIPHS_DPORT_BASEADDR,0x14) |= 0x01;
        system_update_cpu_freq(160);
        return true;
    }
    return false;
}
uint8 system_get_cpu_freq(void)
{
    return ets_get_cpu_frequency();
}
bool system_overclock(void)
{
    if(system_get_cpu_freq()!=80) {
        cpu_overclock = 1;
        system_update_cpu_freq(160);
        return true;
    }
    return false;
}
bool system_restoreclock(void)
{
    if(system_get_cpu_freq() == 160) {
        if(cpu_overclock) {
            system_update_cpu_freq(80);
            return true;
        }
    }
    return false;
}
+ ещё много добавлено ненужного кода и буферов постоянного хранения данных в heap с введением "интерфейса" по поводу загрузчика. Все данные по загрузчикам теперь лежат в heap и отнимают и так малую память...
Всё это у китайцев названо - опимайзе :) Полная "оптимайзе" памяти уже близка. :)

Про отдельные дополнительные библиотеки, типа smart-config - это отдельный разговор.
Тут разгребаю в основном базовую... (libmain.a libnet80211.a libphy.a libpp.a libwpa.a)
 
Последнее редактирование:

pvvx

Активный участник сообщества
1) Перенесли адрес банка памяти (названной "для пользователя") в RTC:
Код:
#define RTC_MEM_BASE 0x60001100
#define RTC_MEM_SIZE 768

#define HWREG(BASE, OFF) (*((volatile uint32_t *)((BASE)+(OFF))))
#define RTC_MEM(OFF)    HWREG(RTC_MEM_BASE, (OFF))

uint32 system_phy_temperature_alert(void)
{
    return phy_get_check_flag(0); // in libphy.a
}

bool system_rtc_mem_read(uint8 src_addr, void *des_addr, uint16 load_size)
{
    int idx;
    uint32_t *d = des_addr;

    if ((src_addr >= (RTC_MEM_SIZE>>2)) || ((uint32_t)des_addr & 0x3) || ((src_addr << 2) + load_size > RTC_MEM_SIZE)) {
        return 0;
    }

    if(load_size & 3) {
        load_size += 4;
        load_size &= ~3;
    }

    src_addr <<= 2;

    for (idx = 0; idx < load_size; idx += 4) {
        *d++ = RTC_MEM(src_addr + idx);
    }

    return 1;
}

bool system_rtc_mem_write(uint8 des_addr, const void *src_addr, uint16 save_size)
{
    int idx;
    const uint32_t *d = src_addr;

    if ((des_addr >= (RTC_MEM_SIZE>>2)) || ((uint32_t)src_addr & 0x3) || ((des_addr << 2) + save_size > RTC_MEM_SIZE)) {
        return 0;
    }
    if(save_size & 3) {
        save_size += 4;
        save_size &= ~3;
    }

    des_addr <<= 2;

    for (idx = 0; idx < save_size; idx += 4) {
        RTC_MEM(des_addr + idx) = *d++;
    }

    return 1;
}
Проще было обойтись дефайном RTC_MEM(номер ячейки) :) Такой код занимает меньше памяти, даже если требуется скопировать блок, чем код обращения к данным процедурам с передачей параметров и опроса возврата. И исполняется быстрее. :)
Короче: с каждым новым SDK китайцы вставляют функции дублирующие ROM-BOIS и обзывают это "вводом нового API". Плюс добавляют тупенькие - типа этой system_rtc_mem_xxx. Это всё делается для развода лохов и для галочки о проделанной работе.

Походу кто-то в Espressif осознал, что для лохов есть такая "игра", в целях доп. рекламы. В сфере “hard” многие китайцы это давно освоили. Делают новую версию с ошибкой, а потом, через время, выпускают следующую версию с пиаром, что там ошибка исправлена. Но у Espressif это сложилось стихийно, по глупости их руководства… Скоро это будет задействовано на полную катушку... В данном деле перерывы между выпуском новых глюков и ремонтом старых необходимы для поддержания ажиотажа... :) Ведь распространение пиар статей у авторов о новом исправлении имеет свой цикл..
 
Последнее редактирование:

Andy Korg

Moderator
Команда форума
Значит, такое предложение (с) "Кин-дза-дза!": Может быть имеет смысл в "свалке" распостранить правило именования переменных в тильдах и на команды передаваемые в POST методе?
Предложение возникло в связи с тем, что иногда нужно передать в дочернюю страницу параметры через POST, и веб-сервер воспринимает это дело как команды и парсит в web_int_vars.c Так-то ничего страшного, но как-то неаккуратно получается.
 
Сверху Снизу