Скрыть объявление
На нашем форуме недоступен просмотр изображений для неавторизованных пользователей. Если Вы уже зарегистрированы на нашем форуме, то можете войти. Если у Вас еще нет аккаунта, мы будем рады, если Вы к нам присоединитесь. Зарегистрироваться Вы можете здесь.

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

Тема в разделе "SDK и создание собственных прошивок", создана пользователем pvvx, 3 янв 2015.

  1. shaman1010

    shaman1010 Читатель

    Сообщения:
    128
    Симпатии:
    14
    Пока пытаюсь все прогонять вообще на стандартной 115200.
    На realterminal-е имелось ввиду:
    realterm.png
    Пока проверяю в симплексе, сначала 15 сек. в одну сторону, затем 15сек. в другую. (буфер, естественно дождался, пока доедет) На 115200 может быть так (разница значительная, причем не в ту сторону, в которую ее можно ожидать):
    tcp2uart-test.png
    а может и порвать пакет, а модуль отправить в перезагрузку.
     
  2. wifimifi

    wifimifi Новичок

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

    Andy Korg Moderator Команда форума

    Сообщения:
    416
    Симпатии:
    76
    А зачем? Компилятор сам памятью распорядится или вам надо как то точно по конкретным адресам обращаться?
     
  4. wifimifi

    wifimifi Новичок

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

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

    Сообщения:
    10.314
    Симпатии:
    1.352
    Это значит, что на стек процессора выделено 32416 байта в памяти. Стек в SDK используется активно, дырки в нем есть, т.к. код китайцев плохо по стеку оптимизирован и при старте занимает на всегда, в пустую, достаточное кол-во памяти....
     
  6. wifimifi

    wifimifi Новичок

    Сообщения:
    5
    Симпатии:
    0
    Значит остальные 131072-32416 байт используются хаотично и остается полагаться только на компилятор?
     
  7. pvvx

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

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

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

    Сообщения:
    10.314
    Симпатии:
    1.352
    Наконец проект достиг своей главной задачи - на модуле можно помигать встроенным светодиодиком :) :
     
    Victor, THK и JustACat нравится это.
  9. wifimifi

    wifimifi Новичок

    Сообщения:
    5
    Симпатии:
    0
    Спасибо, механизм понятен. Значит, остается только назначить эти данные.
     
    Последнее редактирование: 26 мар 2015
  10. Andy Korg

    Andy Korg Moderator Команда форума

    Сообщения:
    416
    Симпатии:
    76
    А вот такая мысля есть в статье WINC1500 — Wi-Fi для IoT от Atmel по поводу энергосбережения:
    Может и на esp8266 такое можно сделать?
     
  11. pvvx

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

    Сообщения:
    10.314
    Симпатии:
    1.352
  12. windalser

    windalser Новичок

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

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

    Сообщения:
    10.314
    Симпатии:
    1.352
    Web и ни один код в исходниках при этом не активен. Активны только SDK и LwIP. Можно посмотреть и покопать, что делает таймер у LwIP и как-то уменьшать его активность. Но он вроде не часто срабатывает - не сильно чаще "беакона".
    Измерять сложно - необходим ещё один специальный макет, в котором все проводки, кроме питания, от модуля отключены. А у меня для тестов несколько макетов и там подключены внешние интерфейсы (FT2232) и отдирать всё туда-сюда для замеров неудобно.
    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)
     
    Последнее редактирование: 26 мар 2015
  14. Andy Korg

    Andy Korg Moderator Команда форума

    Сообщения:
    416
    Симпатии:
    76
    Ну и ладно, ну и не очень то и хотелось :)
    Datasheet у Atmel конечно круче чем у esp.
     
  15. windalser

    windalser Новичок

    Сообщения:
    64
    Симпатии:
    4
    Я пробовал на простейшей программе - hello world. Установил режим станции и light sleep. Даже таймер не запускал.
    Может ли запущенный таймер блокировать низкое потребление - не знаю. Вообще-то не должен, если для его работы не требуется работающий микропроцессор.
    Произойдет ли запуск тактовой процессора по исчерпанию таймера - скорее, нет. Говорят, что выход из light sleep возможен по внешнему прерыванию (уровневому).

    Эт точно. Да и у меня нет чудо-измерителя.. Измерять желательно, как минимум раз в 1 мс.. Для полного исключения подпитки модуля достаточно отключать TX (CP2103..) - важно для deep sleep измерений. Для light sleep , думаю, TX отключать не обязательно.
     
  16. pvvx

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

    Сообщения:
    10.314
    Симпатии:
    1.352
    Без отключения выходов с 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В...
    По этому, что там намеряли для рекламы китайцы - неизвестно.
     
    Последнее редактирование: 26 мар 2015
  17. windalser

    windalser Новичок

    Сообщения:
    64
    Симпатии:
    4
    Сталкивался с таким.. даже ограничивал напряжение на выходе до 3V, чтобы не мешало.. (на GSM модулях)..
    А вот почему ток потребления не снижается - загадка. Правда на новом SDK 1.0.0 еще не пробовал.
     
  18. pvvx

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

    Сообщения:
    10.314
    Симпатии:
    1.352
    Достаточно посмотреть реализацию этого дела в коде... Отличий от 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 (беглый реверс):
    Код (C):
    1.  
    2. uint8 cpu_overclock;
    3. bool system_update_cpu_freq(uint8 freq)
    4. {
    5.     if(freq == 80) {
    6.         HWREG(PERIPHS_DPORT_BASEADDR,0x14) &= 0x7E;
    7.         system_update_cpu_freq(80);
    8.         return true;
    9.     }
    10.     if(freq == 160) {
    11.         HWREG(PERIPHS_DPORT_BASEADDR,0x14) |= 0x01;
    12.         system_update_cpu_freq(160);
    13.         return true;
    14.     }
    15.     return false;
    16. }
    17. uint8 system_get_cpu_freq(void)
    18. {
    19.     return ets_get_cpu_frequency();
    20. }
    21. bool system_overclock(void)
    22. {
    23.     if(system_get_cpu_freq()!=80) {
    24.         cpu_overclock = 1;
    25.         system_update_cpu_freq(160);
    26.         return true;
    27.     }
    28.     return false;
    29. }
    30. bool system_restoreclock(void)
    31. {
    32.     if(system_get_cpu_freq() == 160) {
    33.         if(cpu_overclock) {
    34.             system_update_cpu_freq(80);
    35.             return true;
    36.         }
    37.     }
    38.     return false;
    39. }
    40.  
    + ещё много добавлено ненужного кода и буферов постоянного хранения данных в heap с введением "интерфейса" по поводу загрузчика. Все данные по загрузчикам теперь лежат в heap и отнимают и так малую память...
    Всё это у китайцев названо - опимайзе :) Полная "оптимайзе" памяти уже близка. :)

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

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

    Сообщения:
    10.314
    Симпатии:
    1.352
    1) Перенесли адрес банка памяти (названной "для пользователя") в RTC:
    Код (C):
    1.  
    2. #define RTC_MEM_BASE 0x60001100
    3. #define RTC_MEM_SIZE 768
    4.  
    5. #define HWREG(BASE, OFF) (*((volatile uint32_t *)((BASE)+(OFF))))
    6. #define RTC_MEM(OFF)    HWREG(RTC_MEM_BASE, (OFF))
    7.  
    8. uint32 system_phy_temperature_alert(void)
    9. {
    10.     return phy_get_check_flag(0); // in libphy.a
    11. }
    12.  
    13. bool system_rtc_mem_read(uint8 src_addr, void *des_addr, uint16 load_size)
    14. {
    15.     int idx;
    16.     uint32_t *d = des_addr;
    17.  
    18.     if ((src_addr >= (RTC_MEM_SIZE>>2)) || ((uint32_t)des_addr & 0x3) || ((src_addr << 2) + load_size > RTC_MEM_SIZE)) {
    19.         return 0;
    20.     }
    21.  
    22.     if(load_size & 3) {
    23.         load_size += 4;
    24.         load_size &= ~3;
    25.     }
    26.  
    27.     src_addr <<= 2;
    28.  
    29.     for (idx = 0; idx < load_size; idx += 4) {
    30.         *d++ = RTC_MEM(src_addr + idx);
    31.     }
    32.  
    33.     return 1;
    34. }
    35.  
    36. bool system_rtc_mem_write(uint8 des_addr, const void *src_addr, uint16 save_size)
    37. {
    38.     int idx;
    39.     const uint32_t *d = src_addr;
    40.  
    41.     if ((des_addr >= (RTC_MEM_SIZE>>2)) || ((uint32_t)src_addr & 0x3) || ((des_addr << 2) + save_size > RTC_MEM_SIZE)) {
    42.         return 0;
    43.     }
    44.     if(save_size & 3) {
    45.         save_size += 4;
    46.         save_size &= ~3;
    47.     }
    48.  
    49.     des_addr <<= 2;
    50.  
    51.     for (idx = 0; idx < save_size; idx += 4) {
    52.         RTC_MEM(des_addr + idx) = *d++;
    53.     }
    54.  
    55.     return 1;
    56. }
    57.  
    Проще было обойтись дефайном RTC_MEM(номер ячейки) :) Такой код занимает меньше памяти, даже если требуется скопировать блок, чем код обращения к данным процедурам с передачей параметров и опроса возврата. И исполняется быстрее. :)
    Короче: с каждым новым SDK китайцы вставляют функции дублирующие ROM-BOIS и обзывают это "вводом нового API". Плюс добавляют тупенькие - типа этой system_rtc_mem_xxx. Это всё делается для развода лохов и для галочки о проделанной работе.

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

    Andy Korg Moderator Команда форума

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

Поделиться этой страницей