Forum: Mikrocontroller und Digitale Elektronik lpc2294 malloc() vs. static ,C, arm


von Thorsten H. (imonkey)


Lesenswert?

Guten tag forumsteilnehmer,

ich habe ein problem das verhalten meines µC zu interpretieren.
In meinem programm sollen möglicht viele messwerte in einem globalen 
vektor abgelegt und danach von versch. funktionen weiterverarbeitet 
werden.
Ich habe nun das problem auf zwei unterschiedliche arten gelöst die 
eigentlich zum selben ergebnis führen sollten:

-definition des vektors als static bevor das main-programm beginnt:

 Problem: das programm wird ca 10kb groß und die demoversion von µVision
 verweigert mir das runterladen auf den µC.

-dynamische speicherverwaltung nach dem unten aufgeführten muster.
 anz- steht für die anzahl der 8-byte spiecherplätze(double).
 der lpc2294 verfügt über 16kb-ram der auch belegbar ist, bei anz > 1022
 geht gar nix mehr (sind ja auch zwei vektoren).

 Problem: in meinem eigentlichen programm geht schon ab anz > 25 gar
 nix mehr, bzw die aus aaa und bbb errechneten werte sind quatsch.

 wieso ist das so?

Gruß t.heimberg


#include <stdio.h>
#include <stdlib.h>                        /* I/O Functions */
#include <LPC22XX.H>                        /* LPC22XX Peripheral 
Registers */
double *aaa,*bbb;
int anz=1020;
extern void init_serial (void);

void delay (void)  {                        /* Delay Function */
  unsigned long x;

  for (x = 0; x < 400000; x++);
}

int main (void) {

    init_serial();                        /* Initialize Serial Interface 
*/

         IODIR0 = 0x00000100;

  aaa=malloc(anz*8);
  bbb=malloc(anz*8);

if (aaa==0 || bbb==0)
{

    printf ("nein\n");

    IOCLR0 = 0x00000100;                /* Turn LED On  (P0.8 0) */
    delay();
    IOSET0 = 0x00000100;                    /* Turn LED Off (P0.8 = 1) 
*/

}

if (aaa!=0 || bbb!=0)
{

    printf ("ja\n");

  IOCLR0 = 0x00000100;                    /* Turn LED On  (P0.8 = 0) */
    delay();
    IOSET0 = 0x00000100;                    /* Turn LED Off (P0.8 = 1) 
*/

}
  memset(aaa,0,anz*8);
  memset(bbb,0,anz*8);

  while(1);


}

von Peter (Gast)


Lesenswert?

> -definition des vektors als static bevor das main-programm beginnt:
> Problem: das programm wird ca 10kb groß und die demoversion von µVision
> verweigert mir das runterladen auf den µC.
Normalerweise müsste ein guter Compiler dadurch die Größe des Binaries 
nicht aufblähen, (hast du den GCC? der ist definitiv kein guter 
Compiler) es sei denn, du initialisierst das Array mit unterschiedlichen 
Werten, dann muß er natürlich alles mitschleppen. Ich würde es über den 
Linker regeln, also eine entsprechend große RAM-Section definieren, die 
vom C-Code, Stack, etc. nicht benutzt wird. Dynamischen Speicher (via 
malloc) wirst du wohl nicht brauchen, weil der Speicher ja sowieso 
ständig vorhanden sein soll.

von Andreas K. (a-k)


Lesenswert?

Thorsten Heimberg wrote:

>  Problem: das programm wird ca 10kb groß und die demoversion von µVision
>  verweigert mir das runterladen auf den µC.

Platzgrenzen sind bei Demo-Compilern meist auf den Code bezogen.

>  int anz=1020;
>  aaa=malloc(anz*8);
>  bbb=malloc(anz*8);

Gibt schon vor anz=1022 Mist, weil dir garantiert der Stack überläuft, 
der muss nämlich auch noch ins RAM passen.

Vom malloc ist abzuraten weil man keinen Überblick über die 
Speicherbelegung hat.

> double *aaa,*bbb;

Fliesskommarechnung benötigt Laufzeitfunktionen, somit deutlich 
Code-Speicher. Sollte man so weit wie möglich vermeinden, wenn es auf 
Speicher ankommt.

> void delay (void)  {                        /* Delay Function */
>   unsigned long x;
>
>   for (x = 0; x < 400000; x++);
> }

Wird je nach Compiler komplett wegoptimiert, weil aus seiner Sicht 
völlig sinnfrei.

>     printf ("nein\n");

printf() mitsamt der dahinter liegenden Bibliothek ist einer der 
grössten Speicherfresser, die man auf Microcontrollern finden kann.

von Dirk (Gast)


Lesenswert?

Überprüfe im Startupfile die Heap-Größe

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.