Hallo,
ich versuche gerade mein Nucleo-F767ZI dazu zu überreden eine SDCARD zu
mounten. Dabei kommt es zu einem strangen Problem.
Sobald ich f_mount irgendwo im Code aufrufen will bleibt der Nucleo nach
dem Flashen hängen, und zwar noch bevor der Code überhaupt ausgeführt
wird.
Es rumpelt dabei so heftig das der stlink das ttyACM0 verliert und ich
auch nicht mehr neu flashen kann bis ich den stlink aus und wieder
eingesteckt habe. Lasse ich f_mount auskommentiert läuft alles wie
gehabt. Ich würde es ja verstehen wenn es rumpelt sobald f_mount
aufgerufen wird, aber dazu kommt es ja gar nicht. Nicht mal mehr die
Versionsausgabe gleich nach dem Start über die UART spuckt das Ding in
diesem Fall aus. Vor allem das sich sogar der stlink dabei weghängt
finde ich ausgesprochen strange.
Mit freundlichen Grüßen
Heiko
Junger Mann schrieb:> Klingt so als ob da irgendwas überschrieben wird, was nicht> überschrieben werden sollte. Hast du irgendwo riesige Buffer angelegt?
Hab ich mir auch schon überlegt und deshalb in der STM32CubeMX den Stack
und Heap von 0x200/0x400 auf 0x400/0x800 vergrößert. Hat aber auch
nichts gebracht. Würde der stlink nicht dabei abschmieren könnte ich
wenigstens mit dem Debugger gucken. Bin am überlegen ob ich nicht in
einem nicht genutzten IRQ handler testweise mal den aufruf rein mache,
damit der Code zwar im binary ist, aber nicht aufgerufen wird und der
optimizer ihn nicht trotzdem raus schmeißt. Nächster Versuch wäre Heap
und Stack bis zum Anschlag aufzudrehen. RAM hat das Trum ja genug.
Gruß Heiko
Heiko J. schrieb:> Es rumpelt dabei so heftig das der stlink das ttyACM0 verliert
Schaltplan, bitte.
Der ST-Link hängt IIRC an der selben 3,3V Quelle, und Dein Problem kling
so als würde die einbrechen - z.B. durch Kurzschluss oder Überlast.
Eine SD Karte darf in den langsameren Modi aber nur 100mA ziehen.
Jim M. schrieb:> Heiko J. schrieb:>> Es rumpelt dabei so heftig das der stlink das ttyACM0 verliert>> Schaltplan, bitte.>> Der ST-Link hängt IIRC an der selben 3,3V Quelle, und Dein Problem kling> so als würde die einbrechen - z.B. durch Kurzschluss oder Überlast.>> Eine SD Karte darf in den langsameren Modi aber nur 100mA ziehen.
Die SD-Karte hängt an PC8-12,PD2 und der GPIO für SD-Present an PG2
direkt auf 3,3V.
Der Schaltplan ab Seite 73 im PDF:
https://www.st.com/content/ccc/resource/technical/document/user_manual/group0/26/49/90/2e/33/0d/4a/da/DM00244518/files/DM00244518.pdf/jcr:content/translations/en.DM00244518.pdf
Was aber nicht zu der 3,3 V Theorie passt, ist das der stlink schon
abschmiert bevor f_mount überhaupt aufgerufen wird. Wie schon gesagt,
ist f_mount auskommentiert läuft alles auch mit angeschlossener SD-Card.
Mit f_mount kommt aber nicht mal die boot message auf der UART die
wesentlich weiter vorne kommt.
Das der stlink abschmiert sieht man am output vom 2. Flashversuch den
ich vorhin angehängt habe.
1. Flashversuch erfolgreich
1
2019-08-03T22:52:50 INFO flash_loader.c: Successfully loaded flash loader in sram
2
enabling 32-bit flash writes
3
size: 32768
4
size: 32768
5
size: 32768
6
size: 17280
7
2019-08-03T22:52:52 INFO common.c: Starting verification of write complete
8
2019-08-03T22:52:53 INFO common.c: Flash written and verified! jolly good!
2. Flashversuch schlägt fehl
1
2019-08-03T22:53:13 INFO flash_loader.c: Successfully loaded flash loader in sram
2
enabling 32-bit flash writes
3
size: 32768
4
2019-08-03T22:53:16 ERROR flash_loader.c: flash loader run error
Heiko J. schrieb:> Was aber nicht zu der 3,3 V Theorie passt, ist das der stlink schon> abschmiert bevor f_mount überhaupt aufgerufen wird.
Das würde ich mal mit einem Oszi prüfen. Es gibt nämlich nicht viele
andere Gründe warum das tty weg gehen sollte. Was sagt eigentlich dmesg
dazu? USB Resets schreibt der Kernel aus.
Außerdem würde ich den delay vom Reset bis f_mount() versuchsweise noch
weiter vergrößern, auf so 5-10 Sekunden.
Nach dem Flashen wird oft der µC erstmal gestartet und dann nochmal
resettet (je nach Config von Flasher, Debugger etc). Die 500ms könnten
noch zuwenig sein.
Ich mache mir beim µC Start gerne mal eine LED Blinksequenz rein.
So .... kleines Update. Es sieht nur so aus als ob das tty weg fliegt,
weil ich ja zum wiederbeleben den stlink ab- und wieder anstecken muss
...
Der stlink selbst ist noch da, aber es gibt wohl einen Bug im st-flash,
dass das st-flash utility das flashen nur beim ersten mal immer richtig
macht. (https://github.com/texane/stlink/issues/607).
Ändert aber trotzdem nichts daran das der Code das target zum abkacken
bringt.
Jim M. schrieb:> Das würde ich mal mit einem Oszi prüfen. Es gibt nämlich nicht viele> andere Gründe warum das tty weg gehen sollte. Was sagt eigentlich dmesg> dazu? USB Resets schreibt der Kernel aus.
Oszi hab ich ausprobiert. Sieht gut aus. Saubere 3,3V. Ich glaub das tty
fliegt aber nicht wirklich weg. Sondern ich hab mir da selbst ein Bein
gestellt, weil nur das ab/an-stecken den st-link wieder zum laufen
bringt.
Gibt wohl einen Bug im st-flash der mich da trifft wenn das target hängt
...(https://github.com/texane/stlink/issues/607)
[1352249.572415] sd 6:0:0:0: [sdd] No Caching mode page found
42
[1352249.572420] sd 6:0:0:0: [sdd] Assuming drive cache: write through
43
[1352249.590340] sd 6:0:0:0: [sdd] Attached SCSI removable disk
>> Außerdem würde ich den delay vom Reset bis f_mount() versuchsweise noch> weiter vergrößern, auf so 5-10 Sekunden.> Nach dem Flashen wird oft der µC erstmal gestartet und dann nochmal> resettet (je nach Config von Flasher, Debugger etc). Die 500ms könnten> noch zuwenig sein.>> Ich mache mir beim µC Start gerne mal eine LED Blinksequenz rein.
Hab ich beides schon gemacht. Resultat das selbe. Der Code läuft nicht
mal an.
Gruß Heiko
So ... weiteres update. Der Code läuft prinzipiel an, aber kackt bereits
im "MX_USB_DEVICE_Init();" Ganz vorne ab ... Also im vom STM32CubeMX
generierten Code, weit bevor ich was verbrochen hab. Wenigstens komme
ich der Sache jetzt mal näher
Je mehr Debug code ich rein mache desto weiter vorne kackt alles ab.
Wahrscheinlich wird der Stack überschrieben vermute ich mal.
Ich denke damit ist das Problem wohl zumindest mal eingegrenzt.
Hab jetzt FATFS fs anstatt im Task als Variable anzulegen als Variable
im Modul angelegt damit es auf dem Heap anstatt auf dem Stack landet und
es funktioniert.
Fazit: Stack überschrieben und zusammen mit dem Bug im st-flash utility
ziemlich lange rum gesucht .....
Gruß Heiko
Heiko J. schrieb:> Fazit: Stack überschrieben und zusammen mit dem Bug im st-flash utility> ziemlich lange rum gesucht .....
So ein Bug ist ja mal echt nervig. Hast Du JLink Debugger rumfliegen
oder kannst Du die STLink umflashen?
Ich kenne bei meinen JLinks hier (auf verschiedenen Dev Boards) solche
Probleme mit (USB-)Resets nicht.
Wenn du die Variable im Task angelegt hast musste die Stackgröße des
Tasks anpassen.
Daher hats nix gebracht den globalen Stack zu vergrößern.
Guck mal wo der Task initialisiert wird, da wird auch die Stackgröße
definiert.
Die Standardstackgröße eines Task ohne manuelle Vergrößerung ist recht
klein.
Nicht, dass dieses Problem nochmal vorkommt.
Ansonsten kann man zum entwickeln bei FreeRTOS einen kleinen
Stackchecker aktivieren der per MagicWords guckt ob ein Stack zu groß
wird.