Hallo,
ich habe einen JLink EDU, mit dem ich einen STM32F407VE programmiere.
Ich habe nun teilweise sehr merkwürdiges Verhalten:
Ich starte den GDB server von Segger und programmiere mit GDB:
1 | target extended-remote :2331
|
2 | monitor speed 1000
|
3 | monitor reset
|
4 | load
|
Da funktioniert auch alles usw. Allerdings habe ich in meinem Code an
einer Stelle eine C Zeile:
1 | ret_ptr = &ring_buffer[get_index]
|
Da sollte in ret_ptr eigentlich die Adresse des Ringpuffers + Offset
(get_index) stehen.
Wenn ich mit Ozone allerdings alle Variablen, die beteiligt sind
anschaue:
ring_buffer ist 0x20001A10,
get_index ist 6,
dann steht aber nach der Code-Zeile in ret_ptr 0x20001A10. Also genau
das selbe wie in ring_buffer. Wie als ob die Zeile nicht tut. Das merke
ich auch am externen Verhalten des UARTs, für den dieser Puffer ist. Es
kommt immer das selbe Zeichen, weil die Offsetaddierung auf den Puffer
fehlschlägt.
Das Witzige daran ist: Der Code tat einige Wochen bereits. Kann dank
Versionierungssystem auch ausschließen, dass es daran Anderungen gab.
Ich bin fast bekloppt geworden bei der Fehlersuche. Habe das ELF File
disassembliert und alles sah gut aus.
Jetzt kommt aber der Hammer: Wenn ich das File einfach mit Ozone nochmal
neu geladen habe (ohne neues Kompilieren), ging alles wie erwartet.
Programmiert mit GDB -> Kaputt
Habe dann den JLink abgesteckt und wieder angesteckt -> Programmieren
mit GDB klappt auch jetzt.
Momentan kann ich den Fehler nicht mehr reproduzieren. Hatte solche
Probleme bereits häufiger mit verschiedener Target-Hardware. Habe dies
jedoch teils auf nicht neu kompilierte Projekte etc. geschoben. Das
heute hat mich 3 Stunden auf Trab gehalten und jetzt isses einfach weg.
Laut Ausgabe macht der Jlink ein Flash-Verify nach dem programmieren. Da
sollte dann ein kaputter Programmcode doch ausgeschlossen sein.
Kennt jemand solche "merkwürdigen" Phänomene?
Leider kann ich das Ganze nicht weiter debuggen, weil es jetzt weg ist.