www.mikrocontroller.net

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


Autor: taunus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
+----------------------------------+
+ Device Fujitsu MB90342           +
+ Compiler von Fujitsu (glaub ich) +
+----------------------------------+

Hi,

ich habe folgenden Code geschrieben (nur zu Compilierzwecken, 
eigentlicher Code ist deutlich umfangreicher).
#include <stdlib.h>

typedef struct osTask
{
  void          (*Callback)(void);
  unsigned int  uiActCount;
  unsigned int  uiPeriod;
  unsigned char ucMode;
  unsigned int  uiId;
  struct osTask *next;
}tTasks;

struct osTask *next = NULL;
struct osTask *anfang = NULL;

void add_data(unsigned char setMode, unsigned int setCounter,
              void (*setCallback)(void), unsigned int taskID   );
void dummy(void);

void main(void)
{
  add_data(1, 1000, dummy, 0);
  while(1){;}
  //return 0;
}

void add_data(unsigned char setMode, unsigned int setCounter,
              void (*setCallback)(void), unsigned int taskID   )
{   
  /* Check if there's an element in the list         */
  if(anfang == NULL) 
  {
    /* Allocate storage space for the structur       */
    /* for the first element in the list             */
    if((anfang = (struct osTask *)malloc(sizeof(struct osTask))) == NULL) 
    {
       //memoryerror
       return;
    }
    anfang->uiPeriod   = setCounter;
    anfang->uiActCount = setCounter;  
    anfang->ucMode     = setMode;
    anfang->Callback   = setCallback;
    anfang->uiId       = taskID;
    anfang->next       = NULL; //Mark this entry as the start of the list
  }
}
void dummy (void)
{
 ; //tu was
}

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??
    if((anfang = (struct osTask *)malloc(sizeof(struct osTask))) == NULL) 
    {
       //memoryerror
       return;
    }

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

Ich habs auch mit dem in Dev-C++ integrierten Compiler compiliert, mit 
Erfolg.
Dort ist es wie folg deklariert:
 _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ß

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Martin Thomas (mthomas) (Moderator) Benutzerseite
Datum:

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

Autor: taunus (Gast)
Datum:

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

Autor: Felix Bonjour (e-b)
Datum:
Angehängte Dateien:

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

Autor: Stefan (Gast)
Datum:

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

Autor: Omar Jarid (Gast)
Datum:

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

regards from MEX

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.