• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Общие вопросы по Arduino IDE для ESP8266

JustACat

Moderator
Команда форума
добавил ESP.reset() который дергает ((void (*)(void))0x40000080)();
А почему бы не использовать именно system_restart SDK'шный? Или сознательно отход от Esspressifского SDK? Спрашиваю на полном серьезе, то есть, объясните, пожалуйста, в чем минус system_restart?
Или может он как раз в итоге и делает именно переход на 0x40000080?
 

igrr

Moderator
Команда форума
system_restart сохраняет во флэш настройки wifi перед тем, как сделать собственно restart. Но настройки сохраняются также и после всех вызовов sdk-шных функций. Зачем тогда их лишний раз сохранять?

Название да, неправильное, но вроде бы это не критично.
 

bolwoi

New member
Друзья. Подскажите, пожалуйста.
Имеем программу, посылающую в каждом цикле loop пакет по UDP.
Все передается отлично, НО вот после 326 пакета, не зависимо от его размера, проц уходит в ресет.
В чем может быть проблема?
 

JustACat

Moderator
Команда форума
bolwoi, а по времени? Нечаянно это не через 15 примерно минут происходит? (хотя, это из другой немного оперы, не выспался я сегодня)
Если нет, то попробуйте подробнее написать: приведите пример кода (лучше весь). Лог вывода в UART и т.п. (только не забывайте про теги Код и Спойлер, пожалуйста)
 

bolwoi

New member
От времени не зависит. Исключительно по числу пакетов. Я пробовал разные интервалы между посылками.
 

bolwoi

New member
Вот код:
Код:
[HASHTAG]#include[/HASHTAG] <ESP8266WiFi.h>
[HASHTAG]#include[/HASHTAG] <WiFiUdp.h>

int status = WL_IDLE_STATUS;
/*char ssid[] = "*****"; //  your network SSID (name)
char pass[] = "*****";    // your network password (use for WPA, or use as key for WEP)*/

char ssid[] = "*****"; //  your network SSID (name)
char pass[] = "*****";    // your network password (use for WPA, or use as key for WEP)

char ClientIPMask[] = "192.168.100.255";
unsigned int ClientPort = 53333;
unsigned int localPort = 2390;      // local port to listen on
char packetBuffer[255]; //buffer to hold incoming packet
char  ReplyBuffer[] = "acknowledged";       // a string to send back
byte OutBuf [10] = {0};
WiFiUDP Udp;
byte value = 0;
int packetSize = 0;

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);//: выбрать режим WIFI_AP (точка доступа), WIFI_STA (клиент), илиr WIFI_AP_STA (оба режима одновременно).
  Serial.println("BEGINING");
  WiFi.begin(ssid, pass);
  while ( WiFi.status() != WL_CONNECTED)
  {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    delay(3000);
  }
  Serial.println("Connected to wifi");
  printWifiStatus();
  delay (100);
  Udp.begin(localPort);
  delay (100);}

void loop()
{
  packetSize = Udp.parsePacket();
  if (packetSize)
  {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    int len = Udp.read(packetBuffer, 255);
    if (len > 0) packetBuffer[len] = 0;
    Serial.print("Contents: ");
    Serial.print(len );
    Serial.println("Bytes");

    Serial.println(packetBuffer);
  }

  OutBuf[0] = value;
  OutBuf[1] = value+1;
  OutBuf[2] = value+2;
  OutBuf[3] = value+3;
  OutBuf[4] = value+4;
  OutBuf[5] = value+5;
  OutBuf[6] = value+6;
  OutBuf[7] = value+7;
  OutBuf[8] = value+8;
  OutBuf[9] = value+9;

  Udp.beginPacket("192.168.100.255", 53333);
  Udp.write(OutBuf, 10);
  Udp.endPacket();
  value++;
  delay (100);
}


void printWifiStatus()
{
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);
}

Вот он лог:
Код:
Attempting to connect to SSID: TP-LINK_7D9E32
Attempting to connect to SSID: TP-LINK_7D9E32
Attempting to connect to SSID: TP-LINK_7D9E32
Attempting to connect to SSID: TP-LINK_7D9E32
Attempting to connect to SSID: TP-LINK_7D9E32
Attempting to connect to SSID: TP-LINK_7D9E32
Connected to wifi
SSID: TP-LINK_7D9E32
IP Address: 192.168.100.18

ets Jan  8 2013,rst cause:4, boot mode:(3,0)

wdt reset
load 0x40100000, len 26856, room 16
tail 8
chksum 0xf1
load 0x3ffe8000, len 2604, room 0
tail 12
chksum 0x30
ho 0 tail 12 room 4
load 0x3ffe8a30, len 1984, room 12
tail 4
chksum 0xf7
csum 0xf7

В другой версии Arduino IDE уже 354 пакета передается нормально.

Извиняйте за размашистость. Не знал как делать. Исправился.
 
Последнее редактирование модератором:

igrr

Moderator
Команда форума
@bolwoi насколько свежая у вас версия? недавно поправили баг в Udp, память не освобождалась при некоторых условиях.
Было бы полезно вставить в loop вывод текущего объема оставшейся памяти, чтобы посмотреть, из-за чего проблема:

Код:
extern "C" { 
 #include "user_interface.h" 
}
// later
Serial.println(system_get_free_heap_size());
Также можно добавить побольше отладочной инфы:
Код:
Serial.setDebugOutput(true); // <- в функции setup, после Serial.begin
и в hardware/esp8266com/esp8266/cores/esp8266/debug.h
Код:
#define DEBUGV(...) ets_printf(__VA_ARGS__)
//#define DEBUGV(...)
 

bolwoi

New member
96 пост, вторая ссылка - это, как я понимаю, последняя версия (поправите, ежели не так).
Вот в ней, и в предыдущей такая проблема. В последней в логе упоминалось что-то про heap.
В общем, сейчас попробую.
 

igrr

Moderator
Команда форума
Так, я наврал — фикс был в части, касающейся TCP. С UDP наверное что-то новое. Так как до недавнего времени он нормально и не работал, то его никто и не тестировал продолжительное время. Видимо еще какой-то баг с освобождением ресурсов.
 

bolwoi

New member
Вот что получилось:
Код:
/////////// Это начало
Attempting to connect to SSID: TP-LINK_7D9E32
scandone
add 0
aid 10
pm open phy_2,type:2 0 0
cnt 
Attempting to connect to SSID: TP-LINK_7D9E32

connected with TP-LINK_7D9E32, channel 6
dhcp client start...
Attempting to connect to SSID: TP-LINK_7D9E32
Attempting to connect to SSID: TP-LINK_7D9E32
ip:192.168.100.18,mask:255.255.255.0,gw:192.168.100.1
Connected to wifi
SSID: TP-LINK_7D9E32
IP Address: 192.168.100.18
:ur 0

34816
:ur 0

34696
:ur 0

34592
:ur 0

34488
:ur 0

34384
:ur 0

34280
:ur 0

34176
:ur 0

34072
:ur 0

33968
:ur 0

33864
:ur 0

33760
:ur 0

33656
:ur 0

33552
:ur 0

33448
:ur 0

33344
:ur 0

33240
:ur 0

33136
:ur 0

33032
:ur 0

32928
:ur 0

32824
:ur 0

32720
:ur 0

32616
:ur 0

32512
:ur 0

32408
:ur 0

32304
:ur 0

32200
:ur 0

32096

////   Конец с куском следующего начала )))
2736
:ur 0

2632
:ur 0

2528
:ur 0

2424
:ur 0

2320
:ur 0

2216
:ur 0

2112
:ur 0

2008
:ur 0

1904
:ur 0

1800
:ur 0

1696
:ur 0

1592
:ur 0

1488
:ur 0

1384
:ur 0

1280
:ur 0

1176
:ur 0

No heap available, failed to malloc 1152
Fatal exception (28):
epc1=0x402415e2, epc2=0x00000000, epc3=0x00000000, excvaddr=0x00000008, depc=0x00000000
del if0
usl
sul 3 0

 ets Jan  8 2013,rst cause:4, boot mode:(3,0)

wdt reset
load 0x40100000, len 31668, room 16 
tail 4
chksum 0xaa
load 0x3ffe8000, len 1548, room 4 
tail 8
chksum 0x57
load 0x3ffe8610, len 2476, room 0 
tail 12
chksum 0x62
csum 0x62
rяBEGINING
scandone
Attempting to connect to SSID: TP-LINK_7D9E32
scandone
add 0
aid 10
pm open phy_2,type:2 0 0
cnt 

connected with TP-LINK_7D9E32, channel 6
dhcp client start...
Attempting to connect to SSID: TP-LINK_7D9E32
Attempting to connect to SSID: TP-LINK_7D9E32
ip:192.168.100.18,mask:255.255.255.0,gw:192.168.100.1
Connected to wifi
SSID: TP-LINK_7D9E32
IP Address: 192.168.100.18
:ur 0

34816
:ur 0

34696
:ur 0

34592
:ur 0

34488
:ur 0

34384
:ur 0

34280
:ur 0

34176
:ur 0

34072
:ur 0
 

SamGold

New member
Прошу прощения что прерываю, было бы неплохо сделать еще и x32 версию для Linux, буду очень благодарен!
 

igrr

Moderator
Команда форума
@bolwoi да, баг — забыл про счетчик ссылок. Надо отрефакторить, чтобы в следующий раз не наступить на грабли.
У меня нет сейчас возможности проверить на esp, попробуйте пожалуйста применить у себя следующий патч:
Код:
diff --git a/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp b/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp
index 96928f2..7853865 100644
--- a/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp
+++ b/hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp
@@ -68,9 +68,11 @@ uint8_t WiFiUDP::begin(uint16_t port)
 {
     if (_ctx) {
         _ctx->unref();
+        _ctx = 0;
     }

     _ctx = new UdpContext;
+    _ctx->ref();
     ip_addr_t addr;
     addr.addr = INADDR_ANY;
     return (_ctx->listen(addr, port)) ? 1 : 0;
@@ -93,7 +95,7 @@ uint8_t WiFiUDP::beginMulticast(IPAddress interfaceAddr, IPAddress multicast, ui
     }

     _ctx = new UdpContext;
-    
+    _ctx->ref();
     if (!_ctx->listen(*IP_ADDR_ANY, port)) {
         return 0;
     }
@@ -135,6 +137,7 @@ int WiFiUDP::beginPacket(IPAddress ip, uint16_t port)

     if (!_ctx)
         _ctx = new UdpContext;
+    _ctx->ref();
     return (_ctx->connect(addr, port)) ? 1 : 0;
 }

Если поможет — закоммичу.
Спасибо.
 

igrr

Moderator
Команда форума
А, пардон, у вас версия не из гита. Тогда просто в hardware/esp8266com/esp8266/libraries/ESP8266WiFi/src/WiFiUdp.cpp в районе 136 строки исправьте:
Код:
    if (!_ctx) {
        _ctx = new UdpContext;
        _ctx->ref();
    }
Спасибо.
 

bolwoi

New member
У меня там вот что имеется в этом районе. Боюсь промахнуться ))).
Код:
int WiFiUDP::beginPacket(IPAddress ip, uint16_t port)
{
    ip_addr_t addr;
    addr.addr = ip;

    if (_ctx)
        _ctx->unref();
    _ctx = new UdpContext;
    return (_ctx->connect(addr, port)) ? 1 : 0;
}
Подскажите (ткните) конкретнее (сильнее). )))
 

bolwoi

New member
Он мне ошибку компиляции заявляет:
Код:
C:\arduino-1.6.1_new\hardware\esp8266com\esp8266\libraries\ESP8266WiFi\src\WiFiUdp.cpp: In member function 'uint16_t WiFiUDP::localPort()':
C:\arduino-1.6.1_new\hardware\esp8266com\esp8266\libraries\ESP8266WiFi\src\WiFiUdp.cpp:237:18: error: 'class UdpContext' has no member named 'getLocalPort'
     return _ctx->getLocalPort();
                  ^
Ошибка компиляции.
А где взять версию с недавними фиксиками? :)
Я отсюда брал https://ci.appveyor.com/api/buildjo...facts/build/windows/arduino-1.6.1-windows.zip
 

bolwoi

New member
Запор прошел ))). Выливает пакеты на раз.
Теперь с приемом аналогично буду пробовать тормошить и со сборками разбираться.
Огроменное спасибо.
 
Сверху Снизу