Forum: Mikrocontroller und Digitale Elektronik LwIP und FreeRTOS RAM


von Kilian (Gast)


Lesenswert?

Hallo zusammen

Hat jemand schon Erfahrung mit dem LwIP und FreeRTOS?

Ich habe auf der FreeRTOS ein tolles Beispiel gefunden:
http://www.freertos.org/index.html?http://www.freertos.org/portsam7xlwIP.html

Das ganze hat auch relativ gut funktioniert. Ich habe das UDP, Telnet 
und natürlich auch den Dynamischen Webserver am laufen. Doch ich habe 
nun gemerkt, dass das RAM meines Mikrocontroller (AT91SAM7x256) voll 
ist.
Der LwIP benötigt ja einiges, so ca 30k, doch da kann man kaum was 
ändern..? Da wollte ich mal nachschauen welche Funktionen sonst noch 
mein Ram füllen... Mit erschrecken habe ich festgestellt, dass das 
FreeRTOS mit der HEAP2 schon 20k füllt. Wenn ich die Heap jedoch einfach 
verkleinere, dann läuft mein Programm nicht mehr. Kann ich irgendwie 
herausfinden, wie gross ich diese Heap machen muss? Ich habe einfach 
keine Ahnung wiso diese Heap so gross sein soll....

Ich habe nur diese Tasks:

//Webserver
  sys_thread_new( vBasicWEBServer, ( void * ) NULL, 
mainWEBSERVER_PRIORITY );
  //UDP
  sys_thread_new( vUDP, ( void * ) NULL, mainWEBSERVER_PRIORITY );
  //Telnet
  sys_thread_new( vTelnet, ( void * ) NULL, mainWEBSERVER_PRIORITY );
  //Reset Task
   xTaskCreate( vReset_net_conf, ( signed char * ) 
"reset_net_conf",configMINIMAL_STACK_SIZE, NULL, mainreset_PRIORITY, 
NULL );

Hat irgendwer eine Idee?

von Kilian (Gast)


Lesenswert?

Hat wirklich niemand Erfahrung mit der Heap des FreeRTOS?

von Thomas S. (Firma: S.) (tschrein)


Lesenswert?

Hallo Kilian,

ich arbeite gerade recht intensiv mit FreeRtos und Lwip für einen 
Auftrag; ich hab auch die Beispiele aus der FreeRtos-Homepage benutzt 
und hab jetzt ne Kombination aus Freertos V5.0.2 und LwIP 1.1 laufen.
Neben den Demo-Applications Webserver+USB+Standard-Demo hab ich nen 
Email-Client implementiert. Der Code liegt bei 123Kb, der Ram geht bis 
fd90, also knapp unter 64k.
Der Heap_2 ist auf 5604H definiert (unverändert aus den Demos)

Hab allerdings noch keinerlei Gedanken an den RAM-Verbrauch 
verschwendet. Lediglich als ich 3kByte (oder sind es 32bit Cells ?) 
Stack für meine Emailtask von FreeRtos wollte, merkte ich, dass der 
SAM7X256 nicht beliebig Speicher hat.

Warum hast Du alles im Ram ? Dann wird es wohl eng. Verschiedene Tasks 
und Lwip verbrauchen schon ne Menge Ram; aufgeteilt auf Flash und Ram 
wirds aber recht komfortabel.

Gruß
Thomas

von Kilian (Gast)


Lesenswert?

Hallo Thomas

Das ist mit leider auch nicht klar, warum bei mir alles im RAM liegt. 
Der beispieltask des Webservers benötigt bei mir mindestens 3kb in der 
heap. Denn nach meiner Meinung sollten die verschiedenen Tasks kaum 
Platz auf der heap benötigen. Laut der taskdeklaration des lwip ca. 600 
byte. Ich habe ja die "dynamische Website" mit einer static Variable 
definiert. Ich dachte es sollte eigentlich möglich sein diese heap 
relativ klein zu halten (kleiner als 10kB) ich muss sie jedoch auf 20kB 
einstellen, sonst stürzt mein Controller beim aufrufen der Website ab.
Oder hat er vielleicht Probleme, weil ich den webservertask kopiert 
habe? Er läuft nun einmal als Webserver, einmal als Telnetserver und 
einmal als UDP-Task.

Ich nehme nun mal an, dass du nur einen solchen Task hast...

Ich bin im Moment auch noch daran einen xml-Parser zu schreiben, der 
dann natürlich auch nochmals Speicher im RAM braucht. Doch ich habe nur 
noch wenige Bytes RAM frei. Wie viel RAM hast du noch frei?

Gruß
Kilian

von Kilian (Gast)


Lesenswert?

Also ich habe so das Gefühl, dass jeder Task auf der heap landet. Kannst 
du dies bestätigen?
Gruß
Kilian

von Thomas S. (Firma: S.) (tschrein)


Lesenswert?

Ich nehme an, dass FRtos für jede Task den Stack aus dem Heap bedient, 
müsste man mal im System-Code nachschauen.

Also bei meiner Beispiel-App. ist der Ram ziemlich voll, fd90h ist 
irgendwas mit 64k ! Muss also auch demnächst Platz machen. Das Programm 
liegt hier aber im Flash; ich bin aber sehr großzügig mit dem Stack 
umgegangen; der webserver im Demo zeigt ja die Stackbenutzung, da ist 
noch einigen an Luft.

Wie generierst Du Dein Image; Ich hab Gcc unter Eclipse am laufen und 
daran den USB-JTag Adapter von Olimex, das alles unter WinXp.
Mein Board ist das SAM7-EX256 von Olimex.

Thomas

von Kilian (Gast)


Lesenswert?

Genau, die große Ausnutzung war bei mir ziemlich sofort ein großes 
Problem. Ich schreibe die Netzwerkkonfigurationen in den Flash und Lade 
sie auch wieder nach einem reset daraus. So kann ich meine IP und co. 
ändern. Dieses Zeugs muss halt teils im RAM  liegen, da ich ja in den 
Flash schreibe. Damals bin ich schon darauf gekommen, dass ich die heap 
verkleinern muss. Denn das LwIP benötigt ja schon seeehr viel RAM.

Ich muss mich wahrscheinlich wirklich noch tief in das FreeRTOS 
einlesen, um zu sehen ob die Tasks wirklich auf der heap landen und 
somit auf dem RAM. Speziell interessant ist da natürlich auch der 
relativ große static-Buffer für die website. Wenn dieser nochmals auf 
der heap landet benötige ich nur schon dafür 2*2048byte... Oder ich 
mache alles auf normal und nicht mehr static. Doch am liebsten Ware mir 
so ein Flag wie z.B. Lade alle laufenden Tasks in heap...

von Kilian (Gast)


Lesenswert?

Also ich arbeite mit at91sam7x255-ek, mit GCC und Eclipse. Herunterladen 
tue ich mit dem Samba-Tool und JTAG von Atmel.

Gruß Kilian

von Thomas S. (Firma: S.) (tschrein)


Lesenswert?

Wie machst Du das, mit dem in den Flash schreiben ?
Könnte ich davon den Quellkode bekommen ?

Gruß
Thomas

von Kilian (Gast)


Lesenswert?

Beim internen Flash schreiben haben mir folgende Links weitergeholfen:
http://www.atmel.com/dyn/products/tools_card_v2.asp?tool_id=4343
Beitrag "ATMEL Sam7 EFC Schreibprobleme"

Es gibt eine Beispielapplikation von Atmel um ins interne Flash zu 
schreiben.
Um diese Flash Funktionen aus der AT91Lib mit dem FreeRTOS und lwip zum 
laufen zu bekommen, muss man ein paar sachen anpassen:

Das neuere AT91SAM7x256.h vom AT91Lib Package verwenden und folgende 
zeilen ergänzen:
#define AT91F_AIC_ConfigureIt( irq_id, priority, src_type, newHandler )
{
    unsigned int mask ;
    mask = 0x1 << irq_id;
    /* Disable the interrupt on the interrupt controller */
    AT91C_BASE_AIC->AIC_IDCR = mask ;
    /* Save the interrupt handler routine pointer and the interrupt 
priority */
    AT91C_BASE_AIC->AIC_SVR[irq_id] = (unsigned int) newHandler ;
    /* Store the Source Mode Register */
    AT91C_BASE_AIC->AIC_SMR[irq_id] = src_type | priority  ;
    /* Clear the interrupt on the interrupt controller */
    AT91C_BASE_AIC->AIC_ICCR = mask ;
}

board.h von LwIP/FreeRTOS verwenden und folgende defines setzen:
#define at91sam7x256
#define BOARD_FLASH_EFC
#define flash
#define EFC_NO_SECURITY_BIT

am ende des board.h noch
#define BOARD_MCK MCK  // MCK for Flash lib

und nat. alle lib *.c files fürs flash einbinden.
Das schreiben selbst ist Demo prog von Atmel zu finden.
jedoch wird das ganze beim Olimex ein wenig anders sein mit den headern.

Grüsse
Kilian

von Kilian B. (kilian)


Lesenswert?

Hat es funktioniert? Ich weiß es ist ein bisschen ein Kampf, da man die 
Header ändern muss. Leider haben die freertos Leute mit den alten 
Atmel-libs gearbeitet...
Gruss

von Thomas S. (Firma: S.) (tschrein)


Lesenswert?

Hab's noch nicht probiert.
Muss die nächten Tage erst mal nen AD-Wandler anhängen und verschiedene 
sonstige HW zu Laufen bringen, bevor ich wieder SW mache.

Kann 2-3 Wochen gehen, bis ich am Flash weiter mache. Ich gebe aber dann 
Bescheid.

Gruß und Danke
Thomas

von Kilian B. (kilian)


Lesenswert?

Ok, kein problem.
Hast du schon was herausgefunden bezüglich RAM? Oder kannst du immerhin 
meine Befürchtung bestätigen, dass alle Tasks auf den heap kopiert 
werden?

Mit der heap1 Konfiguration sollte dies ja nicht mehr sein. Doch leider 
habe ich dazu noch nichts schlaues gefunden... Also so ein 
Beispiel/Anleitung wie man diese ändert...

Gruß
Kilian

von cee (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich bin auch gerade ein bisschen am kämpfen mit FreeRTOS. An den 
Webserver und Co. konnte ich mich noch nicht ranmachen. Aber Probleme 
mit dem Heap hatte ich auch schon. Ich habe ein nützliches paper von 
Rich Goyette gefunden. Darin ist gut beschrieben, dass alle Tasks ihren 
Speicherplatz (Stack und TCB) vom heap nehmen. Nur wenn sie gelöscht 
werden, geben sie ihren Speicherplatz frei. Dabei kommt es aber noch auf 
die verwendete heap_x.c datei an, was danach mit dem freien Speicher 
passiert. Ich habe mit den verschiedenen heap_[1..3].c gespielt. Aber am 
meisten Erfolg hatte ich mit heap_2.c.

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.