Forum: Compiler & IDEs flex fuer Mikrocontroller


von Olaf (Gast)


Lesenswert?

Moin Leute,

Ich haette gerne einen Parser der auf einem Microcontroller laufen soll. 
Klar koennte ich selber schreiben, aber ich dachte zuerst daran es mit 
flex zu machen. Erstmal kein problem, aber leider benutzt flex malloc 
und ich moechte keinen heap auf dem Controller haben.

Kennt jemand sowas wie flex das ohne malloc auskommt?

Ich hab mir gerade auf die schnelle mal sowas zusammengehackt:

unsigned char buff_92[92];
unsigned char buff_36[36];
unsigned char buff_48[48];
unsigned char buff_4[4];

void *yyalloc (yy_size_t  size , yyscan_t yyscanner)
{

  switch (size)
    {
    case 92 :  return (void*) buff_92; break;
    case 36 :  return (void*) buff_36; break;
    case 48 :  return (void*) buff_48; break;
    case 4 :  return (void*) buff_4; break;

    default:
      printf("ACHTUNG NEUE MALLOC SIZE: yyalloc size: %i\n",size);
      return (void *) malloc( size );
    }
}

Das laeuft jetzt zu testzwecken ohne malloc auf meinem Hostsystem, 
allerdings ist es ja irgendwie oehm.. unschoen. :-)

olaf

von Carl D. (jcw2)


Lesenswert?

Und wenn flex 2 mal einen 4er Block braucht?
Wenn man nur "statische" Puffer vorher nicht bekannter Größe braucht, 
dann hat man mit malloc() kein Problem. Ständiges malloc()/free() mit 
variabler Größe ist eher ein Problem.
Zudem kannst du ja in yyalloc()/yyfree() mitschreiben, ob der flex sich 
da brav verhält.

: Bearbeitet durch User
von Olaf (Gast)


Lesenswert?

Okay, mir ist inzwischen selber aufgefallen das mein erster Ansatz Mist 
war.

Ich hab mir jetzt ein eigenes kleines Malloc geschrieben das auf einem 
festen Speicherblock arbeitet der jedesmal freigegeben wird. Das klappt 
bei mir ganz gut weil ich immer nur eine einzelne Zeile parse.

Im Test funktioniert es jetzt ganz gut.

Olaf

von Murkser (Gast)


Lesenswert?


von Carl D. (jcw2)


Lesenswert?

@Olaf: laß dich bloß hier nicht mit flex/bison erwischen. Einigen hier 
ist schon ein C-Compiler suspekt. Und dann noch diese Tools aus der 
shell-Welt. Hexenwerk!
 ;-)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Hier sind ein paar Vorschläge, falls du das noch nicht gelesen haben
solltest:

  http://stackoverflow.com/questions/2245962/is-there-an-alternative-for-flex-bison-that-is-usable-on-8-bit-embedded-systems

von Lach (Gast)


Lesenswert?

Mit ner FLex mach ich aber was anderes:
http://www.flex-tools.com/de/index.php
duck und weg

von Olaf (Gast)


Lesenswert?

> Und dann noch diese Tools aus der shell-Welt. Hexenwerk!

Aber dann sollten die dazulernen. Mittlerweile erreichen Mikrocontroller 
ja eine Leistungsklasse wo man solche Tools gut einsetzen kann.

Ich hab es jetzt laufen. Hat mein Programm um 20kB vergroessert und 
braucht etwa 1k Ram. Aber dafuer hab ich jetzt eine wunderbare 
Serviceshell im Programm mit der ich zur Laufzeit alles moegliche 
abfragen und beeinflussen kann ohne das ich mir fuer jeden neuen Befehl 
gross einen abbrechen muss.

Damit habe ich es nun geloest:

#define MALLOCSIZE 300
unsigned char mallbuff[MALLOCSIZE];
static unsigned mallpos=0;

/*********************************************************************** 
**/
/* 
*/
/* Meine eigene Mallocfunktion. 
*/
/* 
*/
/*********************************************************************** 
**/
void *mymalloc(yy_size_t  size)
{ unsigned char *returnvalue;

  if ((mallpos + size) > MALLOCSIZE)
    {
      PRINTF("Ich habe nicht genug Speicher fuer %iBytes\n",size);
      return(0);
    }

  returnvalue = mallbuff + mallpos;
  mallpos = mallpos+size;
  return( returnvalue);

}

void yyfree (void * ptr , yyscan_t yyscanner)
{
  mallpos=0;
}

Das ist nicht ganz sauber weil natuerlich immer alles auf einmal 
freigegeben wird. Aber fuer flex scheint es zu reichen weil das Programm 
immer nur einmal zu beginn Speicher anfordert.

Olaf

von Carl D. (jcw2)


Lesenswert?

Olaf schrieb:
>> Und dann noch diese Tools aus der shell-Welt. Hexenwerk!
>
> Aber dann sollten die dazulernen.

Zum dazulernen sind Die schon viel zu modern unterwegs.

von Olaf (Gast)


Lesenswert?

> Zum dazulernen sind Die schon viel zu modern unterwegs.

Oh Gott! Du meinst in.... aeh... Bielefeld? <schluck>

Olaf

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


Lesenswert?

Olaf schrieb:
> und ich moechte keinen heap auf dem Controller haben.

Stattdessen eine Selbst-Frickel-Lösung mit neuen, eigenen Bugs?

Mach mal.

Flex und byacc habe ich schon vor 10 Jahren auf'm AVR laufen lassen.
Irgendwo müsste es noch die Patches geben, um den ganzen Tabellensalat
in den Flash zu bekommen, denn dafür will man natürlich keinen RAM
verplempern.

von Olaf (Gast)


Lesenswert?

> Irgendwo müsste es noch die Patches geben, um den ganzen Tabellensalat
> in den Flash zu bekommen, denn dafür will man natürlich keinen RAM
> verplempern.

Ist das eine AVR-Typische Besonderheit? Wie gesagt, bei mir braucht das 
1kRam und das sind im Prinzip fast alles Buffer. Ich hatte mir da auch 
erst leichte Sorgen gemacht. Ich wuerde sogar sagen wenn ich da nochmal 
genau drueber schaue koennte ich vermutlich noch auf 500Byte runter 
kommen. Ich hab das derzeit nach dem Prinzip Augenmass plus grosszuegige 
Reserve dimensioniert. Aber heute hat man ja immer 10-20k Ram im 
Controller. Da muss man sich nicht mehr den Arsch unnoetig aufreissen. 
.-)

Olaf

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


Lesenswert?

Olaf schrieb:
>> Irgendwo müsste es noch die Patches geben, um den ganzen Tabellensalat
>> in den Flash zu bekommen, denn dafür will man natürlich keinen RAM
>> verplempern.
>
> Ist das eine AVR-Typische Besonderheit?

Ja, hängt mit der Harvard-Architektur zusammen, wodurch man für den
Datenzugriff aus dem Flash separate Befehle braucht.

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.