• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
 
Сверху Снизу