MSP430 uIP Port
Allgemeines
Der uIP ist ein TCP/IP Stack von Adam Dunkels für kleine Mikrocontroller. Der Stack kommt mit weniger als 10k ROM und 1k RAM aus. Dieses Stück Software stellt ein Meisterwerk an Kompaktheit in Verbindung Lesbarkeit und Norm-Konformität dar. Er ermöglicht Webserver, E-Mail Clients und andere Anwendungen auf kleinste Controller zu portieren. Mit der zunehmenden Verfügbarkeit der allgegenwärtigen Ethernet-Schnittstelle eröffnet die Lösung eine interessante Perspektiven für neue Ideen.
Zum Port
Als Basis für wurden die Originalquellen von Adam Dunkels (uIP 1.0) und der Port des uIP 0.9 von Paul Curtis genommen. Als Hardwareplattform kam EasyWeb3 von Olimex zum Einsatz. Das Programm sollte auch auf dem EasyWeb2 laufen. Zunächst wurde die Portierung mit CrossWorks der Fa. Rowley gestartet. Die hier verfügbaren Quellen sind sowohl mit dem CrossWorks Compiler als auch mit der MSPGCC Toolchain compilierbar (#define MSPGCC, #define ROWLEY).
Bei der Portierung sind Grenzen des Rowley Compilers aufgefallen:
- Maximale Verschachtelungstiefe von 10 Inklude-Dateien
- Bei der Verknüpfung von send_data() & data_acked() wurden nicht immer beide Routinen aufgerufen (lt. Dunkels "tricky").
Erstaunlicherweise enthielt DIE Beispiels-Applikationen Webserver ein paar triviale Fehler. Siehe dazu auch die Readme-Datei sowie das patch-Verzeichnis.
Die nicht getesteten und überflüssigen Quellen habe ich entfernt, um Verwirrungen zu vermeiden. Auch die HTML Dokumentation ist im Download nicht dabei. Bei Bedarf bitte die Originale von Adam Dunkels verwenden.
Zu den Compilern
Zunächst misstraute ich der GCC Toolchain und verwendete die Rowley Software. Dieses Tool ist angenehm, schnell, handlich und stabil. Insbesondere der Debugger gefiel mir. Nach der Behebung der Fehler konnten die Quellen ohne weitere Anpassungen (Ausnahme: Schreibweise ISR Routine) mit der MSPGCC Toolchain compiliert werden. Die Applikation lief sofort. Auch der Platzbedarf der Compilate ist vergleichbar:
Rowley MSPGCC Rowley MSPGCC (Bytes) (Bytes) (Addr) (Addr) (Addr) (Addr) clock.c 20 22 305a 306e 335e 3374 c8900a.c 720 690 306e 333e 3374 3626 main.c 348 270 333e 349a 3626 3734 psock.c 760 694 1100 13f8 3734 39ea timer.c 60 58 13f8 1434 39ea 3a24 uip_arp.c 934 1054 21e8 258e 3a24 3e42 uip.c 3508 3382 1434 21e8 3e42 4b78 httpd.c 1906 1606 28e8 305a 4b78 51be httpd-cgi.c 630 602 258e 2804 51be 5418 httpd-fs 228 262 2804 28e8 5418 551e libc 1750 2236 349a 3b70 2aa2 335e total 10864 10876
Fazit
Dieser Port zeigt, dass dieser TCP/IP Stack auf dem MSP430 einsetzbar ist. Der ROM-Bedarf ist mit unter 10k erträglich. Der RAM-Bedarf ist schon eher schmerzhaft. Aber immerhin ist noch soviel Platz vorhanden, dass sinnvolle Applikationen umsetzbar sind. Die bekanntermaßen effiziente MSP430 Hardware mit ihren sehr guten analogen Eigenschaften und der brillianten Peripherie kommt gut mit den Anforderungen zurecht. Besonderer Dank gilt Adam Dunkels, der sein Werk für nicht-kommerzielle und kommerzielle Anwendungen freigegeben hat (siehe Copyright Vermerk in den Quellen).