Forum: Mikrocontroller und Digitale Elektronik STM32 , SD-Karte als Ram oder ähnlich nutzen möglich?


von Ersan G. (ersan)


Lesenswert?

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

von Dr. Sommer (Gast)


Lesenswert?

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.ä.

von Roland H. (batchman)


Lesenswert?

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.

von Ersan G. (ersan)


Lesenswert?

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 :(

von holger (Gast)


Lesenswert?

>--> 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.

von Ersan G. (ersan)


Lesenswert?

nicht 32 Bit Werte, ich meinte double / float , also 32Bit 
speicherbelegung

von Eumel (Gast)


Lesenswert?

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.

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

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.

von Dr. Sommer (Gast)


Lesenswert?

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.ä..

von Cloud Computing (Gast)


Lesenswert?

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 ;-)

von EM-Entwickler (Gast)


Lesenswert?

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.

von Ersan G. (ersan)


Lesenswert?

-> 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.

von Dr. Sommer (Gast)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.