Heeft iemand een verklaring of ervaring dat tijdsgevoelige code (zoals de SerieleSoftlib icm Wifi-timing) van een esp8266 soms instabieler kan zijn wanneer de programmacode qua resulterende bytes (net) iets groter of kleiner is.
FYI De Wifi en Seriële libraries maken gebruik van de hardware-interrupts om hun ding te doen. Daarnaast heeft de esp8266 twee soorten geheugen, zg SRAM waarin de variabelen komen en het statische FlashRAM waarin de programmacode & constanten zijn opgenomen.
Ik heb bij verschillende NodeMCU/8266 bordjes een bizar vreemde situaties dat wanneer ik de code letterlijk 2 of 4 bytes groter/kleiner maakt, de seriele interface (softlib/bitbanging) instabiel wordt. Ook is er dan meer kans op zgt WDT reboots.
Het maakt niet zoveel uit of ik de dingen compileer/laadt met VSC/PlatformIO of Arduino. Ik heb bv van een programma twee versies die letterlijk één byte schillen waar de één stabiel en de ander zomaar 10% instabieler is. Wordt het verschil in grootte 2-3 btes, kan het zelfs onwerkbaar worden.
Nu ik ten lange leste, weet en ik na een wijziging die ingewenste (interrupt gedreven) instabiliteit krijg (dwz sponatane reboots of verlies van rs232 bits) voeg ik ad-random wat (contstante) slackbytes en eventueel dummy-code toe om proefondervinderlijk, de boel weer stabiel te krijgen. Code executie vertragen of NOP's toevoegen, Delays of extra Yields toevoegen (zodat Wifi actief blijft) heeft in dit geval - buiten dat het de code kleiner of groter maakt - geen werkingseffect.
Soms best tijdrovend - om na een wijzgiging weer het equilibrium te vinden - waarbij de code uitvoering van de 8266 weer stabiel wordt.
Hoewel dat voor de esp8266 niet van toepassing moeten zijn en dan sws door de compiler zou moeten worden afgeregeld, lijkt het effect een beetje of code/segmenten op één of andere manier page/boundary/locatie afhankelijk zijn. Kan ms ook zijn dat niet alle het memory van een esp8266 even vrij is van bitfouten en dan door het verschuiven de boel beter werkt.
NB: vanwege timing en andere issues, gebruik ik voor de esp8266 - nog steeds - de "oude" 2.4.1. seriallibrary.
De nieuwere serieële softwarelibraries gaan anders om met de verwerking van een seriële bitstream: dwz bij seriëleinput, eerst een grote "raw bitbufferstream" inlezen en die daarna omzetten naar leesbare rs232 ipv dit per byte/interrupt - realtime - per 8 bits te doen.
De nieuwere methode (raw-read) is beter bruikbaar voor hogere snelheden en afwijkende bitcoderingen dan hooguit 115K2-8N1 waarvoor de esp8266 met "per-byte/bitbanging" niet snel genoeg is.
[
Voor 8% gewijzigd door
PtrO op 04-03-2023 00:10
]