Hi, ich hab das Problem das mein Programm zuviel speicher frisst. Ich mach auf dem STM32F103RB (256kb flash und 64k ram) eine Matrix Multiplikation von 500 Messwerten. Wenn ich die Anzahl der Messwerte reduziere funktioniert alles ansonsten erhalte ich einen Hardfault. Und der Stackpointer zeigt auf irgendwas mit 0x4... was ja garnicht existiert. das Board hat noch eine SD-Karte via SDIO. Gibts eine Möglichkeit den Speicher auf der SD Karte als Rechenspeicher zu nutzen (Virtual EEPROM als ram oder so)? Geschwindigkeit spielt keine Rolle Viele Grüße Ersan grobe Programmbeschreibung: ->Start --> Button gedrückt, Messung startet ---> Werte werden in Array gespeichert (Dimension: 500x9 (32bit werte) ) ---> Werte werden analysiert ---> Matrix Multiplikation aller Werte mit einer Einheitsmatrix ----> Speicherung der Ergebnisse in einem anderen Array ----->fertig
Ersan G. schrieb: > Matrix Multiplikation aller Werte mit einer Einheitsmatrix Lass die Multiplikation einfach weg, das Ergebnis ist das selbe wie wenn man mit der Einheitsmatrix multipliziert. Und nein, das geht nicht - paralleler Flash ginge evtl., aber da kannst du auch gleich einfach externen SRAM nehmen (siehe Kapitel FSMC im Reference Manual) oder einen größeren Controller. Oder du optimierst deinen Algorithmus, zB indem du das Ergebnis in das Anfangs-Array überschreibst, o.ä.
Ersan G. schrieb: > Gibts eine Möglichkeit den > Speicher auf der SD Karte als Rechenspeicher zu nutzen (Virtual EEPROM > als ram oder so)? Theoretisch geht das schon, indem Du manuell Teile der Matrizen etc. auslagerst, eine Art "paging" mit SD. Unterstützung durch die CPU ist nicht zu erwarten. Wird aber vermutlich etwas lahm. Das macht wenig Sinn. Ersan G. schrieb: > Dimension: 500x9 (32bit werte) Das sind dann 18kb. Selbst bei Faktor drei ist das immer noch < 64kb. Sicher, dass der Wurm nicht woanders begraben ist? Hardfault richtig analysiert? Dr. Sommer schrieb: > oder einen größeren Controller Eben. Falls wirklich das RAM knapp ist, dann besorge doch ein stm32f4 discovery, aber auch da sind "nur" 128kb RAM am Stück.
Hi, also sorry, hab einheitsmatrix geschrieben, aber es ist ne normale matrix. Ich hab wie empfohlen, ein Array wiederbenutzt und eine Fehlerquelle war damit beseitigt aber dennoch. irgendwie komm ich nich hin. Ich kann leider den Code hier nich öffentlich posten aber vllt. kann ich es ja per privater PN zukommenlassen? VG und danke! Ja auf jedenfall springe ich auf den F4 um aber leider dauert es noch bis die F4 Variante raus ist von dem Gerät :(
>--> Button gedrückt, Messung startet >---> Werte werden in Array gespeichert (Dimension: 500x9 (32bit werte) ) Was für eine Messung benötigt 32Bit Werte? Darüber würde ich mal nachdenken.
nicht 32 Bit Werte, ich meinte double / float , also 32Bit speicherbelegung
Ersan G. schrieb: > nicht 32 Bit Werte, ich meinte double / float , also 32Bit > speicherbelegung Ist doch das gleiche. Die Frage solltest du eher so verstehen: Brauchst du diese Genauigkeit? Werte genauer speichern als der Messaufbau sie messen kann macht keinen Sinn.
Ersan G. schrieb: > Ich hab das Problem das mein Programm zuviel speicher frisst. Ich mach > auf dem STM32F103RB (256kb flash und 64k ram) eine Matrix Multiplikation > von 500 Messwerten. Wenn ich die Anzahl der Messwerte reduziere > funktioniert alles ansonsten erhalte ich einen Hardfault. Junge, keine Gewalt! Nimm eine groesseren Hammer! Z.b. STM32F407. Und den $37 soll es auch bald geben.
Ersan G. schrieb: > also sorry, hab einheitsmatrix geschrieben, aber es ist ne normale > matrix. Ah. Speicherst du diese 2. Matrix als eigenes Array? Sind das "irgendwelche" Werte in dieser Matrix, oder kann man die berechnen? In dem Fall könntest du dieses Array ganz weglassen und die Werte on-the-fly berechnen & verwenden. Falls nicht, hat sie sonst eine Struktur - Bandmatrix (nur (Neben)-Diagonalen enthalten nicht-Null-Werte), symmetrisch, sich wiederholende Blöcke, o.ä.? Dann kannst du nur die nicht-Null-Werte speichern und Wiederholungen weglassen. Das verkompliziert den Algorithmus zwar, spart aber Speicher... Ersan G. schrieb: > ansonsten erhalte ich einen Hardfault. Eigentlich sollte der Linker meckern wenn du ein zu großes Array anlegst, und du solltest gar kein flashbares Programm kriegen! Oder es passt zwar, aber zusammen mit dem wachsenden Stack geht es schief... Überprüf mal den verbrauchten Speicher und wie viel noch da ist. Wenn da alles passt, überprüfe doch mal ob du nicht doch was falsch programmiert hast, Buffer-Overflow o.ä..
Ersan G. schrieb: > Gibts eine Möglichkeit den > Speicher auf der SD Karte als Rechenspeicher zu nutzen (Virtual EEPROM > als ram oder so)? Wie schon geschrieben, ist die SD Karte zu langsam, um darauf zu rechnen. Du könntest aber die Daten per VPN zu einem leistungsfähigeren Rechner in der Cloud schicken und dort rechnen lassen. Das Ergebnis kann man dann gemütlich auf der SD Karte ablegen - das wäre ein zeitgemäßer Lösungsansatz ;-)
Hallo, Deine Dimension: 500x9 (32bit werte) ergibt 18000 Bytes, wenn du die Ergebnisse in einem separaten Array schreiben willst dann brauchst du nochmal 18000 Bytes, es isnd dann 36000Bytes(ca. 35,2 KByte) Ram Wenn es dir zuviel ist, dann versuch die Ergebnisse von anfang der ersten Tabelle dort einzutragen dann hast du am Ende nur die Ergebnisse zur Verfügung. Wenn du mehr ram brauchst würde ich externe RAM-Speicher zu verwenden weil schreiben auf dem Flash viel langsamer ist als auf dem RAM.
-> Haha cloud :) @holger: ne ich brauch die genauigkeit und zwar drei stellen nachm komma. @UWE: Bin auch an der TUD :) @Dr.Sommer: genau! der Stack wächst mit weil der Algorithmus ein rekrusives verhalten hat, ich hab die Matrix mal komplett weggelassen und es geht! Ich versuche diese zweite Matrix irgendwie on the fly berechnen zu lassen.
Ersan G. schrieb: > genau! der Stack wächst mit weil der Algorithmus ein rekrusives > verhalten hat, Ah. Das ist auf Mikrocontrollern böse. Kennst du die maximale Rekursionstiefe? Dann könntest du statt des Stacks ein Array verwenden und den Algorithmus iterativ umprogrammieren - dann wäre der Speicherverbrauch zur Compilierzeit berechenbar, du wüsstest sofort sicher ob es passen wird oder nicht, und du müsstest nicht erst auf die HardFault warten (vllt tritt die im Testfall nicht auf, aber später...) Ansonsten 2 Mikrocontroller nehmen und parallel rechnen lassen... ;-P
Erstmal solltest du sicherstellen dass die Daten gepackt und ohne Padding im Speicher liegen. Welchen Compiler setzt du ein? Eventuell lässt der Flash sich als langsamer Zwischenspeicher missbrauchen. Kennst du: http://www.element14.com/community/docs/DOC-33329/l/stmicroelectronics-an2594-eeprom-emulation-in-stm32f10x-microcontrollers
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.