mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ESP maximale Array Größe


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Kolja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nabend

Da die Ausgabe von Serial.print relativ lange dauert,
schreibe ich mir einfach alle Werte in ein Array und gebe dieses nach 
der Schleife aus:
long time;
int array[2000];

void setup()
{
  Serial.begin(9600);
  pinMode(servo, OUTPUT);
  pinMode(power, OUTPUT);     digitalWrite(power, HIGH);
  pinMode(readpin, INPUT);
  Serial.println("ready!");
}


void loop()
{
  time = millis();
  digitalWrite(servo, HIGH);
  for (int i = 0; i < 300; i++)
  {
    array[i] = analogRead(A0);
    //   Serial.print(i);Serial.print(" ");Serial.println(analogRead(A0));
    delay(5);
  }


  Serial.println(millis() - time);
  digitalWrite(servo, LOW);
  for (int i = 0; i < 300; i++)
  {
    Serial.print(i);Serial.print(" ");Serial.println(array[i]);
  }
  delay(10000);
}

Die 300 Schleifendurchläufe sind schon viel zu wenig,
eigentlich bräuchte ich so 2000.

Aber schon die 300 scheinen zu viel zu sein,
da immer nut etwa 205 ausgegeben werden.

Da das Array ja irgendwo (in RAM?) gespeichert werden muss,
gehe ich davon aus, das der Speicher einfach zu klein ist.

Ist diese Annahme richtig?

Und wie könnte ich mein Problem anders lösen?

Gruß Kolja

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich nehme jetzt mal an, Du meinst mit ESP den ESP8266?

Da wären Deine 2000 int dann 8kB, das ist dann nicht das Problem.
Ich habe bei meinem Player 20kB als Buffer reserviert, incl. WLAN-Kram 
usw.

Warum läßt Du die serielle nur mit 9600Baud laufen? Die kann auch 115200 
und mehr.

Wenn Dein Programm komplett wäre, hätte ich es mal auf einen ESP8266 
geflasht und geschaut, was passiert. Deine Hardware muß dazu ja nicht 
dran sein um das zu testen.

Gruß aus Berlin
Michael

Autor: Kolja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Michael

Die Baudrate ändere ich gleich mal, danke für den Hinweis.

Der Sketch ist eigentlich komplett.
OK, bis auf den "servo" pin, der ist nicht initialisiert...

Gruß Kolja

Autor: Kolja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edit: hätte ich mal genauer hingeschaut :-)

Es gibt nach der Ausgabe einen soft WDT reset:
225 427
226 430
227 43
Soft WDT reset

ctx: cont 
sp: 3fff1770 end: 3fff1a50 offset: 01b0

>>>stack>>>
3fff1920:  feefeffe feefeffe 00000000 4000050c  
3fff1930:  3fffc278 00000002 3fff199f 40202e20  

Und das ist die Ausgabe vom Exeption Decoder:

0x40202e20: Print::write(unsigned char const*, unsigned int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 42
0x40202721: Print::write(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.h line 60
0x40202721: Print::write(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.h line 60
0x40203025: Print::printNumber(unsigned long, unsigned char) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 226
0x40203025: Print::printNumber(unsigned long, unsigned char) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 226
0x40210ee5: pm_check_mac_idle at ?? line ?
0x40211100: pm_set_sleep_mode at ?? line ?
0x40202e20: Print::write(unsigned char const*, unsigned int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 42
0x40202e20: Print::write(unsigned char const*, unsigned int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 42
0x40203083: Print::print(long, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 119
0x40202ef8: Print::println() at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 144
0x402030ae: Print::print(int, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 99
:  (inlined by) Print::println(int, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 171
0x402024c8: loop at /home/kolja/Arduino/AHA_Servo_lernen/hacked_Servo_ext_Poti_seriel.ino line 28 (discriminator 2)
0x40202f64: Print::println(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 156
0x4020283c: loop_wrapper at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/core_esp8266_main.cpp line 43
0x40100114: cont_norm at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/cont.S line 109

Scheint irgendwas mit dem Print Befehl zu tun haben.

Autor: Dauergast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void loop()
{
  time = millis();
  digitalWrite(servo, HIGH);
  for (int i = 0; i < 300; i++)
  {
    yield(); 
    array[i] = analogRead(A0);
    //   Serial.print(i);Serial.print("");Serial.println(analogRead(A0));
    delay(5);
  }


  Serial.println(millis() - time);
  digitalWrite(servo, LOW);
  for (int i = 0; i < 300; i++)
  {
    yield();
    Serial.print(i);Serial.print(" ");Serial.println(array[i]);
  }

  for (int i = 0; i < 100; i++)
  {
    yield();
    delay(100);
  }
}

yield() benutzen - für Erläuterungen esp8266 yield googlen.

Autor: Kolja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TOP!

Aber der Reihe nach:

Das Eröhen der Baudrate auf 115200 reicht volkommen aus um jede 
Millisekunde 2-3 Messungen durchzuführen.
Danke Michael

Die Yield Funktion habe ich noch nicht verstanden,
nur auf die Schnelle folgendes gefunden:
Yielding

This is one of the most critical differences between the ESP8266 and 
a more classical Arduino microcontroller. The ESP8266 runs a lot of 
utility functions in the background – keeping WiFi connected, managing 
the TCP/IP stack, and performing other duties. 
Blocking these functions from running can cause the ESP8266 to crash 
and reset itself. To avoid these mysterious resets, avoid long, 
blocking loops in your sketch.

If you have a long loop in your sketch, you can add a delay([milliseconds]) 
call within, to allow the critical background functions to execute. 
The ESP8266’s delay() funciton, while of course delaying for a set 
number of milliseconds, also makes a quick call to the background functions.

The amazing creators of the ESP8266 Arduino libraries also implemented 
a yield() function, which calls on the background functions to allow 
them to do their thing. As an example, if your sketch is waiting for 
someone to press a button attached to pin 12, creating a loop like this 
will keep the ESP8266 from crashing:
Quelle: 
https://learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide/using-the-arduino-addon

Aber die Schleife läuft mit 2000 Durchgängen!

Danke Dauergast

--
Mit Zeilenumbrüchen muss man nicht horizontal scrollen, um den Text 
lesen zu können.
-rufus

: Bearbeitet durch Moderator
Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@ Dauergast (Gast):

stimmt, in der ersten und letzten Schleife allerdings nicht zwingend, 
delay() erledigt das mit.

@Kolja (Gast):

Der ESP erledingt bei jedem Durchlauf von loop() noch etliches im 
Hintergrund (WLAN-Kram und mehr), auch wenn Du es nicht direkt benutzt.
Das macht er auch, wenn delay() aufgerufen wird.
Wenn jetzt eine Schleife sehr lange braucht (mehrere ms), um 
durchzulaufen, dann kommt er dazu nicht und nach ca. 6s schlägt sein 
Watchdog-Timer zu und löst einen Reset aus.
yield() oder auch ein delay(0) gibt ihm gelegenheit, die Sachen zu 
erledigen.

delayMicroseconds() ist auch ein kritischer Kandidat, da macht der ESP 
nichts im Hintergrund, also keine längeren Zeiten als 6000µs damit 
machen.

Deine dritte Schleife (Warteschleife) müßte eigentlich direkt gehen, 
also dealy(10000), der Wert müßte ein int sein und damit auf dem 
32Bitter groß genug.

Gruß aus Berlin
Michael

Autor: Forist (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kolja schrieb:
> Die Yield Funktion habe ich noch nicht verstanden,
> nur auf die Schnelle folgendes gefunden:

Meinst du wirklich, dass das Zitat unformatierter Text, vorbei am 
automatischen Zeilenumbruch der Forensoftware, eine gute Idee ist?

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael U. schrieb:
> delayMicroseconds() ist auch ein kritischer Kandidat, da macht der ESP
> nichts im Hintergrund, also keine längeren Zeiten als 6000µs damit
> machen.

Wie war das doch gleich mit Milli und Mikro? ;-)

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Michael U. schrieb:
>> delayMicroseconds() ist auch ein kritischer Kandidat, da macht der ESP
>> nichts im Hintergrund, also keine längeren Zeiten als 6000µs damit
>> machen.
>
> Wie war das doch gleich mit Milli und Mikro? ;-)

naja, die Milli und Mikro sind hier so falsch ja nicht, zumindest, 
solange 6000µs 6ms sind.
Falsch ist es, weil der WDT erst bei 6s zuschlägt, das ist aber auch 
hinfällig, da irgendwo steht, daß delayMicroseconds() nur irgendwas 
krummes um 15000 als Maximalwert verträgt.

Aber etwas Verwirrung ist beim ESP sowieso mitgekauft. ;)

Gruß aus Berlin
Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.