Es geht um einen Funkempfänger. Die empfangenen Binärdaten werden durch
einen Decoder geschickt (Deinterleaver, Hamming-Decoder,
Entschlüsselung) und dann über den seriellen Port ausgegeben. Mein Code
funktionierte problemlos über Jahre.
Ein kleine Änderung an ganz anderer Stelle führt aber jetzt zum totalen
Absturz, d.h. die Firmware startet neu. Der Absturz erfolgt wenn ein
neues Paket empfangen wurde.
Die Änderung ist simpel:
von
1 | if (Cfg->InterleaverEnable){...}
|
auf
1 | if (Cfg->FecEnable){...}
|
Die Stelle im Code wo die Änderung gemacht wurde ist im Sendeteil und
wird beim Empfangen eines Pakets auch überhaupt nicht durchlaufen. Das
ist bizarr.
Mein Setup ist Platformio mit MegacoreX im Arduino Framework.
Debuggen, 1. Versuch:
ATMEL-ICE, avr-gdb und VSCode. Die Tatsache, dass der Code im Debug
Modus kompiliert wird, kaschiert den Absturz, alles läuft problemlos.
Debuggen, 2. Versuch. Im release Modus kompilieren und mit assert()
herausfinden, wo genau der Absturz passiert: Der Decoder wird problemlos
durchlaufen, aber der Rücksprung in die Hauptschleife führt zum Absturz.
Irgendetwas im Decoder scheint den Programmzeiger zu überschreiben. Das
ist bizarr. Ich vermute ein Problem im Decoder, finde das Leck aber
nicht. Hier wäre ich für Hilfe und/oder Tipps dankbar. Ich hänge den
Decoder hier an, das gesamte Projekt ist hier:
https://github.com/nurazur/TiNo2
Frage: Wie kann ich das Debuggen? Wie kann eine so kleine Änderung an
komplett anderer Stelle einer Firmware so etwas bewirken? Kann es sein
dass der Compiler (Version gnu++17) - aus welchem Grund auch immer -
schuld ist?