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


von Kolja (Gast)


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:
1
long time;
2
int array[2000];
3
4
void setup()
5
{
6
  Serial.begin(9600);
7
  pinMode(servo, OUTPUT);
8
  pinMode(power, OUTPUT);     digitalWrite(power, HIGH);
9
  pinMode(readpin, INPUT);
10
  Serial.println("ready!");
11
}
12
13
14
void loop()
15
{
16
  time = millis();
17
  digitalWrite(servo, HIGH);
18
  for (int i = 0; i < 300; i++)
19
  {
20
    array[i] = analogRead(A0);
21
    //   Serial.print(i);Serial.print(" ");Serial.println(analogRead(A0));
22
    delay(5);
23
  }
24
25
26
  Serial.println(millis() - time);
27
  digitalWrite(servo, LOW);
28
  for (int i = 0; i < 300; i++)
29
  {
30
    Serial.print(i);Serial.print(" ");Serial.println(array[i]);
31
  }
32
  delay(10000);
33
}

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

von Michael U. (amiga)


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

von Kolja (Gast)


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

von Kolja (Gast)


Lesenswert?

edit: hätte ich mal genauer hingeschaut :-)

Es gibt nach der Ausgabe einen soft WDT reset:
1
225 427
2
226 430
3
227 43
4
Soft WDT reset
5
6
ctx: cont 
7
sp: 3fff1770 end: 3fff1a50 offset: 01b0
8
9
>>>stack>>>
10
3fff1920:  feefeffe feefeffe 00000000 4000050c  
11
3fff1930:  3fffc278 00000002 3fff199f 40202e20

Und das ist die Ausgabe vom Exeption Decoder:

1
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
2
0x40202721: Print::write(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.h line 60
3
0x40202721: Print::write(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.h line 60
4
0x40203025: Print::printNumber(unsigned long, unsigned char) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 226
5
0x40203025: Print::printNumber(unsigned long, unsigned char) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 226
6
0x40210ee5: pm_check_mac_idle at ?? line ?
7
0x40211100: pm_set_sleep_mode at ?? line ?
8
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
9
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
10
0x40203083: Print::print(long, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 119
11
0x40202ef8: Print::println() at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 144
12
0x402030ae: Print::print(int, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 99
13
:  (inlined by) Print::println(int, int) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 171
14
0x402024c8: loop at /home/kolja/Arduino/AHA_Servo_lernen/hacked_Servo_ext_Poti_seriel.ino line 28 (discriminator 2)
15
0x40202f64: Print::println(char const*) at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/Print.cpp line 156
16
0x4020283c: loop_wrapper at /home/kolja/.arduino15/packages/esp8266/hardware/esp8266/2.1.0/cores/esp8266/core_esp8266_main.cpp line 43
17
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.

von Dauergast (Gast)


Lesenswert?

1
void loop()
2
{
3
  time = millis();
4
  digitalWrite(servo, HIGH);
5
  for (int i = 0; i < 300; i++)
6
  {
7
    yield(); 
8
    array[i] = analogRead(A0);
9
    //   Serial.print(i);Serial.print("");Serial.println(analogRead(A0));
10
    delay(5);
11
  }
12
13
14
  Serial.println(millis() - time);
15
  digitalWrite(servo, LOW);
16
  for (int i = 0; i < 300; i++)
17
  {
18
    yield();
19
    Serial.print(i);Serial.print(" ");Serial.println(array[i]);
20
  }
21
22
  for (int i = 0; i < 100; i++)
23
  {
24
    yield();
25
    delay(100);
26
  }
27
}

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

von Kolja (Gast)


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:
1
Yielding
2
3
This is one of the most critical differences between the ESP8266 and 
4
a more classical Arduino microcontroller. The ESP8266 runs a lot of 
5
utility functions in the background – keeping WiFi connected, managing 
6
the TCP/IP stack, and performing other duties. 
7
Blocking these functions from running can cause the ESP8266 to crash 
8
and reset itself. To avoid these mysterious resets, avoid long, 
9
blocking loops in your sketch.
10
11
If you have a long loop in your sketch, you can add a delay([milliseconds]) 
12
call within, to allow the critical background functions to execute. 
13
The ESP8266’s delay() funciton, while of course delaying for a set 
14
number of milliseconds, also makes a quick call to the background functions.
15
16
The amazing creators of the ESP8266 Arduino libraries also implemented 
17
a yield() function, which calls on the background functions to allow 
18
them to do their thing. As an example, if your sketch is waiting for 
19
someone to press a button attached to pin 12, creating a loop like this 
20
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 User
von Michael U. (amiga)


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

von Forist (Gast)


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?

von Wolfgang (Gast)


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? ;-)

von Michael U. (amiga)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.