Heeft iemand hints of tips die kunnen verklaren waarom een C++/Arduino esp8266 programma door het te inhoudelijk wijzigen, met bv totaal ongebruikte code, (te) instabiel wordt om seriële data via bitbang uit te lezen ?
Ik laat mij graag verder hoe dingen daarin beter tot werking te brengen. Mochten er specifieke tldr; vragen zijn over inhoudelijk hoe/waarom/anders ipv van het boek hier beneden door te akkeren, zijn die natuurlijk ook welkom.
Bvd Peter
//--//
Het issue zelf is vrijwel identiek met wat iemand anders ooit (zonder oplossing/antwoord) had besproken op https://github.com/esp8266/Arduino/issues/4193. Een willekeurige sourcecode aanpassing, maakt de programmawerking op andere plaatsen instabiel.
////---////
Het programma zelf is o.a. multitaskend bedoeld als autonome homecontroller, o.a. daarin P1 data data afkomstig van twee meters via software middels 2 GPIO poorten om -en-om seriële bitbangend uit te lezen.
Eenmaal de telegramdata hebbend, wordt dit verder verwerkt en via MQTT naar elders gecommuniceerd.
FYI: De totale hele spaghetti en chili-concarne is te beproeven op GitHub (disfunctionele kritiek op aard of persoon, graag per DM).
Het serieel bitbangen gaat doorgaans goed totdat ik ergens (maakt totaal niet uit waar en/o die actief wordt gebruikt) programmacode verander waarna de ISR (ICACHED) bitbang soms - te vaak - in de datasoep loopt.
NB: in P1 zelf ontbreekt de synchronisatie van bytes en de gebruikte ISR/Gpio routine halverwege een byte op een verkeerd startbit kan triggeren die daarna de rest in de soep draait. Een volledig P1 telegram, wordt permanent elke 10Sec uitgelezen, bevat ca 750bytes die op snelheid van 115200Baud in ongeveer 0.8S dan al bitbangend wordt aangeboden.
Hierbij kan het (soms/frequent) voorkomen dat data vanwege timing e.d. corrupt raakt. Een datastream van bv
Gelukkig zijn er ook zg "P1 segmentgaps" van ca 0.2-0.3mS, tussen & in de verschillende datadelen, die seriële starttransport weer wat op orde brengt.
Indien ik foute data heb gelezen, probeer ik die automagisch te herstellen door het inhoudelijk al checksummend te vergelijken met een voorheen wel geslaagde actie. Fout gelezen bytes worden dan zo hersteld.
Kern is dat het programma (voor mij) prima werkt wanneer ik het eenmaal heb voorzien van totaal nutteloos "stabiliserende" code toevoegingen. Dit door in de source - maakt niet uit waar/toe - ongebruikte if-then-else, functies oof nop's bij te plaatsen of juist weg te halen. een keer zou direct denken aan corrupt/overlay waar hier geen sprake van lijkt te zijn. een source code vernadering lijkt specifiek betrekking te hebben op het ISR gedrag dat dan ineens te laat start.
Zover ik kan beoordelen lijkt er dus geen sprake van fragmentatie, overlow, stack of heap conflicten. Ik heb de boel inmiddels een keer of 3-4 van de grond af aan opnieuw gebouwd met wanneer het programma wat groter wordt, het daarmee gevoeliger wordt voor sourcecode veranderingen.
Ik ben (ooit) begonnen vanuit de gekende SoftwareSerial (https://github.com/plerup/espsoftwareserial) die ik in allerlei maten/versie heb verbouwd en voorzien heb van aanpassing om seriële poort stuurbaar te krijgen en de "data" leesbaar te krijgen op 115200Baud. De meest stabiele was versie daarin 2.4.1 die daarvoor verregaand is verbouwd zodat het specifiek o.a. werkt op P1-netbeheer telegrammen van ca 600-800bytes. Een datatelegram begint met "/" , eindigt op "!"; gevolgd door een CRC16 checksum. De verwerking van het telegram zelf, mits leesbaar, is verder geen probleem.
NB: het is uitdrukkelijk NIET mijn bedoeling de redenen, mijn (dis)kwaliteiten en werkwijze tot doel van het programma te bespreken, die te bekritiseren of te verklaren met laat staan, dat dit met ander tooling, methoden, hardware of oplossingen kan worden bereikt.
Ik kan ipv de slecht remmende auto te repareren, natuurlijk een nieuw kopen en dan prima een hardware rs232 interface inzetten. Datgene verklaard (mij) nog niet waarom een code aanpassing, tot een andere werking leidt.
Waar ik knettergek van wordt is zodra ik ook maar één byte in de source verander, het programma in meer of minder mate instabiel wordt. Ik heb versies gemaakt die bijna 100% foutloos de seriële lezen en versies dat totaal niet doen.
Ik vervolgens uren tot dagen bezig ben om op willekeurige plaatsen ad-random (dummy) code moet invoegen om het stabiel te krijgen. het meest effectieve is dan invoegen van zg NOP's machinecode instructies die daarmee de objectcode wat doet verschuiven.
Klein voorbeeld waar ik ergens een optelling of aftrekking doe, kan het al gebeuren dat de stabiliteit van de ISR routines daarmee in de soep draait. Dit wordt weer opgelost door ergens dummy code, meest effectief is invoegen van zg één of (veel) N.NOP's (Extensa assembler Instructie die de processor 1 cycle, niets laat doen).
...
Ik begon ooit simpel met de Arduino IDE en stapte later over VSCode/patformIO om het esp8266/ NodeMCU12 programma on the flyby te ontwikkelen.
Daar de boel erg gevoelig bleek op welk platform ik opereerde, heb ik de boel nu vastgezet op: espressif8266@2.5.3 , toolchain-xtensa @ 2.40802.200502 en framework-arduinoespressif8266 @ 3.20701.0 (= --> Github: esp8266 Arduino 2.7.1)
Migreren naar hogere versie van dat , als inmiddels veel vaker gedaan, blijkt effectief zinloos en is vwb het stabiel krijgen vooral tijdrovend bezigheidstherapie.
Wat ik al gevonden of geprobeerd heb : Talloze probeersel, waarom invoegen van dummycode, ongebruikte datavelde, vergroten van databufffers, invoegen van NOP/assembler instructies etc.etc.
Om het programma stabiel te krijgen voeg ik her -en der ongebruikte dummy code toe zodat het van het niet slechtwerkend gaande weg verbeterd tot bijna foutloos. Dit totdat ik het programma weer ander en dat exercitie pad opnieuw kan doen.
Vast dank
hier alles tot hier gelezen te hebben en ik beantwoord natuurlijk graag specifiek vragen mbt tot dit instabiliteitsissue. Ik neem het risico dat niemand zich hierin herkent en dat is het iig opgenomen in de annalen
van een verdere toekomst.
...
Ik laat mij graag verder hoe dingen daarin beter tot werking te brengen. Mochten er specifieke tldr; vragen zijn over inhoudelijk hoe/waarom/anders ipv van het boek hier beneden door te akkeren, zijn die natuurlijk ook welkom.
Bvd Peter
//--//
Het issue zelf is vrijwel identiek met wat iemand anders ooit (zonder oplossing/antwoord) had besproken op https://github.com/esp8266/Arduino/issues/4193. Een willekeurige sourcecode aanpassing, maakt de programmawerking op andere plaatsen instabiel.
////---////
Het programma zelf is o.a. multitaskend bedoeld als autonome homecontroller, o.a. daarin P1 data data afkomstig van twee meters via software middels 2 GPIO poorten om -en-om seriële bitbangend uit te lezen.
Eenmaal de telegramdata hebbend, wordt dit verder verwerkt en via MQTT naar elders gecommuniceerd.
FYI: De totale hele spaghetti en chili-concarne is te beproeven op GitHub (disfunctionele kritiek op aard of persoon, graag per DM).
Het serieel bitbangen gaat doorgaans goed totdat ik ergens (maakt totaal niet uit waar en/o die actief wordt gebruikt) programmacode verander waarna de ISR (ICACHED) bitbang soms - te vaak - in de datasoep loopt.
NB: in P1 zelf ontbreekt de synchronisatie van bytes en de gebruikte ISR/Gpio routine halverwege een byte op een verkeerd startbit kan triggeren die daarna de rest in de soep draait. Een volledig P1 telegram, wordt permanent elke 10Sec uitgelezen, bevat ca 750bytes die op snelheid van 115200Baud in ongeveer 0.8S dan al bitbangend wordt aangeboden.
Hierbij kan het (soms/frequent) voorkomen dat data vanwege timing e.d. corrupt raakt. Een datastream van bv
code:
wordt dan ineens gelezen als runningaway1
| 1-0:31.7.0(002*A) |
code:
.1
| 1-0:31.7.0(0aeefegeghdgeh |
Gelukkig zijn er ook zg "P1 segmentgaps" van ca 0.2-0.3mS, tussen & in de verschillende datadelen, die seriële starttransport weer wat op orde brengt.
Indien ik foute data heb gelezen, probeer ik die automagisch te herstellen door het inhoudelijk al checksummend te vergelijken met een voorheen wel geslaagde actie. Fout gelezen bytes worden dan zo hersteld.
Kern is dat het programma (voor mij) prima werkt wanneer ik het eenmaal heb voorzien van totaal nutteloos "stabiliserende" code toevoegingen. Dit door in de source - maakt niet uit waar/toe - ongebruikte if-then-else, functies oof nop's bij te plaatsen of juist weg te halen. een keer zou direct denken aan corrupt/overlay waar hier geen sprake van lijkt te zijn. een source code vernadering lijkt specifiek betrekking te hebben op het ISR gedrag dat dan ineens te laat start.
Zover ik kan beoordelen lijkt er dus geen sprake van fragmentatie, overlow, stack of heap conflicten. Ik heb de boel inmiddels een keer of 3-4 van de grond af aan opnieuw gebouwd met wanneer het programma wat groter wordt, het daarmee gevoeliger wordt voor sourcecode veranderingen.
Ik ben (ooit) begonnen vanuit de gekende SoftwareSerial (https://github.com/plerup/espsoftwareserial) die ik in allerlei maten/versie heb verbouwd en voorzien heb van aanpassing om seriële poort stuurbaar te krijgen en de "data" leesbaar te krijgen op 115200Baud. De meest stabiele was versie daarin 2.4.1 die daarvoor verregaand is verbouwd zodat het specifiek o.a. werkt op P1-netbeheer telegrammen van ca 600-800bytes. Een datatelegram begint met "/" , eindigt op "!"; gevolgd door een CRC16 checksum. De verwerking van het telegram zelf, mits leesbaar, is verder geen probleem.
NB: het is uitdrukkelijk NIET mijn bedoeling de redenen, mijn (dis)kwaliteiten en werkwijze tot doel van het programma te bespreken, die te bekritiseren of te verklaren met laat staan, dat dit met ander tooling, methoden, hardware of oplossingen kan worden bereikt.
Ik kan ipv de slecht remmende auto te repareren, natuurlijk een nieuw kopen en dan prima een hardware rs232 interface inzetten. Datgene verklaard (mij) nog niet waarom een code aanpassing, tot een andere werking leidt.
Waar ik knettergek van wordt is zodra ik ook maar één byte in de source verander, het programma in meer of minder mate instabiel wordt. Ik heb versies gemaakt die bijna 100% foutloos de seriële lezen en versies dat totaal niet doen.
Ik vervolgens uren tot dagen bezig ben om op willekeurige plaatsen ad-random (dummy) code moet invoegen om het stabiel te krijgen. het meest effectieve is dan invoegen van zg NOP's machinecode instructies die daarmee de objectcode wat doet verschuiven.
Klein voorbeeld waar ik ergens een optelling of aftrekking doe, kan het al gebeuren dat de stabiliteit van de ISR routines daarmee in de soep draait. Dit wordt weer opgelost door ergens dummy code, meest effectief is invoegen van zg één of (veel) N.NOP's (Extensa assembler Instructie die de processor 1 cycle, niets laat doen).
...
Ik begon ooit simpel met de Arduino IDE en stapte later over VSCode/patformIO om het esp8266/ NodeMCU12 programma on the flyby te ontwikkelen.
Daar de boel erg gevoelig bleek op welk platform ik opereerde, heb ik de boel nu vastgezet op: espressif8266@2.5.3 , toolchain-xtensa @ 2.40802.200502 en framework-arduinoespressif8266 @ 3.20701.0 (= --> Github: esp8266 Arduino 2.7.1)
Migreren naar hogere versie van dat , als inmiddels veel vaker gedaan, blijkt effectief zinloos en is vwb het stabiel krijgen vooral tijdrovend bezigheidstherapie.
Wat ik al gevonden of geprobeerd heb : Talloze probeersel, waarom invoegen van dummycode, ongebruikte datavelde, vergroten van databufffers, invoegen van NOP/assembler instructies etc.etc.
Om het programma stabiel te krijgen voeg ik her -en der ongebruikte dummy code toe zodat het van het niet slechtwerkend gaande weg verbeterd tot bijna foutloos. Dit totdat ik het programma weer ander en dat exercitie pad opnieuw kan doen.
Vast dank
...
Go with the flow blocking your way and use AD for achieving results