STM32 , SD-Karte als Ram oder ähnlich nutzen möglich?

OP #3042480
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
Gast #3042488
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.ä.
#3042700
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.
OP #3043937
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 :(
(Firma: TU Darmstadt) #3043986
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.
Gast #3043996
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.ä..
Gast #3044065
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 ;-)
Gast #3044192
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.
OP #3044417
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.
Gast #3044804
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren