mikrocontroller.net

Forum: Compiler & IDEs uIP Statemachine


Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Josef Kaeufl (josefk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier noch ein Bild, dass den Mitschnitt mit Wireshark anzeigt.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Josef Kaeufl (josefk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habs mal angehängt und auf das "Nötigste" gekürzt. :)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm. Scheint an dem AtmegaDos zu liegen. Sobald ich das weglasse 
funktioniert alles einwandfrei. Nur was daran stört?

Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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....

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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ß

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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????

Autor: Josef Kaeufl (josefk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe dazu mal einen neuen Thread aufgemacht:

Beitrag "externen RAM testen"

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.