Allgemein würde ich im Embedded Bereich von Excpetions jeglicher Art
abraten.
Passiert es bereits beim werfen der Exception oder erst wenn du mit der
Exception nach dem Fangen irgendetwas machst?
Peter K. schrieb:> Passiert es bereits beim werfen der Exception oder erst wenn du mit der> Exception nach dem Fangen irgendetwas machst?
Stürzt beim werfen ab.
TR.OLL schrieb:> Stürzt beim werfen ab.
Jetzt wären detaillierte Angaben angebracht, welche Beobachtung dich zu
diesem Schluss gebracht hat.
Denke immer dran, wir sehen nicht, was du siehst.
Unabhängig vom Quelltext würde ich gerne auch mal sehen, wie du die
Stromversorgung gelöst hast. Schaltplan und Foto. Weil: Mangelhafte
Stromversorgung ist nach meiner Erfahrung die häufigste Ursache von
Ausfällen dieser Art.
Wenn man unbehandelte Exceptions sehen möchte, sollte man die Baudrate
des Seriellen Monitors (oder eines beliebigen Terminals) auf 74880 Baud
stellen.
Ansonsten, fix mal eben getestet unter Arduino, Exceptions
funktionieren, kein "Absturtz".
Und das mit einer Stromversorgung, von der Stefanus unbeirrbar
behauptet, dass sie nicht funktioniert.
Testcode:
Arduino Fanboy D. schrieb:> Und das mit einer Stromversorgung, von der Stefanus unbeirrbar> behauptet, dass sie nicht funktioniert.
Was soll diese Verleumdung? Ich habe zur Stromversorgung deines
aktuellen Aufbaus gar nichts behauptet.
Stefan ⛄ F. schrieb:> nabhängig vom Quelltext würde ich gerne auch mal sehen, wie du die> Stromversorgung gelöst hast. Schaltplan und Foto. Weil: Mangelhafte> Stromversorgung ist nach meiner Erfahrung die häufigste Ursache von> Ausfällen dieser Art.
Über den USB-Anschluss von einem wemos d1 mini.
TR.OLL schrieb:> Über den USB-Anschluss von einem wemos d1 mini.
Wenn er bei Exceptions immer abstürzt, wird die Stromversorgung wohl
nicht die Ursache sein. Passiert es aber nur manchmal, empfehle ich Dir
ein möglichst dickes USB Kabel und einen 100µF Kondensator direkt am
ESP-Modul an VCC und GND. Das NodeMCU Board, das offenbar als Vorlage
für die Wemos D1 Boards verwendet wurde, hat diesen Kondensator mit
drauf.
Stefan ⛄ F. schrieb:> Was soll diese Verleumdung? Ich habe zur Stromversorgung deines> aktuellen Aufbaus gar nichts behauptet.
Naja. nach einem Streit über gefühlte 100 Beiträge, kann ich das mit der
"Verleumdung" nun wirklich nicht akzeptieren.
Es ist dieses Board gemeint: https://www.ebay.de/itm/233174130261
Stefan ⛄ F. schrieb:> TR.OLL schrieb:>> Über den USB-Anschluss von einem wemos d1 mini.>> Wenn er bei Exceptions immer abstürzt, wird die Stromversorgung wohl> nicht die Ursache sein. Passiert es aber nur manchmal, empfehle ich Dir> ein möglichst dickes USB Kabel und einen 100µF Kondensator direkt am> ESP-Modul an VCC und GND. Das NodeMCU Board, das offenbar als Vorlage> für die Wemos D1 Boards verwendet wurde, hat diesen Kondensator mit> drauf
Ohne Exceptions stützt der ESP nich ab, also ist die Stromversorgung
nicht das Problem.
Arduino Fanboy D. schrieb:> Es ist dieses Board gemeint: Ebay-Artikel Nr. 233174130261
Ich nutze dieses Board: https://wiki.wemos.cc/products:d1:d1_mini
TR.OLL schrieb:> Ich nutze dieses Board: https://wiki.wemos.cc/products:d1:d1_mini
Den Link mag mein Browser nicht.
Aber das Bord ist ein übliches Dingen.
Exceptions sollten damit funktionieren.
Zeige doch mal die Bootmeldungen.....
Ein Log.
Ich habe mich in den letzten Tagen intensiv mit der Stromversorgung der
ESP8266 beschäftigt, Stefan F. (stefanus) hat recht; oft fehlt ein
100µF, auf den Wemos und Nachbauten sind meist nur 3x 10µF drauf, die
zudem noch andere Chips versorgen, auf dem blanken ESP8266 ist gar
keiner drauf, drinnen vermutlich ein 100nF, auf manchen Lolin Borads
tatsächlich 100µF. Ausserdem werden oft MCP1700 u.ä. verbaut, die sind
zu schwach, liefern nur 250mA (und dann mit leichtem Spannungseinbruch),
der ESP8266 zieht aber bis zu 400mA.
Arduino Fanboy D. schrieb:> Und das mit einer Stromversorgung, von der Stefanus unbeirrbar> behauptet, dass sie nicht funktioniert.
es ist ein grosser unterschied, ob einige am küchentisch funktionieren,
wie bei dir, oder in einer serienproduktion ohne nennenswerte ausfälle!
ich kann jede aussage von stefan zur esp8266 stromversorgung nur
unterstreichen und bestätigen.
mit weniger verständnis und erfahrung sieht vieles leichter aus.
man könnte auch sagen - doof, aber glücklich und das ja auch nicht so
schlecht als über-/lebenstrategie.
mt
TR.OLL schrieb:> Ist im Anhang.
Also keine Meldung in der Form:
> User exception (panic/abort/assert)> Unhandled C++ exception: NTP failed
Sondern:
> Abort called
Also kein willkürlicher "Absturz" durch z.B. Stromversorgung, sondern
ein kontrolliertes Abbrechen in irgendeinem Programmteil.
Der Stackdump zeigt dir wo Abort aufgerufen wird.
> rst cause:2
Ist in dem Fall ok
Arduino Fanboy D. schrieb:> Sondern:>> Abort called>> Also kein willkürlicher "Absturz" durch z.B. Stromversorgung, sondern> ein kontrolliertes Abbrechen in irgendeinem Programmteil.>> Der Stackdump zeigt dir wo Abort aufgerufen wird.
Und sorgt man darf das der ESP das Programm nicht abricht und neustartet
sonder weiterläuft.
Apollo M. schrieb:> es ist ein grosser unterschied, ob einige am küchentisch funktionieren,> wie bei dir, oder in einer serienproduktion ohne nennenswerte ausfälle!
Die Adapter werden in Serie produziert!
Auf Nachfrage wo der Stefanus mal irgendwann davon gehört hat, ob ein
solcher Adapter jemals versagt hat, kamen Plattitüden.
Apollo M. schrieb:> ich kann jede aussage von stefan zur esp8266 stromversorgung nur> unterstreichen und bestätigen.
Ich kann bestätigen, dass der ESP bei zu großen Schwankungen versagt.
Wobei "mir" das mit "dem" Adapter noch nicht passiert ist.
Auch nicht mit seinen Brüdern.
Der Adapter ist mit einem 1000µF Stützkondensator auf der 3,3V Seite
ausgerüstet.
Stefanus fordert irgendwo 100µF
Der darauf befindliche Regler wird bei dieser Exception
Beispielanwendung mit weniger als 80mA versorgt, im Mittel.
Der Regler zeigt eine Erwärmung von ca 10°C über Umgebung im
Dauerbetrieb.
Die Spannung am aufgesteckten ESP Board zappelt zwischen 3,33V und
3,26V.
Das ist voll im Rahmen.
Jetzt kannst du natürlich behaupten, dass meine ganzen diese Adapter
Ausnahmefälle sind und nur durch Zufall funktionieren.
Apollo M. schrieb:> mit weniger verständnis und erfahrung sieht vieles leichter aus.> man könnte auch sagen - doof, aber glücklich und das ja auch nicht so> schlecht als über-/lebenstrategie.
Und mich auch für blöd erklären, wenn es dir damit besser geht.
Es ist Fakt daß der ESP recht anspruchsvoll ist, was die Stromversorgung
betrifft. Insofern hat Stefan Recht.
Er hat hier auch nirgendwo behauptet, daß das in diesem Fall auch so
ist.
Ob das jetzt für Deinen oder den Aufbau des TO zutrifft, weiß aufgrund
fehlender Infos niemand.
Und ja, solche Abstürze führen oft zu denn merkwürdigsten Effekten.
Leute, kommt mal wieder runter. Ich denke, diese Diskussion um die
Stromversorgung hilft dem TO nicht weiter. Sein Modul stürzt
reproduzierbar immer an der gleichen Exception ab und nicht bei anderen
Aktionen. Damit ist die Stromversorgung sicher nicht seine aktuelle
Problemursache.
Stefan ⛄ F. schrieb:> Damit ist die Stromversorgung sicher nicht seine aktuelle> Problemursache.
Bei Arduino Fanboy funktioniert es ja. Insofern bin ich mir da nicht so
sicher.
Andreas B. schrieb:> Und ja, solche Abstürze führen oft zu denn merkwürdigsten Effekten.
Welche dann an unterschiedlichsten Stelle auftauchen können.
Hier haben wir keinen willkürlichen Absturz.
Sondern einen Abort.
Scheinbar reproduzierbar.
Und ja, über den Grund kann man nur spekulieren......
Denn der verursachende Code ist ja geheim, und damit völlig untestbar.
Und der Stackdump unausgewertet.
Dieser Code funktioniert:
(nochmal leicht modifiziert, das (nötige?) virtual hinzugefügt und ein
überflüssiges const entfernt, usw)
Arduino Fanboy D. schrieb:> Andreas B. schrieb:>> Und ja, solche Abstürze führen oft zu denn merkwürdigsten Effekten.> Welche dann an unterschiedlichsten Stelle auftauchen können.>> Hier haben wir keinen willkürlichen Absturz.> Sondern einen Abort.> Scheinbar reproduzierbar.>> Und ja, über den Grund kann man nur spekulieren......> Denn der verursachende Code ist ja geheim, und damit völlig untestbar.> Und der Stackdump unausgewertet.
Bei mir geht der Code auch.
Codeteil der die Exceptions nutzt:
1
time_tgetNtpTime()
2
{
3
try{
4
IPAddressntpServerIP;// NTP server's ip address
5
while(Udp.parsePacket()>0);// discard any previously received packets
6
// get a random server from the pool
7
WiFi.hostByName(ntpServerName,ntpServerIP);
8
Serial.print("ntpServerName: ");
9
Serial.println(ntpServerName);
10
Serial.print("ntpServerIP: ");
11
Serial.println(ntpServerIP);
12
sendNTPpacket(ntpServerIP);
13
uint32_tbeginWait=millis();
14
while(millis()-beginWait<5000){
15
intsize=Udp.parsePacket();
16
if(size>=NTP_PACKET_SIZE){
17
Udp.read(packetBuffer,NTP_PACKET_SIZE);// read packet into the buffer
18
// convert four bytes starting at location 40 to a long integer
Arduino Fanboy D. schrieb:> Also kein willkürlicher "Absturz" durch z.B. Stromversorgung, sondern> ein kontrolliertes Abbrechen in irgendeinem Programmteil.
Wie kann man das kontrollierte abrechen verhindern?
TR.OLL schrieb:> Wie kann man das kontrollierte abrechen verhindern?
Die Ursache suchen!
z.B. den Stackdump analysieren.
In der Arduino Welt gibt es den "ESP Exception Decoder"
Da könntest du eine Chance mit haben.
Ansonsten gefällt mir diese Zeile nicht wirklich.
> while (millis() - beginWait < 5000)
Ein delay(0) oder yield() in der Schleife ist sicherlich kein Fehler.
Denn der ganze WLAN Kram läuft in einer anderen Task und benötigt Zeit.
TR.OLL schrieb:> Hier der Teil von dem Programm, wo der Fehler liegt:
Wo du meinst, dass der Fehler sein müsste.
Leider ist auch dieser Code untestbar, da aus dem Zusammenhang gerissen.
Auch sind meine Vorschläge/Korrekturen dort noch nicht eingearbeitet.
Zusätzlich: Aktiviere doch mal alle Warnungen und beseitige diese.
Was hat der ESP Exception Decoder ergeben?
Bestätigt dieser deine Diagnose?
TR.OLL schrieb:> Bei mir geht der Code auch.
Immerhin ist damit klar, dass Exceptions grundsätzlich funktionieren,
oder habe ich dich falsch verstanden?
TR.OLL schrieb:> Peter K. schrieb:>> Allgemein würde ich im Embedded Bereich von Excpetions jeglicher Art>> abraten.>> Warum?
Ist zwar schon ein weilchen her, aber ich Antworte da dennoch drauf.
Excpetions sind in Programmen welche gewisse Echtzeitbedinungen erfüllen
müssen besonders kritisch, weil Exceptions je nach Implementierung
extrem lange brauchen. Das fügt einen relativ großen Jitter ein weil
eine Funktion viel viel länger benötigt wenn eine Exception geworfen
wird als wenn das nicht der Fall ist.
Bei einem einfachen Returnvalue ist das nicht der Fall.
Das betrifft allerdings nur Codepfade welche eine konstante oder
möglichst kurze Laufzeit haben sollten, in anderen ist es durchaus
möglich.
Exceptions verleiten aber auch oft dazu Code zu schreiben welcher den
Heap verwendet, was bei Embedded Systemen ohne Speicherbereinigung nicht
passieren sollte.
Jede Speicherallocation auf dem Heap kann zu dessen Fragmentierung
führen und irgendwann kann es sein, dass der Heap derart fragmentiert
ist, dass ein call von new malloc oder alle anderen Dinge welche
implizit den Heap verwenden nicht mehr funktionieren.
Der ISO C++ Standard schreibt dazu:
A throw-expression initializes a temporary object, called the exception
object. The memory for the exception object is allocated in an
unspecified way.
Es ist also nicht definiert wo und wie dieser Speicher erzeugt wird und
es kann daher durchaus sein, dass der Speicher auf dem Heap alloziert
wird.
Bei uns in der Arbeit haben wir daher in den Codingguidelines Excpetions
komplett verboten und wir machen alles über Returnvalues. Das ist zwar
mehr schreibarbeit, führt aber zu einem mehr vorhersehbaren Code.