• Система автоматизации с открытым исходным кодом на базе 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
Запор прошел ))). Выливает пакеты на раз.
Теперь с приемом аналогично буду пробовать тормошить и со сборками разбираться.
Огроменное спасибо.
 
Сверху Снизу