Datum: 02.05.2008 12:01
Hallo zusammen, ich habe eine kleine Frage zum uIP Stack bzw zu dessen Nutzung. Ich habe gerade versucht, nach dem Beispiel von Simon Kuepers, einen kleinen Webserver in Betrieb zu nehmen. Hierzu meine Funktionen, die hier evtl interessant sind:
void eth_listen(void) { eth_flag = 0; uip_listen(HTONS(500)); uip_listen(HTONS(80)); } |
void statemachine(void) { if (uip_connected()) { rs232_puts("statemachine connected"); eth_flag = uipflag_connected; } else if (uip_newdata() || uip_acked()) { rs232_puts("statemachine new ack"); switch(uip_conn->lport) { case HTONS(500): irgendwasanderes(uip_appdata); break; case HTONS(80): http_server(uip_appdata); break; default: break; } } else if (uip_rexmit()) { rs232_puts("statemachine rexmit"); //schau ma mal später uip_abort(); } } |
Doch leider gelange ich nie in die zweite Bedingung der Statemachine. Weder "acked" noch "newdata" treten ein. Sobald ich von Seiten des PCs eine GET Anfrage auf den µC schicke, komme ich in die erste Bedinung, danach sendet der PC nur noch "[TCP] Rtransmission] GET / HHTP/1.1". Wenn ich mir mal uip_appdata ausgeben lasse, sobald ich ein "connected" habe, ist das nur ein String mit '\0' beginnend. Was mach ich da falsch? Das sollte doch prinzipiell funktionieren, oder?
Datum: 02.05.2008 14:35
Hier noch ein Bild, dass den Mitschnitt mit Wireshark anzeigt.
Datum: 02.05.2008 14:44
Ich kann im Moment leider keinen Grund dafür sehen, warum es nicht funktionieren sollte, um ehrlich zu sein. Kannst du das ganze Projekt mal anhängen? Rufst du "eth_listen()" auch irgendwo auf?
Datum: 02.05.2008 15:00
Habs mal angehängt und auf das "Nötigste" gekürzt. :)
Datum: 02.05.2008 15:35
Uff! Ich dachte du hättest erstmal nur probiert den ganzen Ethernet-Krams in einem eigenen Projekt auf Funktion zu testen. Das macht die Sache ja um einiges komplizierter, da man nicht weiß ob ein anderer Code-Teil das Problem auftauchen lässt.
Datum: 02.05.2008 15:47
Aber eiegtnlcih sollte da ja sonst nix passieren. Kann es sein, dass ich zu wenig Ram über habe für den Stack? Hab nen AT90CAN128 und meine Prog. erzeugt das:
main.elf : section size addr .data 2140 8388864 .text 78872 0 .bss 3115 8391004 .eeprom 65 8454144 .stab 59388 0 .stabstr 31497 0 .debug_aranges 180 0 .debug_pubnames 2334 0 .debug_info 10873 0 .debug_abbrev 2870 0 .debug_line 8509 0 .debug_str 2510 0 .debug_ranges 92 0 Total 202445 |
Zu Meiner Verteidigung muss ich sagen, dass ich 32k externen Ram habe, den ich hoffentlich mit
# 32 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x808fff |
anspreche.
Datum: 05.05.2008 14:20
Hmm. Scheint an dem AtmegaDos zu liegen. Sobald ich das weglasse funktioniert alles einwandfrei. Nur was daran stört?
Datum: 05.05.2008 14:41
Also es liegt am RAM. Sobald ich über den internen RAM voll hab, geht nix mehr. Wie gesagt, ich habe meinen externen RAM mit
# 32 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x808fff |
versucht in mein Projekt einzubinden. Anscheinend geht das nicht. Da muss ich wohl suchen wie man das richtig macht....
Datum: 05.05.2008 14:58
Hast du das externe Speicherinterface dann auch eingeschaltet? Das kann man afaik in irgendeiner init section beim startup mitmachen lassen. 100%ig weiß ich das auch nicht mehr. Gruß
Datum: 05.05.2008 15:23
Thorsten wrote: > Das kann man afaik in irgendeiner init section beim startup mitmachen > lassen. Musst du sogar, soweit ich das weiß. Schau mal hier: http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...
Datum: 06.05.2008 09:49
Ahh danke. Habe das auf Rat so gemacht:
;; begin xram.S ;; Aktivierung des externen Memeory-Interfaces #include <avr/io.h> .section .init1,"ax",@progbits ;; entspricht XMCRA = ((1<<SRL2) | (1<<SRW11) | (1<<SRW10) | (1<<SRE)); ldi r16,_BV(SRE) | _BV(SRW10) | _BV(SRW11) | _BV(SRL2) sts XMCRA,r16 ;; end xram.S |
und dann diese xram.s noch in das makefile eingebunden. Zusätzlich ist obige Option
# 32 KB of external RAM, starting after internal RAM (ATmega128!), # used for variables (.data/.bss) and heap (malloc()). EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x808fff |
geblieben. Nun sollte ich mit malloc() problemlos Speicher reserverien können, der außerhalb meines internen Speicherbereiches liegt. Leider funktioniert das nicht so wie gewünscht. Laut Datasheet sehen die obigen Konfigurationen aber vernünftig aus. Die Konfiguratin hier http://www.nongnu.org/avr-libc/user-manual/FAQ.htm... sieht zwar anders aus, scheint aber für den AT90CAN128 nicht vernünftig, da das MCUCR Register keine SRE oder SRW Flags hat ;) Was ist noch falsch????
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel
