Hallo Leute,
ich versuche mich derzeit an einem Projekt mit einem kleinen STF32F042,
den ich über USB (VCP) anspreche.
USB Code mit CubeMX generiert, der STM hat keinen Quarz sondern holt
sich den Takt vom USB.
Das funktioniert im Debug-Modus hervorragend, wenn ich als Release
kompiliere meldet sich der STM aber am USB nicht korrekt an.
Hat jemand eine Idee, woran das liegen könnte?
Danke, Alex
Vielleicht ein Timing Problem, irgendetwas läuft zu schnell.
Da war doch was mit einer ID Nummer, die der PC dem µC zuweist. Der µC
muss diese Zuweisung bestätigen, darf aber erst danach die ID Nummer
anwenden (in ein Register schreiben).
Vielleicht hat es damit zu tun.
Jemand hat hier mal empfohlen, die Kommunikation mit Wireshark zu
analysieren, ich konnte mit der Flut an Output allerdings nichts
anfangen. Als bei mir mal USB nicht funktionierte, kam ich besser mit
zahlreichen Debug-Meldungen klar, die ich ins Programm einfügte.
Mit Debug Meldungen konnte die Pakete (ohne Details) protokollieren, die
hin und her gesendet wurden. Da habe ich dann die guten Fälle mit den
schlechten verglichen und bin so ziemlich schnell auf die fehlerhafte
Stelle gekommen.
Vielleicht bringt dich diese Vorgehensweise auch weiter. Ist einen
Versuch wert.
Stefanus F. schrieb:> Jemand hat hier mal empfohlen, die Kommunikation mit Wireshark zu> analysieren, ich konnte mit der Flut an Output allerdings nichts> anfangen.
Man muss halt genau schauen was zum eigenen Gerät gehört. Wireshark kann
da schon sehr hilfreich sein. Das Gerät an einem Linux-PC anschließen
und die Kernel-Meldungen ansehen (dmesg) ist ebenfalls sehr nützlich.
pegel schrieb:> Das hört sich an, als wurde etwas wichtiges weg-optimiert.
Gut möglich. Vielleicht enthält die ST Library fehlerhaften Code,
welcher sich auf Undefined Behaviour verlässt, von dem der Compiler
annehmen darf, dass es nie auftritt, und es so wegoptimiert...
Schönen Abend!
Hab mittlerweile rausgefunden, dass das Verhalten etwas mit den
Optimierungs-levels zu tun hat.
Was genau die Ursache ist, ist mir aber noch nicht klar.
Alex
Alex schrieb:> Hab mittlerweile rausgefunden, dass das Verhalten etwas mit den> Optimierungs-levels zu tun hat.
Das hast du schon gestern in den Eröffnungsbeitrag geschrieben.
Ich komme langsam zu der Erkenntnis, dass ich mit der
Entwicklungsumgebung des STM nicht wirklich zurechtkomme.
CubeIDE 1.0.2
Ich wollte versuchen rauszufinden, bei welchen Einstellungen es
nicht/funktioniert und hänge hier:
Hab in der while(1) eine Abfrage eines flags, das in der USB-RX-Callback
Funktion gesetzt wird.
Wenn das Flag gesetzt ist, wird aus dieser IF der empfangene String
zurückgeschickt.
Funktioniert in den Optimization-Modes O0 und Og problemlos.
In allen anderen Ox meldet sich das Ding am USB zwar an (hatte es das
letzte mal nicht gemacht), und auch das Emfangs-Flag wird gesetzt
nachdem ich etwas sende.
Allerdings springt er nie in die if rein (Bild).
Da steh ich mit Fehlersuche dann irgendwie an.
Selbst wenn in der IF nichts anderes gemacht wird, als das Flag wieder
zu löschen...
Kurzum, ich bin grad nichtmal in der Lage, sinnvolle Fragen zu stellen.
Mit der Ausnahme nach einem Einstiegs-Tutorial
Alex schrieb:> Hab in der while(1) eine Abfrage eines flags, das in der USB-RX-Callback> Funktion gesetzt wird.
Ist das Flag wenigstens überall als volatile deklariert?
Alex schrieb:> Das Flag ist als globale Variable in einer globals.h definiert,> die überall eingebunden ist.
Also ohne volatile, sonst hättest Du das bestätigt. Wenn Du eine
Variable benutzt, um Daten zwischen Interrupt und Applikation
auszutauschen, MUSS sie als volatile deklariert sein - ansonsten kann
der Compiler das u.U. wegoptimieren.
Hallo Leute,
ich steck schon wieder fest :-(
Ich möchte mit dem STM via USB Gleitkomma-Daten austauschen.
sprintf/sscanf oder atof..
Sobald in den Einstellungen "Use float with printf from newlib-nano (-u
_printf_float)" aktiviert ist, gibt es errors wegen RAM/FLASH
overflow.
Durch Suchen hab ich threads gefunden, in denen Probleme wegen einem
Fehler im Linker-Skript diskutiert wurden, das trifft aber bei meinem
STM32F042 nicht zu...
(
https://community.st.com/s/question/0D50X0000AnrcyjSQA/how-to-use-float-in-printf
)
Hat hier jemand eine Idee dazu?
Um RAM freizumachen hätte ich mal versucht, die USB Buffer (USB CDC *x
Buffer Size) von den 1000 Bytes zu reduzieren. Das hat aber keinen
Effekt. Laut .map-file belegen die Buffer immer 2* 1000 Bytes im RAM,
egal was im Codegenerator eingestellt ist.
Vielen Dank für jede Hilfe,
Alex
Der STM32F042F6P6 hat
32k Flash
6k RAM
compiler -Os
ohne "-u _printf_float":
text data bss dec hex filename
13372 380 5492 19244 4b2c testUsb.elf
mit "-u _printf_float" (ohne einem printf-aufruf!)
region `RAM' overflowed by 200 bytes
Den FLASH-Overflow kann ich nicht mehr reproduzieren, im RAM belegt der
USB-Buffer schon mal 2k, die restlichen USB-Sachen locker nochmal 2k,
meine eigenen Daten 0x78 ;-)
Du brauchst ungefähr 1,5kB (mit reduzierter Performance nur 0,5kB) und
4,3kB FLASH. Mit Fließkomma kommen weitere 9kB FLASH dazu.
Dein RAM ist auf jeden Fall rappelvoll (data + bss). Das kriegst du nur
gelöst, indem du dein Programm umschreibst. Eventuell hast du ein paar
Strings oder Arrays, die niemals verändert werden und daher durch das
Schlüsselwort "const" direkt aus dem FLASH geladen werden können.
Dadurch wird RAM frei.
Die folgenden Optionen helfen eventuell, den FLASH Bedarf zu reduzieren.
Compiler: -Os -ffunction-sections
Linker: -Wl,--gc-sections -lm
Die USB CDC Implementierung von W.S. ist wesentlich schlanker und das
kannst du den Pufferspeicher wirksam verkleinern, falls das dann noch
nötig sein sollte. Ich vermute mal, dass der gleiche Code wie vom
STM32L0 geht:http://stefanfrings.de/stm32/stm32l0.html#vcpnohal
Ja, der RAM ist zu voll, aber den belegt der USB-Teil (codegenerator)
und die newlib-float.
Meine Daten beschränken sich auf 120 Byte!
Deshalb hab ich ja versucht, die USB buffer kleiner zu machen, was aber
nicht geht.
Selbst wenn mein code keinen Speicher belegt, ginge sich das also nicht
aus.
Mein Fazit derzeit:
USB + Float ist mit 6k RAM nicht zu machen.
Find ich ziemlich unglaublich.
ich wollte mit dem kleinen STM ein Tool, dass es bereits mit einem AVR
gibt, um eine Funktion erweitern (die ich dort nicht mehr reinkriege).
Aber die Grund-Funktionalität des 4k Flash / 256Byte RAM - AVR-Dings
ist standardmäßig nicht in den 32k/6k STM unterzubringen. WTF?
Alex schrieb:> Ich möchte mit dem STM via USB Gleitkomma-Daten austauschen.> sprintf/sscanf oder atof..
Du könntest das auch einfach als 32bit-Rohwerte schicken und nicht als
Strings. Dann muß man nur noch Endianess richtig beachten, aber sowohl
x86 als auch ARM sind da eh identisch.
Alex, hör auf zu meckern und schau Dir die Infos an, die ich Dir gegeben
habe. Du meckerst in Wahrheit über deine eigenen Fehlentscheidungen. Als
Anfänger muss man damit rechnen.
Dass ein zusammengeklicktes Programm auf Basis der Cube HAL nicht
optimal ist, sollte niemanden wundern. Falls es für dich neu war, dann
weißt du es wenigstens jetzt.
Und jetzt kommt die AHA-Erkenntnis Nr 2: Die generische newlib-nano
braucht in jeder Hinsicht sehr viel mehr Speicher, als die speziell für
AVR hand-optimierte avr-libc, insbesondere bezüglich stdio und float.
Warum zwängst du das alles auf diesen mickrigen Mikrocontroller?