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
Also ich habe so das Gefühl, dass jeder Task auf der heap landet. Kannst du dies bestätigen? 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...
Also ich arbeite mit at91sam7x255-ek, mit GCC und Eclipse. Herunterladen tue ich mit dem Samba-Tool und JTAG von Atmel. Gruß Kilian
Wie machst Du das, mit dem in den Flash schreiben ? Könnte ich davon den Quellkode bekommen ? Gruß Thomas
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.