mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik externe variablen richtig angelegt


Autor: Josef Kkk (zumlin)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also ich weiß nicht mehr recht weiter. Ich glaube ich habe Probleme mit 
meinen externen Variablen. Irgendwie überschreibe ich dem Prozessor 
immer was im Speicher. Hier einfach mal ein paar Codeschnippsel:
/*in main.c*/
//globale variablen
can_messageblock_struct   *repeat_blocks = 0;
can_messageblock_struct   *shot_blocks = 0;

/*in canmessages.h*/
typedef struct{                                  
  uint16_t  time;       
  uint16_t  address;  
  uint8_t    datalength;                 
  uint8_t    *data;
}can_message_struct;   

typedef struct{                                  
  can_message_struct  *message;      
  uint16_t            blockposition; 
  uint16_t            blocklength;
  uint16_t            prevtime;
}can_messageblock_struct; 

extern can_messageblock_struct   *repeat_blocks;
extern can_messageblock_struct   *shot_blocks;

/*in canmessages.c*/
//irgendwo in ner Funktion (mit Beispiel 10)
repeat_blocks = malloc(10 * sizeof(can_messageblock_struct));  
//... Speicher reservieren für jede Nachricht
repeat_blocks[repeatindex].message = malloc(sizeof(can_message_struct)*20);
//... Zugreifen tue ich dann in etwa so:
repeat_blocks[repeatindex].blockposition= 0;
//... die Messages lasse ich von einer Funktion eintragen
can_create_message(msgbuff, &repeat_blocks[repeatindex]);

//die Funktion can_create_message
int can_create_message_block(unsigned char *msgbuff, can_messageblock_struct *message_block)
//... soetwas scheint noch zu funktionieren
message_block->message[blockposition].time = num16buff;
message_block->message[blockposition].datalength = num16buff;
//... aber hier kann kein Speicher mehr reserviert werden
message_block->message[blockposition].data = malloc(sizeof(uint8_t) * message_block->message[blockposition].datalength);

Irgendwas ist da doch faul, oder? Als µC nutze ich eien AT90CAN128.
Evtl noch nützliche Infos zur Speichernutzung:
.data size 1264
.text size 67046
.bss size 1433

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Definitionen sind zu kompliziert.

Im embedded Bereich sollte man keinen Heap, keinen dynamischen Speicher, 
malloc, verwenden.
Sondern nur statische Arrays mit festen Adressen.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Speicher ist einfach nur voll. Du hast schon ca. 2,7 k an 
statischen Daten, dann erzeugst du in dem Code-Fragment oben nochmal ca. 
1,2 k an dynamischen Daten. Macht zusammen 3,9 und du hast insgesamt nur 
4 k.

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.