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

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

codavr

New member
кажется решилось. косяков было много. и фаервол уговаривать пришлось и проги всякие пробовал. в конце концов на дельфи пример нашёл и подправил его чтоб особо длинные пакеты не слал (200 байт)

в терминале получил:
udp 192.168.4.2:1025 [201]

мысли у меня такие, что udp ведь должен быть проще tcp, мне гарантия доставки не нужна. 1 пакет в минуту придёт и хорошо, отправлять буду штук 10 в минуту. ресурсов опять же должен меньше потреблять по ср с tcp.
 
Последнее редактирование:

pvvx

Активный участник сообщества
кажется решилось. косяков было много. и фаервол уговаривать пришлось и проги всякие пробовал. в конце концов на дельфи пример нашёл и подправил его чтоб особо длинные пакеты не слал (200 байт)

в терминале получил:
udp 192.168.4.2:1025 [201]
Нормально он всё шлет и по полтора кило...
Китайский USR-TCP232-Test.exe https://yadi.sk/d/6XQP3voHfLmsc
 
Последнее редактирование:

codavr

New member
в дельфи-примере 10кил запузыривали. просто на всякий случай :)

откликается!

ЎѕReceive from 192.168.4.1 : 1025Ўї:

Chip_id: 00fca350 Flash_id: 001640c8
sys_time:21037793 ADC:134
OPMode:2 SSID:'ESP8266' Pwd:'0123456789' Ch:1 Authmode:3 MaxCon:4 Phu:2 ACon:0
Connect status:255
heapsize: 45544
UDP pcbs:
flg:00 0.0.0.0:67 0.0.0.0:0 recv:40229580
flg:00 0.0.0.0:1025 0.0.0.0:0 recv:4022bc30
flg:00 0.0.0.0:137 0.0.0.0:0 recv:40230678
flg:04 0.0.0.0:4096 208.67.222.222:53 recv:40229c6c
Active PCB states:
none
Listen PCB states:
Port 80|18024 flg:07 tmr:0000 LISTEN
Port 12345|6394 flg:28 tmr:64695f70 LISTEN
TIME-WAIT PCB states:
none
TCP Server connections:
none
 
Последнее редактирование:

pvvx

Активный участник сообщества
Тут прикинул время записи flash после компиляции. Выходит, что можно записать всю Flash в 512 кило за 5 секунд.
Проект обычно меньше 512 к. Например коды web-свалки на сегодня до 256 кило.
Стандартное время стирания и записи у полных 512 кило составляет (при скорости 160...200 кило/сек при +25C и стандартных функциях работы с Flash через HTTP!) до 4.2 секунды.
Стирание секторов/блоков Flash из этого составляет половину времени - около 2 секунды.
Т.е. скорость заливки по прерываниям по UART должна составлять к примеру 3 МегаБит/s, чтобы за время стирания (2сек) принять 512 кило: 512*1024*11бит/2ceк = 2883584 Baud.
Надо выкидывать всякие esptool в помойку! Делать загрузчик, загружаемый в IRAM по стандартному интерфейсу программирования ESP8266 на скорости к примеру 230400 baud.
После загрузки кода ( на всё про всё уходит не более 1 сек, т.к. коду там не более 8 кило) запускать его и переходить к 3 MBaud UART. С ожиданием прихода первых ACK до 1..5 ms - Этап первичной синхронизации.
Далее Программатор:
1) Принимает данные с UART в циклический буфер памяти RAM до 80 кило (RAM у нас 96-16 кило на Bios и стек) блоками до 4 кило (больше возможны частые ошибки на больших скоростях и придется чаше 'перепередавать' блок). Передача нового блока с компа должна начинаться по приему компом ACK от Программатора. Данная коммутация при правильно писанной проге на компе не занимает более 1 ms на каждые 4 кило.
2) По приему блоков и команд Программатор стирает Flash и перекидывает данные в буфер записи в IRAM до 48 кило (IRAM у нас 64 кило без включения "кеша Flash").
3) Стирает необходимые блоки в Flash одновременно передавая ACK (- готов принять ещё) и принимая в буфер данные.
4) При накоплении для записи уже готовых блоков в IRAM, не передает ACK, а начинает писать Flash. Не передает, чтобы комп затормозил передачу данных, т.к проц ESP8266 будет занят записью Flash (передача в регистры SPI по 32 байта занимает много тактов CPU и необходимо ждать подтверждения записи...)
5) После записи блока из IRAM Программатор передает ACK. Выходит что-типа синхронизации.
6) Комп ждет ACK до передачи следующих блоков до 300ms и, если не пришел за это время - значит соединение утеряно или бага :)
Примерно псё. Кто возьмется и напишет программатор для ESP8266 с такой скоростью программирования (выходит гарантированно более 100 кило/сек)? Чтение Flash определяется исключительно скоростью UART (при 3Mbaud = 3000000/11 = 272 кило в сек).
Делать это недолго - основное время уходит на сопровождение и обяснялово 'телепузикам' как и что :)
 
Последнее редактирование:

codavr

New member
у меня сейчас стоит скорость прошивки 230400. когда была 460800, с 1го раза успешно проходило только в 30% случаев. возможно длинные (10см) неэкранированные провода, возможно дешёвый юсб-переходник. я этот момент пока не оптимизировал. иногда приходилось по 5 раз капу жать, чтоб прошилось. на 230400 тоже не всегда с 1го раза удачно, но в сумме потери времени получаются меньше.
на 3мбпс можно сразу вводить восстанавливающее кодирование :)
на esp-12e все ноги памяти выведены на внешние площадки. при желании можно зажать процу ресет и прошить память хоть на 80МГц.
а заниматься этим может второй esp, получая данные для заливки про радио (я пропустил лекцию, сколько там макс скорость вайфай обмена?)
 
Последнее редактирование:

pvvx

Активный участник сообщества
я пропустил лекцию, сколько там макс скорость вайфай обмена?
Садитесь, два.
Предел скорости записи Flash зависит от суммы времени стирания блока и его записи. Для используемых Flash это 160..200 килобайт в сек. WiFi трансфер при оптимизации на ESP8266 к 1,5 Мбайт в сек. Реализованный в VS JTAG пишет прошивку не быстрее чем через UART на пол-мегабита, хотя частота JTAG хоть десяток MHz...
Фиговое соединение с модулем из-за кривой китай-программы синхронизации по скорости (автоопределения) в ROM-BIOS и кривого ПО программатора на компе, работающего с UART. Всё писано кое-как - ведь оно типа бесплатное и создано для игры в Тамогочи с модулем (концепция Arduino) :)
 
Последнее редактирование:

codavr

New member
WiFi трансфер при оптимизации на ESP8266 к 1,5 Мбайт в сек
как бы превышает скорость стирания флеша. стало быть ей скорость программирования и ограничится.

ускорение программирования ведь не нуждается в тираже? я бы железное сделал, если бы очень приспичило. на цплд+срам+какой-нибудь интерфейс (да хоть cy7c68013a, если радио не прёт)

хотя спортивный интерес по выжиманию эффективности из имеющегося поддерживаю :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
как бы превышает скорость стирания флеша. стало быть ей скорость программирования и ограничится.
Дык об этом и разговор - получить всего половину скорости от возможной при простых алгоритмах. Это псего 5 сек на обычное приложение (~300 килобай данных для записи).
Со спортивным интересом разговор надо вести о 2-х секундах :)
ускорение программирования ведь не нуждается в тираже?
Я не понял что хотели сказать про "тиражирование".
Вот возьмем программу прошивки, используемой у Дуринщиков: Ставим скорость 230400 и смотрим, как ползут символы с межсимвольным интервалом, установленным по умолчанию в Win, но не меняемым в esp_tool.exe:
1ms.gif
Наблюдаем явный 'спортивный интерес' как можно максимально затормозить заливку ПО во Flash :) Какую скорость COM порта там не ставь, максимальный трансфер esp_tool.exe будет 1000 символов в сек, что дает прошивку в среднем от 300*1204/1000 = 307 секунд.
Целей такого 'спорта' в концепции Arduino и программ для него я не понимаю. Возможно такое делается для того, чтобы потом исправить это это, вписав настройку временных интервалов COM порта и затем ещё раз развести Дуринщиков рекламой новой быстрой загрузки или новой серией пиара в блогах :)
 
Последнее редактирование:

codavr

New member
поменял провода питания на потолще и воткнул электролит (100мкф) рядом с модулем. а также уменьшил "время ожидания" в доп. настройках компорта (диспетчер устройств). после чего заработала прошивка на скорости 921600.

Written 244736 bytes in 4.31 seconds (454.37 kbit/s)...
Leaving...
14:22:33 Build Finished (took 8s.136ms)

быстрее конечно есть куда, но я пока и этому рад :)
usb-com конвертер на ft232rl
 

codavr

New member
интересно, почему если отправить udp-пакет на адрес 127.0.0.1 , то прослушивающий данный порт коллбэк не вызывается?...
и пакет соответственно теряется.
[HASHTAG]#define[/HASHTAG] LWIP_HAVE_LOOPIF 1 поставил...
оно конечно, гарантий доставки udp никто не давал, но всё же.
 
Последнее редактирование:

pvvx

Активный участник сообщества
поменял провода питания на потолще и воткнул электролит (100мкф) рядом с модулем. а также уменьшил "время ожидания" в доп. настройках компорта (диспетчер устройств). после чего заработала прошивка на скорости 921600.

Written 244736 bytes in 4.31 seconds (454.37 kbit/s)...
Leaving...
14:22:33 Build Finished (took 8s.136ms)

быстрее конечно есть куда, но я пока и этому рад :)
usb-com конвертер на ft232rl
Это в esptool.py. Там ещё нормально.
 

pvvx

Активный участник сообщества
Потребление при прошивке модуля с помощью модифицированной esptool.py:
Power_PGM.gif
Модификация заключается в команде отключения блока WiFi на время прошивки.
Он всё равно на не той частоте работает, т.к. PLL не настроена и только жрет, да дает повышенное потребление при старте модуля пока загружается бутлоадер и инициализируют SDK (инициатива Espressif).

Потребление модулем при включенном WiFi в режиме программирования и RESET:
Power_PGM_RES_WiFi_On.gif
Потребление модулем при выключенном WiFi в режиме программирования и RESET:
Power_PGM_RES_WiFi_Off.gif
RESET и ROM-BIOS не сбрасывает на ESP8266 включенный аппаратный блок WiFi, сбрасывается только PLL (установленная таковая частота).
В итоге, если перед программной перезагрузкой модуля выключить блок WiFi, то получаем потребление на весь процесс перезагруки меньше.
 
Последнее редактирование:

codavr

New member
после установки

[HASHTAG]#define[/HASHTAG] LWIP_NETIF_LOOPBACK 1
[HASHTAG]#define[/HASHTAG] LWIP_LOOPBACK_MAX_PBUFS 1
#define LWIP_HAVE_LOOPIF 1

почему-то результат вывода списка интерфейсов
Код:
    if (netif_list != NULL)      os_printf("if0 ip: " IPSTR "\n", IP2STR(&(netif_list->ip_addr)));
    if (netif_list->next != NULL)      os_printf("if1 ip: " IPSTR "\n", IP2STR(&(netif_list->next->ip_addr)));
    if (netif_default != NULL)      os_printf("def_if ip: " IPSTR "\n", IP2STR(&(netif_default->ip_addr)));
получается такой:
if0 ip: 192.168.4.1
if1 ip: 0.0.0.0
def_if ip: 192.168.4.1

где же loopback?...

также при старте выводятся строчки:
add if0
add if1

но они есть только в файле if_hwctrl.o, в исходниках их нет.


непростая должно быть была задача... засунуть lwip в 100k ram... всё поотрезали.
 
Последнее редактирование:

pvvx

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

[HASHTAG]#define[/HASHTAG] LWIP_NETIF_LOOPBACK 1 // Поддержка отправки пакетов с IP-адреса назначения, равным Netif IP адрес, цикл их обратно в стек.
[HASHTAG]#define[/HASHTAG] LWIP_LOOPBACK_MAX_PBUFS 1 // Максимальное количество pbufs на очереди для отправки шлейфа для каждого Netif (0 = отключено)
#define LWIP_HAVE_LOOPIF 1 // Support loop interface (127.0.0.1) and loopif.c.

почему-то результат вывода списка интерфейсов
Код:
    if (netif_list != NULL)      os_printf("if0 ip: " IPSTR "\n", IP2STR(&(netif_list->ip_addr)));
    if (netif_list->next != NULL)      os_printf("if1 ip: " IPSTR "\n", IP2STR(&(netif_list->next->ip_addr)));
    if (netif_default != NULL)      os_printf("def_if ip: " IPSTR "\n", IP2STR(&(netif_default->ip_addr)));
получается такой:
if0 ip: 192.168.4.1
if1 ip: 0.0.0.0
def_if ip: 192.168.4.1

где же loopback?...

также при старте выводятся строчки:
add if0
add if1

но они есть только в файле if_hwctrl.o, в исходниках их нет.


непростая должно быть была задача... засунуть lwip в 100k ram... всё поотрезали.
Ничего сильно не порезали. Два netif заполняются в зависимости от включенных ST и AP (g_ic.netif1, g_ic.netif2).
https://github.com/pvvx/esp8266web/blob/master/app/sdklib/system/app_main.c#L544
https://github.com/pvvx/esp8266web/blob/master/info/libs/main/user_interface.c#L943
С netif_default в китай-SDK есть неоднозначности...

Конкретнее - в чем бяда?
----
Лучше бы рассказали зачем в SDK всякие функции типа wifi_send_pkt_freedom()...
 
Последнее редактирование:

codavr

New member
беда в отсутствии loopback.
обошёл кривым прямым вызовом принимающей функции.
а в вайфай наверно не хватает всяких интересных функций, типа послать и принять пакет до установки всяких соединений. такой низкоуровневый обмен.
но это мои домыслы: ибо хочется включать несколько модулей и чтоб они сами выбрали среди себя главного (AP) до подключения к нему. при отвале текущего AP, соответственно, устраивали перевыборы.

а откуда пришло такое название? даже гугл руками разводит.
 
Последнее редактирование:

pvvx

Активный участник сообщества
беда в отсутствии loopback.
Поглядите у других пример, например у
Atmel Software Framework
Ну и т.д. типа:
http://www.scs.stanford.edu/histar/src/pkg/lwip/netif/loopif.c

а откуда пришло такое название? даже гугл руками разводит.
Китайцы :)
Поиском в первую очередь всё проверено. Оно обращается к ieee80211_freedom_output()...
Обращений в IoT SDK к wifi_send_pkt_freedom() нет, как и к 40% других функций. Это некий балласт, для увеличения размера кода, чтобы прошивки не лезли в 512 кило Flash.
(c) Espressif.
а в вайфай наверно не хватает всяких интересных функций, типа послать и принять пакет до установки всяких соединений. такой низкоуровневый обмен.
но это мои домыслы: ибо хочется включать несколько модулей и чтоб они сами выбрали среди себя главного (AP) до подключения к нему. при отвале текущего AP, соответственно, устраивали перевыборы.
P2P ?
 
Последнее редактирование:

pvvx

Активный участник сообщества
В SDK 1.4.0 freedom теперь описан:
Send packet freedom APIs (to send user-define 802.11 packets)
wifi_register_send_pkt_freedom_cb:register a callback for sending user-define 802.11 packets.
wifi_unregister_send_pkt_freedom_cb:unregister the callback for sending user-define 802.11 packets.
wifi_send_pkt_freedom:send user-define 802.11 packet.
 

pvvx

Активный участник сообщества
Web свалка и meSDK успешно переползла на огрызки от SDK 1.4.0
 
Сверху Снизу