Forum: Mikrocontroller und Digitale Elektronik malloc lässt sich nicht Compilieren (dyn. datenstrkt.)


von taunus (Gast)


Lesenswert?

+----------------------------------+
+ Device Fujitsu MB90342           +
+ Compiler von Fujitsu (glaub ich) +
+----------------------------------+

Hi,

ich habe folgenden Code geschrieben (nur zu Compilierzwecken, 
eigentlicher Code ist deutlich umfangreicher).
1
#include <stdlib.h>
2
3
typedef struct osTask
4
{
5
  void          (*Callback)(void);
6
  unsigned int  uiActCount;
7
  unsigned int  uiPeriod;
8
  unsigned char ucMode;
9
  unsigned int  uiId;
10
  struct osTask *next;
11
}tTasks;
12
13
struct osTask *next = NULL;
14
struct osTask *anfang = NULL;
15
16
void add_data(unsigned char setMode, unsigned int setCounter,
17
              void (*setCallback)(void), unsigned int taskID   );
18
void dummy(void);
19
20
void main(void)
21
{
22
  add_data(1, 1000, dummy, 0);
23
  while(1){;}
24
  //return 0;
25
}
26
27
void add_data(unsigned char setMode, unsigned int setCounter,
28
              void (*setCallback)(void), unsigned int taskID   )
29
{   
30
  /* Check if there's an element in the list         */
31
  if(anfang == NULL) 
32
  {
33
    /* Allocate storage space for the structur       */
34
    /* for the first element in the list             */
35
    if((anfang = (struct osTask *)malloc(sizeof(struct osTask))) == NULL) 
36
    {
37
       //memoryerror
38
       return;
39
    }
40
    anfang->uiPeriod   = setCounter;
41
    anfang->uiActCount = setCounter;  
42
    anfang->ucMode     = setMode;
43
    anfang->Callback   = setCallback;
44
    anfang->uiId       = taskID;
45
    anfang->next       = NULL; //Mark this entry as the start of the list
46
  }
47
}
48
void dummy (void)
49
{
50
 ; //tu was
51
}

Beim Compilieren kommt folgende Fehlermeldung:
>>balloc.asm(154) E4305L: Unresolved external symbol (_sbrk)

Geplant ist dieses Konzept für die Speicherverwaltung (Dynamische 
Datenstruktur) eines OS.
Erkennt jemand den Fehler??

Der Fehler liegt beim malloc, nur leider erkenne ich nicht warum??
1
    if((anfang = (struct osTask *)malloc(sizeof(struct osTask))) == NULL) 
2
    {
3
       //memoryerror
4
       return;
5
    }

Definiert ist malloc in der stdlib.h so:
1
  extern void  *malloc(size_t);

Ich habs auch mit dem in Dev-C++ integrierten Compiler compiliert, mit 
Erfolg.
Dort ist es wie folg deklariert:
1
 _CRTIMP void* __cdecl  malloc  (size_t) __MINGW_ATTRIB_MALLOC;

Daraus werd ich zwar nicht 100% schlau, aber die Funktion gibt doch auch 
einen void- Zeiger zurück,...
Warum will der Controller-Compiler das dann nicht machen??

Gruß

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du musst wohl den Autor der Datei balloc.asm befragen, warum er auf
eine Variable namens _sbrk zugreift, es diese aber nicht gibt.  Ggf.
suchst du zuvor die Doku für dieses balloc.asm mal durch, es kann ja
gut sein, dass diese dich damit beauftragt, dass du eine derartige
Variable selbst anlegen und initialisieren musst, damit das malloc()
weiß, ab welcher Stelle es seinen Heap anlegen darf (oder so ähnlich).

von Martin T. (mthomas) (Moderator) Benutzerseite


Lesenswert?

Jörg Wunsch wrote:
> Du musst wohl den Autor der Datei balloc.asm befragen, warum er auf
> eine Variable namens _sbrk zugreift, es diese aber nicht gibt.

Ohne je mit Fujitsu-Controllern oder -Compilern gearbeitet zu haben: 
sbrk dürfte wie bei vielen anderen libcs eine Funktion sein, die 
ausgehend von einem Initialwert der Heap-Startadresse einen Adresszähler 
um die angeforderte Anzahl Bytes erhöht und den Wert vor der Erhöhung 
zurückgibt. newlib-Dokumentation erklärt es besser.

...ein wenig gesurft, man will ja was dazu lernen:

Sodenn vom OP mit "Fujitsu-Compiler (glaub ich)" Softune V6 gemeint ist, 
ist das Prinzip lt. 
http://www.fujitsu.com/downloads/MICRO/fma/pdfmcu/softccmp-v6-cm81-00206-3e.pdf 
Abschnitt 8.5.7 identisch. Der Linker meckert allerdings über fehlendes 
_sbrk, die Dokumention beschreibt sbrk (ohne Unterstrich), Ursache 
könnte aber auch nur eine Decoration sein.
Surft man etwas über die Fujitsu-Seiten, findet man z.B. auf 
http://mcu.emea.fujitsu.com/mcu_product/mcu_all_software.htm das 
Beispiel 90xxx_sw_printf-v12.zip und darin code für sbrk.

> Ggf.
> suchst du zuvor die Doku für dieses balloc.asm mal durch

Die suche nach malloc und dessen Abhängigkeiten - also auch sbrk - ist 
erfolgversprechender (war es zumindest für mich).

>, es kann ja
> gut sein, dass diese dich damit beauftragt, dass du eine derartige
> Variable selbst anlegen und initialisieren musst, damit das malloc()
> weiß, ab welcher Stelle es seinen Heap anlegen darf (oder so ähnlich).

Indirekt, malloc der mitgelieferten libc "fragt" lt. Dokumentation sbrk. 
sbrk benötigt allerdings schon den besagten Startwert ("ab welcher 
Stelle"). Kann vom Linker bereitgestelltes Symbol sein oder wie im 
Beispiel die Startadresse eines "Pseudo-Heaps" in Form eines Arrays in 
.data

Wie auch immer, vielleicht springt ja noch ein 
"Fujitsu-Compiler"-Anwender ein.

von taunus (Gast)


Lesenswert?

Dankeschön,...
dann werd ich mal ein wenig Literatur studieren,...

Wenn da draußen doch ein Fujitsu benutzer ist, immer her mit den 
Vorschlägen,...

Gruß
taunus

von Felix B. (e-b)


Angehängte Dateien:

Lesenswert?

@ taunus

ich habe die 16LX Beruflich und Privat eingesetzt.
Hast du das Problem schon gelöst?
Ansonsten schau mal im sbrk.c des Anhanges nach. Dort sollte die Lösung 
für dein Problem stehen.

Martin Thomas lag mit seinen Vermutungen/Hinweisen schon sehr Nahe.

Cheers,
Felix

von Stefan (Gast)


Lesenswert?

Wahrscheinlich hast Du das Problem schon gelöst, da ich aber selbst die 
letzten Tage daran geknabbert habe, poste ich die Lösung mal für all die 
anderen ;-)
Wenn Du Softune benutzt, schau mal unter

Project->Setup Project...->Linker

dort fügst Du unter "Other Options" folgende Zeile hinzu:

-l C:\Softune6\lib\911\lib911if.lib

Evtl. musst Du natürlich noch den Pfad anpassen

Gruß,
Stefan

von Omar Jarid (Gast)


Lesenswert?

I know it is been a while, but thank you so much Felix Bonjour, best 
solution.

regards from MEX

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.