Forum: Mikrocontroller und Digitale Elektronik externe variablen richtig angelegt


von Josef K. (zumlin)


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:
1
/*in main.c*/
2
//globale variablen
3
can_messageblock_struct   *repeat_blocks = 0;
4
can_messageblock_struct   *shot_blocks = 0;
5
6
/*in canmessages.h*/
7
typedef struct{                                  
8
  uint16_t  time;       
9
  uint16_t  address;  
10
  uint8_t    datalength;                 
11
  uint8_t    *data;
12
}can_message_struct;   
13
14
typedef struct{                                  
15
  can_message_struct  *message;      
16
  uint16_t            blockposition; 
17
  uint16_t            blocklength;
18
  uint16_t            prevtime;
19
}can_messageblock_struct; 
20
21
extern can_messageblock_struct   *repeat_blocks;
22
extern can_messageblock_struct   *shot_blocks;
23
24
/*in canmessages.c*/
25
//irgendwo in ner Funktion (mit Beispiel 10)
26
repeat_blocks = malloc(10 * sizeof(can_messageblock_struct));  
27
//... Speicher reservieren für jede Nachricht
28
repeat_blocks[repeatindex].message = malloc(sizeof(can_message_struct)*20);
29
//... Zugreifen tue ich dann in etwa so:
30
repeat_blocks[repeatindex].blockposition= 0;
31
//... die Messages lasse ich von einer Funktion eintragen
32
can_create_message(msgbuff, &repeat_blocks[repeatindex]);
33
34
//die Funktion can_create_message
35
int can_create_message_block(unsigned char *msgbuff, can_messageblock_struct *message_block)
36
//... soetwas scheint noch zu funktionieren
37
message_block->message[blockposition].time = num16buff;
38
message_block->message[blockposition].datalength = num16buff;
39
//... aber hier kann kein Speicher mehr reserviert werden
40
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

von Klaus (Gast)


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.

von Stefan E. (sternst)


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.

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.