Forum: Mikrocontroller und Digitale Elektronik STM32 array mit 1KB


von Corel G. (corelgott)


Lesenswert?

Hi @ all,

ich versuche mich gerade ein bisschen in die controller programierung 
ein zu arbeiten und kann ein Problem nicht einschätzen...

Ich habe einen STM32FR100RB auf einem STM32 Discovery.

Der Chip hat 8Kbyte Ram.
Daran habe ich ein 64px x 128px Display, "write only" per SPI, 
angeschlossen. (ST7656)
Soweit funktioniert es auch... Ich würde aber gerne für das Display 
einen Backbuffer in der Software haben um dort das Bild "vor zu 
produzieren" (Da ich das Display nicht auslesen kann... Der ST7565 kann 
laut Datenblatt per SPI nur beschrieben werden).

Wenn ich nun aber für das komplette Display einen Backbuffer haben will 
brauche ich ja: 64Px x 128Px => 8192Kbit = 1Kbyte...

D.h. ich muss 1Kb im ram parken... Bei 8Kbyte-Ram ist das schon ein 
recht großer broken.

Sowie ich aber versuche ein Array in der Große zu machen freezed der 
Prozessor. (Bei der Größe keine all zu große Überraschung) Darauf hin 
habe ich angefangen, meinen Buffer zu fragmentieren damit er nicht mehr 
aus einem Großen sonderen mehren keinen Blöcken besteht. (Das bedeutet 
zwar auch mehr verwaltungs overhead aber naja...)

Aber egal wie klein ich den Buffer zerstückele (32x32Byte), ich bekomme 
nicht genügend ram zusammen. Was mich extrem stutzig macht, da 
eigentlich ja genügend platz vorhanden sein sollte...

Habe ich etwas übersehen? Ist der Plan an sich schon falsch?

Vielen Dank im Voraus!

Gruß

Corelgott

von holger (Gast)


Lesenswert?

>D.h. ich muss 1Kb im ram parken... Bei 8Kbyte-Ram ist das schon ein
>recht großer broken.

Lächerlich. Hab ich mit einem ATMega32 schon mal gemacht.
Der hat nur 2kB RAM.

>Sowie ich aber versuche ein Array in der Große zu machen freezed der
>Prozessor. (Bei der Größe keine all zu große Überraschung)

Sicher ist es keine Überraschung wenn das RAM bereits voll ist.
Womit auch immer. Hast du Fonts und Bilder im RAM liegen?
Sowas frisst ordentlich.

von Corel G. (corelgott)


Lesenswert?

Ich habe eine Font im Ram liegen. Aber an sonsten habe ich eigentlich 
keine weiteren "großen" variablen / arrays.

Aber egal wie ich das Array deklariere macht er es einfach nicht.
Versuch habe ich es bisher mit:

u8 buffer[1024];

oder:

u8 * buffer[8]
for(int i=0; i<8; i++)
  buffer[i] = (u8 *) malloc(128);

oder:

u8 * buffer[32]
for(int i=0; i<32; i++)
  buffer[i] = (u8 *) malloc(32);

Wie macht man es sonst richtig auf nem embedded?
Was vielleicht noch zu erwähnen ist... Ich mache das ganze nicht in C 
sondern in C++. Ist vielleicht nicht die beste idee auf nem embedded, da 
es doch etwas overhead produziert... Sollte doch aber eigentlich nicht 
das Problem sein

von Fred vom Jupiter (Gast)


Lesenswert?

Mit malloc würde ich nicht arbeiten auf einem µC.

Eigentlich müßte es mit

u8 buffer[1024];

Doch funktionieren.
Was passiert denn, wenn Du nur

u8 buffer[5];

machst? Hängt er dann auch?

Der Overhead bei C++ könnte schon auch ein Problem sein denke ich.

von Corel G. (corelgott)


Lesenswert?

Hi Fred,

der Versuch mit malloc bereitet mir auch bauchschmerzen.

Wenn ich versuche das Array über:

u8 buffer[1024];

zu erzeugen bleibt der Debugger stehen und in der Ausgabe sehe ich nur, 
Programm Terminated.

Das passiert ab einer größe von ca. 400Byte. Vermutlich ist der RAM echt 
voll... Aber im Memory map file das IAR erstellt finde ich nur 2KB... 
Wenn ich das richtig lese...

von holger (Gast)


Lesenswert?

>Ich habe eine Font im Ram liegen. Aber an sonsten habe ich eigentlich
>keine weiteren "großen" variablen / arrays.

Dann leg den Font erstmal ins Flash. Müsste so gehen:

const u8 font[] = ....

von Corel G. (corelgott)


Lesenswert?

hmm ok wenn das const, das zünglein an der waage ist... dann ist die 
font schon im flash...

von Corel G. (corelgott)


Lesenswert?

Hmm ich bilde mir ein es raus zu haben...
Der buffer war eine member variable meines objektes... Somit wurde der 
buffer natürlich erst dann allociert, wenn ich eine instance erstellt 
habe... Das war zur Runtime einfach zu viel bzw. da ist dann kein block 
mehr zu finden... Ich habe jetzt einfach mal test-halber die deklaration 
in meine main gepackt und da geht es...

Ich muss es noch etwas weiter testen... Aber ich denke mal dass kann es 
gewesen sein.

Wenn ich meine Tests abgeschlossen habe, poste ich wieder.

Gruß
Corelgott

von Corel G. (corelgott)


Lesenswert?

Es lag scheinbar wirklich daran, dass ich depp versucht habe zur runtime 
den Platz zu bekommen. Mit einer statischen Variable in einer 
Singelton-Klasse funktioniert es nun!

Vielen Dank an alle für's nachdenken!

Gruß

Corelgott

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.