Forum: Mikrocontroller und Digitale Elektronik CPP Code nach C portieren. endet in Stackoverflow.


von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Hallo zusammen...

Ich versuche folgenden Code zu portieren:

http://developer.mbed.org/users/embeddedartists/code/app_lcdboard_demo_sphere/

Dabei versuche ich genauer gesagt nur die Dateien
SphereDemo.h und SphereDemo.cpp zu portieren.

Zielsystem ist ein STM32F105RB mit 128k Flash und 64k Ram
Umgebung ist ARM GCC mit CooCox.

Anbei findet ihr meine Portierung.

Mein Aufruf sieht wie folgt aus:
1
SphereDemo(800,480);
2
SphereDemo_run(100,100);

Leider erhalte ich vom Compiler folgende Meldung:

--> /ld.exe: region ram  overflowed with stack
--> /ld.exe: region `ram' overflowed by 1104 bytes

Ohne die SphereDemo ist die .bss Region 1068 bytes gross!

Hier die Angaben OHNE die SphereDemo

Program Size:
      text     data      bss      dec      hex  filename
      7348       20     1068     8436     20f4  7inch_sphere_demo.elf

Hat jemand eine Idee wie man dies entsprechend anpassen könnte?

Danke schonmal!

von Joe F. (easylife)


Lesenswert?

Wenn es von der Perfomance her reicht:
sin() und cos() direkt benutzen, spart dir den Speicher für die großen 
Tabellen.

von Arc N. (arc)


Lesenswert?

Alleine
int16_t sine[SCALE];
int16_t cosi[SCALE];
belegen 8192 * sizeof(int16_t) * 2 = 32768 Bytes RAM
Da könnte es helfen die ins Flash zu legen.

ungünstig sind auch die "großen" lokalen Arrays
int16_t xyz[3][N];
uint8_t rgb[3][N];

3  256  2 + 3  256  1 = 2304 Bytes könnten zu viel für den Stack 
sein

von (prx) A. K. (prx)


Lesenswert?

Die beiden Trigonometrietabellen sind in sphere.h definiert, nicht nur 
extern deklariert. Was eigentlich einen Linker-Fehler provozieren 
müsste, wenn zweimal included - oder macht der heute immer noch Commons 
draus?

von C. H. (hedie)


Lesenswert?

A. K. schrieb:
> Die beiden Trigonometrietabellen sind in sphere.h definiert, nicht
> nur
> extern deklariert. Was eigentlich einen Linker-Fehler provozieren
> müsste, wenn zweimal included - oder macht der heute immer noch Commons
> draus?

Es gibt einen Error, wenn ich den Header von void matrix... ins h 
kopiere.
Ansonsten bin ich für offen für jegliche optimierungen!

Arc Net schrieb:
> Da könnte es helfen die ins Flash zu legen.

Wie macht man dies beim STM bzw. beim ARM-GCC?

von (prx) A. K. (prx)


Lesenswert?

Claudio H. schrieb:
> Wie macht man dies beim STM bzw. beim ARM-GCC?

"const" davor. Nur müssen die dann schon fertig initialisiert sein. Du 
brauchst also ein Hilfsprogramm, das den Quelltext davon generiert.

von (prx) A. K. (prx)


Lesenswert?

Zu globalen Variablen generell:
Im .c File:
  int table[1999];
In .h File:
  extern int table[1999];

von C. H. (hedie)


Lesenswert?

Ein erster Versuch ist gemacht!

Hier das Ergebnis: https://www.youtube.com/watch?v=nfX0YvVSM7w

Aktuelle Einstellungen:
1
enum Constants {
2
        N         = 64, // Number of dots
3
        SCALE     = 6144,
4
        INCREMENT = 384,  // INCREMENT = SCALE / sqrt(N) * 2
5
        SPEED     = 1
6
};


Viel mehr wird wohl mit dem STM32 ohne FSMC nicht drinn liegen...

von Andreas (Gast)


Angehängte Dateien:

Lesenswert?

Arc Net schrieb:
> Alleine
> int16_t sine[SCALE];
> int16_t cosi[SCALE];
> belegen 8192 * sizeof(int16_t) * 2 = 32768 Bytes RAM
> Da könnte es helfen die ins Flash zu legen.
>
> ungünstig sind auch die "großen" lokalen Arrays
> int16_t xyz[3][N];
> uint8_t rgb[3][N];
>
> 3  256  2 + 3  256  1 = 2304 Bytes könnten zu viel für den Stack sein

Das Richtig,
Wenn icb das als Tabelle mache muss ich ja für x und y jeweils 8192 
Werte Ausrechnen.
Besser wäre das schon dann bräuchte der stm nich so viel Rechnen.
Bloß wie mache ich das mit der Tabelle??

könnte mir einer von ihnen weiterhelfen.
Danke.

im Anhang mal meine umsetzung ich nutze ein stm32f103zet6

von Arc N. (arc)


Lesenswert?

Andreas schrieb:
> Besser wäre das schon dann bräuchte der stm nich so viel Rechnen.
> Bloß wie mache ich das mit der Tabelle??

sin/cos Initialisierung auf dem PC laufen lassen, printf + Copy&Paste 
oder fprintf?

von Andreas (Gast)


Lesenswert?

Arc Net schrieb:
>
> sin/cos Initialisierung auf dem PC laufen lassen, printf + Copy&Paste
> oder fprintf?

Oh da Fehlt mir das wissen wie das aufn PC geht.

dann mach ich das mit printf auf dem stm

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.