www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik avrlib netstack und CodeVision


Autor: Thomas S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich experimentiere gerade mit dem ENC28J60 und CodeVision. Deshalb
versuche ich, den avrlib netstack zum Laufen zu bringen. Die ENC
Unterstützung läuft soweit, aber bei der Anpassung der Netzwerk-Library
scheitere ich an Folgendem:

CodeVision unterstützt leider __attribute__((packed)) nicht. Das wird
aber bei der Struktur-Definition der Ethernet-Header in net.h verwendet
(GNUC_PACKED). Wenn ich das Attribut weglasse, bekomme ich beim
Compilieren der net.c in der Funktion netChecksum den Fehler "pointed
object size is unknown" dort wo die Pointer-Position erhöht wird. Hier
mal der Source dieser Funktion:

uint16_t netChecksum(void *data, uint16_t len)
{
    register uint32_t sum = 0;

    for (;;) {
        if (len < 2)
            break;
    sum += *((uint16_t *)data);
        data += 2;    // hier...
        len -= 2;
    }
    if (len)
        sum += *(uint8_t *) data;

    while ((len = (uint16_t) (sum >> 16)) != 0)
        sum = (uint16_t) sum + len;

    return (uint16_t) sum ^ 0xFFFF;
}

------------

Gibt es eine Möglichkeit, das Ganze ohne Packed-Attribut zum laufen zu
bekommen? Ich hoffe, die Frage ist nicht allzu doof - ich weiß zwar
einigermaßen, was Pointer sind und machen, aber dieses Problem ist mir
(noch?) zu hoch...

Vielen Dank,

Thomas

Autor: Thomas S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, etwas weiter bin ich - wenn man (int *) sum += 2; benutzt, läuft
es. Leider ist aber die ICMP Header Checksum eines Ping Replys trotzdem
falsch. Hat das evtl. doch was mit dem fehlenden packed-Attribut zu tun?
Der Header ist ansonsten korrekt, insofern scheint der Zugriff auf die
Struktur so nicht zu funktionieren. Hat jemand diesbezüglich
Erfahrungen mit CodeVision?

Weiterhin für jeden Tip dankbar,

Thomas

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist ein rel. spezielles Problem. Mail doch mal an Pavel Haiduc,
normalerweise kommt da sehr schnell eine Reaktion/Lösung (und dann ein
Compiler-Update für alle :-)

Autor: Thomas S (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hab die Lösung jetzt gefunden: Anscheinend wird beim Erhöhen eines
int-Pointers die Position auch immer gleich um 16 bit verschoben,
weshalb bei der Berechnung der Checksumme immer 2 Byte benutzt, dann 2
Bytes übersprungen wurden. Also Pointer einfach nur um 1 erhöhen, und
alles ist gut :-)

Jetzt stimmen die Checksummen, ab dem 2. Ping-Reply ist allerdings die
IP-Identification falsch, also nächstes Problem suchen... :-)

Thomas

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.