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?
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
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
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
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...
Beim internen Flash schreiben haben mir folgende Links weitergeholfen:
http://www.atmel.com/dyn/products/tools_card_v2.asp?tool_id=4343Beitrag "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
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
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
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
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.