www.mikrocontroller.net

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


Autor: Thorsten Heimberg (imonkey)
Datum:

Bewertung
0 lesenswert
nicht 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);


}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Überprüfe im Startupfile die Heap-Größe

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.